天天看點

了解Java Stream,File,IO最常用的5個類之間的關系

1、File類

Java檔案類以抽象的方式代表檔案名和目錄路徑名。

該類主要用于檔案和目錄的建立、檔案的查找和檔案的删除等。

File對象代表磁盤中實際存在的檔案和目錄,通過建立File對象指定了我們操作的對象。

通過以下構造方法建立一個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) 
           

其他操作方法詳情參考:

https://www.runoob.com/java/java-file.html

2、FileWriter類

FileWriter 類從 OutputStreamWriter 類繼承而來。該類按字元向流中寫入資料。指定操作對象,并向對象按字元寫入資料。

可以通過以下幾種構造方法建立需要的對象:

在給出 File 對象的情況下構造一個 FileWriter 對象。

FileWriter(File file)
           

在給出 File 對象的情況下構造一個 FileWriter 對象。

FileWriter(File file, boolean append)
           

參數:

  • file:要寫入資料的 File 對象
  • append:如果 append 參數為 true,則将位元組寫入檔案末尾處,相當于追加資訊。如果 append 參數為 false,則寫入檔案開始處。

更較長的描述位址:https://www.runoob.com/java/java-filewriter.html

3、FileReader類

FileReader類從InputStreamReader類繼承而來。該類按字元讀取流中資料。

可以通過以下幾種構造方法建立需要的對象。

在給定從中讀取資料的 File 的情況下建立一個新 FileReader。

FileReader(File file)
           

在給定從中讀取資料的 FileDescriptor 的情況下建立一個新 FileReader。

FileReader(FileDescriptor fd) 
           

在給定從中讀取資料的檔案名的情況下建立一個新 FileReader。

FileReader(String fileName) 
           

詳細位址:

https://www.runoob.com/java/java-filereader.html

4、BufferedReader和BufferedWriter

為了提高字元流讀寫的效率,引入了緩沖機制,進行字元批量的讀寫,提高了單個字元讀寫的效率。BufferedReader用于加快讀取字元的速度,BufferedWriter用于加快寫入的速度

BufferedReader和BufferedWriter類各擁有8192個字元的緩沖區。當BufferedReader在讀取文本檔案時,會先盡量從檔案中讀入字元資料并放滿緩沖區,而之後若使用read()方法,會先從緩沖區中進行讀取。如果緩沖區資料不足,才會再從檔案中讀取,使用BufferedWriter時,寫入的資料并不會先輸出到目的地,而是先存儲至緩沖區中。如果緩沖區中的資料滿了,才會一次對目的地進行寫出。

BufferedReader

BufferedReader是為了提供讀的效率而設計的一個包裝類,它可以包裝字元流。可以從字元輸入流中讀取文本,緩沖各個字元,進而實作字元、數組和行的高效讀取。

構造方法

方法 描述

BufferedReader(Reader in) 建立一個使用預設大小輸入緩沖區的緩沖字元輸入流。

BufferedReader(Reader in, int sz) 建立一個使用指定大小輸入緩沖區的緩沖字元輸入流。

成員方法

方法 描述

int read() 讀取單個字元。

int read(char[] cbuf, int off, int len) 将字元讀入數組的某一部分。

String readLine() 讀取一個文本行。

long skip(long n) 跳過字元。

boolean ready() 判斷此流是否已準備好被讀取。

void close() 關閉該流并釋放與之關聯的所有資源。

void mark(int readAheadLimit) 标記流中的目前位置。

boolean markSupported() 判斷此流是否支援 mark() 操作(它一定支援)。

void reset() 将流重置到最新的标記。

讀取檔案執行個體

讀取檔案: 一個字元一個字元的讀取

5、總結

File指定操作的對象。

FileReader和FileWriter按字元讀取寫入資料。

BufferedReader和BufferedWriter,引入了緩沖機制,進行字元批量的讀寫。

public void testCopy() throws IOException {

        File testfile = new File("d:/files/test.txt");
        File destfile = new File("d:/files/dest.txt");

        BufferedWriter out1 = new BufferedWriter(new FileWriter(testfile));
        out1.write("string to be copied,字元串已經被複制了\n");
        out1.close();

        InputStream   in = new FileInputStream(testfile);
        OutputStream out = new FileOutputStream(destfile);

        byte[] buf = new byte[1024];

        int length;
        while((length=in.read(buf)) > 0){//從源裡面讀取資料,并傳回實際讀取的位元組數

            System.out.println("讀取了多少個位元組:"+length);//如果buf數組未填充滿,未填充的資料為null并且會寫入到檔案中
            if(length < 1024){
               byte[] realbuf= new byte[length];
               System.arraycopy(buf,0,realbuf,0,length);
               out.write(realbuf);
            }else{
                out.write(buf);//往目标對寫資料
            }


        }

        in.close();
        out.close();

        BufferedReader in1  = new BufferedReader(new FileReader(destfile));
        String str;

        while((str=in1.readLine())!=null){
            System.out.println(str);
        }

        in1.close();//為了釋放相關聯的所有資源

    }
           

六、下圖是一個描述輸入流和輸出流的類層次圖。

了解Java Stream,File,IO最常用的5個類之間的關系