Java 之 字符輸出流[Writer]


一、字符輸出流

  java.io.Writer 抽象類是表示用於寫出字符流的所有類的超類,將指定的字符信息寫出到目的地。

    它定義了字節輸出流的基本共性功能方法。

void write(int c) 寫入單個字符。寫入0 到 65535 之間的Unicode碼。
void write(char[] cbuf) 把整個字符數組的內容寫進去。
abstract void write(char[] cbuf, int off, int len) 寫入字符數組的某一部分,off數組的開始索引,len寫的字符個數。
void write(String str) 寫入字符串。
void write(String str, int off, int len) 寫入字符串的某一部分,off字符串的開始索引,len寫的字符個數。
void flush() 刷新該流的緩沖,則立即將它們寫入預期目標。
void close() 關閉此輸出流並釋放與該流關聯的所有系統資源

  Writer 抽象類下面的子類結構:

 

   圖中深色的為節點流,淺色的為處理流。

二、FileWriter 類

  java.io.FileWriter 類是寫出字符到文件的便利類。構造時使用系統默認的字符編碼和默認字節緩沖區 。

  作用:把內存中字符數據寫入到文件中。

  1、構造方法

FileWriter(File file) : 創建一個新的 FileWriter,給定要讀取的File對象。
FileWriter(String fileName) : 創建一個新的 FileWriter,給定要讀取的文件的名稱。

     參數:寫入數據的目的地。

      File file:文件對象

      String fileName:文件的路徑。

      構造方法作用

      ① 會創建一個 FileWriter 對象

      ② 會根據構造方法中傳遞的文件 / 文件的路徑,創建對象

      ③ 會把 FileWriter 對象指向創建好的文件。

      字符輸出流的使用步驟重要】:

      ① 創建FileWriter對象,構造方法中綁定要寫入數據的目的地

      ② 使用FileWriter中的方法write,把數據寫入到內存緩沖區中(字符轉換為字節的過程)

      ③ 使用FileWriter中的方法flush,把內存緩沖區中的數據,刷新到文件中

      ④ 釋放資源(會先把內存緩沖區中的數據刷新到文件中)

  2、基本寫入數據

    (1)寫出字符write(int b) 方法,每次可以寫出一個字符數據,代碼使用演示:

 1 public static void main(String[] args) throws IOException {  2         //1.創建FileWriter對象,構造方法中綁定要寫入數據的目的地
 3         FileWriter fw = new FileWriter("E:\\d.txt");  4         //2.使用FileWriter中的方法write,把數據寫入到內存緩沖區中(字符轉換為字節的過程)  5         //void write(int c) 寫入單個字符。
 6         fw.write(97);  7         //3.使用FileWriter中的方法flush,把內存緩沖區中的數據,刷新到文件中  8         fw.flush();  9         //4.釋放資源(會先把內存緩沖區中的數據刷新到文件中)
10  fw.close(); 11     }

 

     注意:如果未調用 close 方法,數據只是保存到了緩沖區,並未寫出到文件中。

    (2)關閉與刷新

      區別:

flush :刷新緩沖區,流對象可以繼續使用。
close : 先刷新緩沖區,然后通知系統釋放資源。流對象不可以再被使用了。

      Demo:

 1  public static void main(String[] args) throws IOException {  2         //1.創建FileWriter對象,構造方法中綁定要寫入數據的目的地
 3         FileWriter fw = new FileWriter("E:\\e.txt");  4         //2.使用FileWriter中的方法write,把數據寫入到內存緩沖區中(字符轉換為字節的過程)  5         //void write(int c) 寫入單個字符。
 6         fw.write(97);  7         //3.使用FileWriter中的方法flush,把內存緩沖區中的數據,刷新到文件中
 8  fw.flush();  9         //刷新之后流可以繼續使用
10         fw.write(98); 11 
12         //4.釋放資源(會先把內存緩沖區中的數據刷新到文件中)
13  fw.close(); 14 
15         //close方法之后流已經關閉了,已經從內存中消失了,流就不能再使用了
16         fw.write(99);//IOException: Stream closed
17     }

 

    注意即便是flush方法寫出了數據,操作的最后還是要調用close方法,釋放系統資源。 

  3、寫出其他數據

    (1)寫出字符數組:write(char[] cbuf) write(char[] cbuf, int off, int len) ,每次可以寫出字符數組中的數據,用法類似FileOutputStream,代碼使用演示:

 1  public static void main(String[] args) throws IOException {  2         FileWriter fw = new FileWriter("E:\\f.txt");  3         char[] cs = {'a','b','c','d','e'};  4         //void write(char[] cbuf)寫入字符數組。
 5         fw.write(cs);//abcde  6 
 7         //void write(char[] cbuf, int off, int len)寫入字符數組的某一部分,off數組的開始索引,len寫的字符個數。
 8         fw.write(cs,1,3);//bcd
 9 
10  fw.close(); 11     }

 

    (2)寫出字符串:write(String str) write(String str, int off, int len) ,每次可以寫出字符串中的數據,更為方便,代碼使用演示:

 1  public static void main(String[] args) throws IOException {  2         FileWriter fw = new FileWriter("E:\\f.txt");  3    
 4         //void write(String str)寫入字符串。
 5         fw.write("博客園");//博客園 6 
 7         //void write(String str, int off, int len) 寫入字符串的某一部分,off字符串的開始索引,len寫的字符個數。
 8         fw.write("天道酬勤啊",2,3);//酬勤啊
 9 
10  fw.close(); 11     }

 

    (3)續寫和換行

      續寫,追加寫:使用兩個參數的構造方法

FileWriter(String fileName, boolean append)
FileWriter(File file, boolean append)

                     參數

        String fileName,File file:寫入數據的目的地。

        boolean append:續寫開關 true:不會創建新的文件覆蓋源文件,可以續寫; false:創建新的文件覆蓋源文件。

      換行:換行符號

        windows:\r\n

        Linux / Unix:\n

        mac:\r

      Demo :

1 public static void main(String[] args) throws IOException { 2         FileWriter fw = new FileWriter("E:\\g.txt",true); 3         for (int i = 0; i <10 ; i++) { 4             fw.write("HelloWorld"+i+"\r\n"); 5  } 6 
7  fw.close(); 8     }

 

注意:字符流,只能操作文本文件,不能操作圖片,視頻等非文本文件。單純讀或者寫文本文件時,使用字符流,其他情況使用字節流。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM