1. 程式人生 > >java基礎-中級(四)【IO流與檔案】

java基礎-中級(四)【IO流與檔案】

4、IO流與檔案

IO流:在Java API中,可以從其中讀取一個位元組序列的物件稱作輸入流,向其中寫入一個位元組序列的物件叫做輸出流。

抽象類InputStream和OutputStream構成了輸入/輸出(I/O)的位元組基礎類,Reader和Writer抽象類構成字元的輸入輸出流。

 檔案:IO流對檔案進行讀取,但是檔案本身的操作需要有自己的類,File和Path類就是檔案操作的基本類。

4.1 IO流的劃分

IO流基本劃分如下圖所示。

(1)InputStream類

InputStream類是位元組輸入流的基類,下面是該類的基本方法:

返回型別 方法
int available()

返回從該輸入流中可以讀取(或跳過)的位元組數的估計值,而不會被下一次呼叫此輸入流的方法阻塞。

void close()

關閉此輸入流並釋放與流相關聯的任何系統資源。

void mark(int readlimit)

標記此輸入流中的當前位置。

boolean markSupported()

測試這個輸入流是否支援 markreset方法。

abstract int
read()

從輸入流讀取資料的下一個位元組。

int read(byte[] b)

從輸入流讀取一些位元組數,並將它們儲存到緩衝區 b

int read(byte[] b, int off, int len)

從輸入流讀取最多 len位元組的資料到一個位元組陣列。

void reset()

將此流重新定位到上次在此輸入流上呼叫 mark方法時的位置。

long skip(long n)

跳過並丟棄來自此輸入流的 n位元組資料。

例如,FileInputStream繼承InputStream,該流用於從檔案讀取資料,它的物件可以用關鍵字 new 來建立。有多種構造方法可用來建立物件。

可以使用字串型別的檔名來建立一個輸入流物件來讀取檔案:

InputStream f = new FileInputStream("C:/java/hello");

(2)OutputStream類

這個抽象類是表示位元組輸出流的所有類的超類。 輸出流接收輸出位元組並將其傳送到某個接收器。

返回 方法名
void close()

關閉此輸出流並釋放與此流相關聯的任何系統資源。

void flush()

重新整理此輸出流並強制任何緩衝的輸出位元組被寫出。

void write(byte[] b)

b.length位元組從指定的位元組陣列寫入此輸出流。

void write(byte[] b, int off, int len)

從指定的位元組陣列寫入 len個位元組,從偏移 off開始輸出到此輸出流。

abstract void write(int b)

將指定的位元組寫入此輸出流。

(3)Writer類

用於寫入字元流的抽象類。 子類必須實現的唯一方法是write(char [],int,int),flush()和close()。 然而,大多數子類將覆蓋這裡定義的一些方法,以便提供更高的效率,附加的功能或兩者。

返回型別 方法名稱
Writer append(char c)

將指定的字元附加到此作者。

Writer append(CharSequence csq)

將指定的字元序列附加到此作者。

Writer append(CharSequence csq, int start, int end)

將指定字元序列的子序列附加到此作者。

abstract void close()

關閉流,先重新整理。

abstract void flush()

重新整理流。

void write(char[] cbuf)

寫入一個字元陣列。

abstract void write(char[] cbuf, int off, int len)

寫入字元陣列的一部分。

 

引數:

cbuf - cbuf陣列

off - 從中開始編寫字元的偏移量

len - 要寫入的 len

void write(int c)

寫一個字元

void write(String str)

寫一個字串

void write(String str, int off, int len)

寫一個字串的一部分。

(4)Reader類

用於讀取字元流的抽象類。 子類必須實現的唯一方法是read(char [],int,int)和close()。 然而,大多數子類將覆蓋這裡定義的一些方法,以便提供更高的效率,附加的功能或兩者。

返回型別 方法名稱
abstract void close()

關閉流並釋放與之相關聯的任何系統資源。

void mark(int readAheadLimit)

標記流中的當前位置。

boolean markSupported()

告訴這個流是否支援mark()操作。

int read()

讀一個字元

int read(char[] cbuf)

將字元讀入陣列。

abstract int read(char[] cbuf, int off, int len)

將字元讀入陣列的一部分。

int read(CharBuffer target)

嘗試將字元讀入指定的字元緩衝區。

boolean ready()

告訴這個流是否準備好被讀取。

void reset()

重置流。

long skip(long n)

跳過字元

4.2 檔案的操作類File

Java檔案類以抽象的方式代表檔名和目錄路徑名。該類主要用於檔案和目錄的建立、檔案的查詢和檔案的刪除等。

建立File物件的方式:

通過給定的父抽象路徑名和子路徑名字串建立一個新的File例項。

File(File parent, String child);

通過將給定路徑名字串轉換成抽象路徑名來建立一個新 File 例項。

File(String pathname) 

根據 parent 路徑名字串和 child 路徑名字串建立一個新 File 例項。

