天天看點

Java IO(1)—基本檔案字元流FileWriter、FileReader1. IO流概述2 FileWriter檔案字元輸出流3 FileReader檔案字元輸入流4 案例

詳細介紹了Java IO中的基本檔案字元流FileWriter、FileReader的方法以及使用方式。

文章目錄

  • 1. IO流概述
  • 2 FileWriter檔案字元輸出流
    • 2.1 構造器
    • 2.2 API方法
      • 2.1.1 補充
  • 3 FileReader檔案字元輸入流
    • 3.1 構造器
    • 3.2 API方法
      • 3.2.1 補充
  • 4 案例
    • 4.1 寫入檔案
    • 4.2 讀取檔案
    • 4.3 拷貝檔案

1. IO流概述

IO,即輸入和輸出。流,即資料的傳輸,可以看做是一種資料的流動。

按照流動的方向,以記憶體為基準,分為輸入input 和輸出output ,即流向記憶體是輸入流,流出記憶體的輸出流,合稱IO流。

Java中流的分類:

  1. 按資料流向:
    1. 輸出流:将記憶體中的資料流向到外部的媒體。
    2. 輸入流:将外部媒體的資料流向記憶體。
  2. 按資料類型:
    1. 位元組流:處理資料機關是位元組,1Byte。
    2. 字元流:處理資料機關是字元,2Byte。
  3. 流動方向與操作相結合:
    1. 位元組輸入流: InputStream類
    2. 位元組輸出流: OutputStream類
    3. 字元輸入流: Reader類
    4. 字元輸出流: Writer類

以上四類都在IO包中,都是頂級抽象類。

2 FileWriter檔案字元輸出流

public abstract class Writer
extends Object
implements Appendable, Closeable, Flushable
           

特點:

  1. 輸出到外部。
  2. 輸出的是字元,隻能操作文本。
  3. 作為各個字元輸出類的最終抽象基類。所有子類必須實作的方法有 write(char[], int off, int length)、flush() 和 close()。
public class FileWriter
extends OutputStreamWriter
           

和檔案相關的字元輸出流,檔案的輸出。用來寫入字元檔案的便捷類。用于寫入字元流。

Java IO(1)—基本檔案字元流FileWriter、FileReader1. IO流概述2 FileWriter檔案字元輸出流3 FileReader檔案字元輸入流4 案例

2.1 構造器

FileWriter(String fileName)  
           

根據給定的檔案名構造一個 FileWriter 對象。filename:String類型的要寫入的檔案路徑。

注意:

  1. 建立該對象的時候,必須指定一個抽象路徑
  2. 如果指定的檔案不存在,将會自動的建立。
  3. 如果檔案存在,會把原來的檔案替換。

根據給定的檔案名以及訓示是否附加寫入資料的 boolean 值來構造 FileWriter 對象。filename:要寫入的檔案路徑。b:當指定的boolean 值為true,在原有檔案的基礎上實作續寫。

根據給定的 File 對象構造一個 FileWriter 對象。

根據給定的 File 對象構造一個 FileWriter 對象。以及訓示是否附加寫入資料的 boolean 值确定是将字元寫入檔案末尾處還是寫入檔案開始處。

建立輸出流到底做了哪些事情?

  1. 調用系統功能去建立檔案。
  2. 建立輸出流對象。
  3. 把輸出流對象指向這個檔案。

2.2 API方法

它的方法全部從直接父類OutputStreamWriter和間接父類Writer、Object繼承。

寫入單個字元,要寫入的字元包含在給定整數值的16個低位中,16高位被忽略。(底層Int類型的C—>32位二進制數—>保留低位16位—>轉換為char類型)

寫入字元串。

寫入字元串的某一部分。str:字元串。off:相對初始寫入字元的偏移量。len:要寫入的字元數。

寫入字元數組。

寫入字元數組某一部分。cbuf:要寫入的數組。off:開始寫入字元處的偏移量。len:要寫入的字元數。

重新整理流的緩沖。

将流資源關閉。

傳回該流使用的字元編碼名稱。

2.1.1 補充

flush:重新整理流的緩沖,流資源沒有關閉,資源可以繼續使用。

close:将流資源直接關閉。在關閉之前,會自動調用一次flush方法。流資源一旦關閉,不能在次被使用。

為什麼一定要close()呢?

  1. 讓流對象變成垃圾,這樣就可以被垃圾回收器回收了
  2. 通知系統去釋放跟該檔案相關的資源,否則檔案句柄等資源會被一直占用,而Java的GC隻會回收對象,不會回收相關檔案資源。

3 FileReader檔案字元輸入流

public abstract class Reader
extends Object
implements Readable, Closeable
           

Reader :字元輸入流,用于讀取字元流的抽象超類。子類必須實作的方法隻有 read(char[], int off, int length) 和 close()。

public class FileReader
extends InputStreamReader
           

FileReader,和檔案相關的字元輸入流,可用于讀取檔案資料。建立對象的時候,如果指定的檔案不存在,将抛出異常。