File(String parent, String child) 

通過將給定的 file: URI 轉換成一個抽象路徑名來建立一個新的 File 例項。

File(URI uri) 

建立File物件成功後,可以使用以下列表中的方法操作檔案。

序號 方法描述
1 public String getName()
返回由此抽象路徑名錶示的檔案或目錄的名稱。
2 public String getParent()
 返回此抽象路徑名的父路徑名的路徑名字串,如果此路徑名沒有指定父目錄,則返回 null
3 public File getParentFile()
返回此抽象路徑名的父路徑名的抽象路徑名,如果此路徑名沒有指定父目錄,則返回 null
4 public String getPath()
將此抽象路徑名轉換為一個路徑名字串。
5 public boolean isAbsolute()
測試此抽象路徑名是否為絕對路徑名。
6 public String getAbsolutePath()
返回抽象路徑名的絕對路徑名字串。
7 public boolean canRead()
測試應用程式是否可以讀取此抽象路徑名錶示的檔案。
8 public boolean canWrite()
測試應用程式是否可以修改此抽象路徑名錶示的檔案。
9 public boolean exists()
測試此抽象路徑名錶示的檔案或目錄是否存在。
10 public boolean isDirectory()
測試此抽象路徑名錶示的檔案是否是一個目錄。
11 public boolean isFile()
測試此抽象路徑名錶示的檔案是否是一個標準檔案。
12 public long lastModified()
返回此抽象路徑名錶示的檔案最後一次被修改的時間。
13 public long length()
返回由此抽象路徑名錶示的檔案的長度。
14 public boolean createNewFile() throws IOException
當且僅當不存在具有此抽象路徑名指定的名稱的檔案時,原子地建立由此抽象路徑名指定的一個新的空檔案。
15 public boolean delete()
 刪除此抽象路徑名錶示的檔案或目錄。
16 public void deleteOnExit()
在虛擬機器終止時,請求刪除此抽象路徑名錶示的檔案或目錄。
17 public String[] list()
返回由此抽象路徑名所表示的目錄中的檔案和目錄的名稱所組成字串陣列。
18 public String[] list(FilenameFilter filter)
返回由包含在目錄中的檔案和目錄的名稱所組成的字串陣列,這一目錄是通過滿足指定過濾器的抽象路徑名來表示的。
19 public File[] listFiles()
  返回一個抽象路徑名陣列,這些路徑名錶示此抽象路徑名所表示目錄中的檔案。
20 public File[] listFiles(FileFilter filter)
返回表示此抽象路徑名所表示目錄中的檔案和目錄的抽象路徑名陣列,這些路徑名滿足特定過濾器。
21 public boolean mkdir()
建立此抽象路徑名指定的目錄。
22 public boolean mkdirs()
建立此抽象路徑名指定的目錄,包括建立必需但不存在的父目錄。
23 public boolean renameTo(File dest)
 重新命名此抽象路徑名錶示的檔案。
24 public boolean setLastModified(long time)
設定由此抽象路徑名所指定的檔案或目錄的最後一次修改時間。
25 public boolean setReadOnly()
標記此抽象路徑名指定的檔案或目錄,以便只可對其進行讀操作。
26 public static File createTempFile(String prefix, String suffix, File directory) throws IOException
在指定目錄中建立一個新的空檔案,使用給定的字首和字尾字串生成其名稱。
27 public static File createTempFile(String prefix, String suffix) throws IOException
在預設臨時檔案目錄中建立一個空檔案,使用給定字首和字尾生成其名稱。
28 public int compareTo(File pathname)
按字母順序比較兩個抽象路徑名。
29 public int compareTo(Object o)
按字母順序比較抽象路徑名與給定物件。
30 public boolean equals(Object obj)
測試此抽象路徑名與給定物件是否相等。
31 public String toString()
 返回此抽象路徑名的路徑名字串。

以下是File檔案操作的例項:

import java.io.*;

public class FileTest {
    /**
     * 複製檔案
     * @throws IOException
     */
    public static void fileOperation()throws IOException {
        String pathName="F:/Test";
        if(!new File(pathName).isDirectory()){
            new File(pathName).mkdirs();
        }
        File fileIn = new File(pathName,"test.txt");
        File fileOut = new File(pathName,"test1.txt");
        //檔案不存在,建立
        if(!fileIn.exists()){
            fileIn.createNewFile();
        }
        if(!fileOut.exists()){
            fileOut.createNewFile();
        }
        FileInputStream fileInputStream =new FileInputStream(fileIn);
        FileOutputStream fileOutputStream = new FileOutputStream(fileOut);
        //位元組流轉換成字元流---InputStreamReader
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
        String temp =null;
        while ((temp = bufferedReader.readLine()) != null) {
            bufferedWriter.write(temp+"\r\n");
        }
        bufferedReader.close();
        bufferedReader.close();
    }

    public static void main(String[] args) {
        try {
            fileOperation();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}