Java IO(1)—基本檔案字元流FileWriter、FileReader1. IO流概述2 FileWriter檔案字元輸出流3 FileReader檔案字元輸入流4 案例

3.1 構造器

public FileReader(String fileName)
           throws FileNotFoundException
           

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

public FileReader(File file)
           throws FileNotFoundException
           

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

public FileWriter(File file, boolean append)
           throws IOException
           

根據給定的 File 對象構造一個 FileWriter 對象。如果第二個參數為 true,則将位元組寫入檔案末尾處,而不是寫入檔案開始處。即,追加寫入而不是覆寫寫入。

3.2 API方法

它的方法全部從直接父類InputStreamReader和間接父類Reader、Object繼承。

一次讀取一個字元。傳回int類型,如果讀取到末尾,傳回-1,可以做為循環條件判斷結束依據使用。

将讀取的資料存放在字元數組當中,傳回的是已讀取字元個數,讀取的字元數,如果已到達流的末尾,則傳回 -1.可以做為循環條件判斷結束依據使用。

new String(cbuf,0,read); 轉換字元數組。建議:盡量用讀取數組的方法來讀取資料,可以避免記憶體與外部媒體的頻繁互動。

關閉流資源。

3.2.1 補充

為什麼read()方法要使用int類型變量來接收傳回值呢?

FileReader 的 read 方法傳回值是一個int類型的變量來接收的,而read方法在實際中卻是以字元形式來進行資料的讀取的。傳回的是作為整數讀取的字元,即傳回Unicode碼,其範圍在 0 到 65535 之間 (0x00-0xffff),也就是說char類型資料是取不到負值的;

int類型資料的取值範圍為-2147483648-2147483647,可以取到負值;同時 int 的取值範圍又包含 char 的取值範圍,這就為使用 int 作為傳回值類型提供了可能,因為流需要一個特殊的值來表示流末尾,這個值不應該在 char 的取值範圍内,如果使用 char 取值範圍内的值作為流末尾标志,那麼這個值同樣有可能出現在資料流中間作為資料來傳輸,流在讀到這個值的時候會認為已經到達流末尾,後面未讀取的資料将被截斷。

是以 Java 中選擇了使用-1來作為流末尾,這個值不在char的取值範圍内,是以不存在資料截斷,然而-1又在 int 的取值範圍内,同時int的取值範圍包含 char的取值範圍,是以FileReader下read方法傳回的char類型資料直接轉為了 int類型。

4 案例

4.1 寫入檔案

利用Filewriter将字元寫入到指定檔案中。

public class FilewriterDemo01 {
    @Test
    public void Test1() throws IOException {
        FileWriter file = null;
        try {
            file = new FileWriter("C:\\Users\\lx\\Desktop\\test.txt");
            file.write("呵呵");
            file.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (file != null) {
                file.close();
            }
        }
    }

    @Test
    public void Test2() throws IOException {
        FileWriter file = null;
        try {
            file = new FileWriter("C:\\Users\\Administrator\\Desktop\\a.txt",
                    true);
            file.write("\r\n呵呵");
            file.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (file != null) {
                file.close();
            }
        }
    }
}
           

4.2 讀取檔案

利用Filewriter從指定檔案中擷取字元資料。注意檔案應該使用UTF-8編碼,否則可能出現亂碼。

public class FileReaderDemo01 {
    public static void main(String[] args) throws IOException {
        FileReader file = null;
        try {
            file = new FileReader("C:\\Users\\lx\\Desktop\\test.txt");
      /* int read = 0;
         while ((read = file.read()) != -1)
         {
            System.out.print((char) read);
         }*/
            char[] ch = new char[1024];
            int read = 0;
            while ((read = file.read(ch)) != -1) {
                System.out.println(new String(ch, 0, read));
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (file != null) {
                file.close();
            }
        }
    }

}
           

4.3 拷貝檔案

注意檔案應該使用UTF-8編碼,否則可能出現亂碼。

利用FileReader和FileWriter實作檔案資料的拷貝。

public class Copy {
    public static void main(String[] args) throws IOException {
        FileWriter filew = null;
        FileReader filer = null;

        try {
            filer = new FileReader("C:\\Users\\lx\\Desktop\\test.txt");
            filew = new FileWriter("C:\\Users\\lx\\Desktop\\target.txt");
         /*int read=0;
         while ((read=filer.read())!=-1)
         {
            filew.write((char)read);
         }*/
            int read = 0;
            char[] ch = new char[1024];
            while ((read = filer.read(ch)) != -1) {
                filew.write(new String(ch, 0, read));
            }
            filew.flush();
        } catch (Exception e) {
            throw new RuntimeException("IO異常");
        } finally {
            if (filer != null) {
                filer.close();
            }
            if (filew != null) {
                filew.close();
            }
        }
    }

}
           
如有需要交流,或者文章有誤,請直接留言。另外希望點贊、收藏、關注,我将不間斷更新各種Java學習部落格!