Java IO流字元流簡介及基本使用

tianjh發表於2020-12-15

                Java IO流字元流簡介及常用字元流的基本使用  

  字元流分為輸入字元流(Writer)和輸出字元流(Reader),這兩種字元流及其子類字元流都有自己專門的功能。在編碼中我們常用的輸出字元流有FileWriter、PrintWriter等,而常用的輸入字元流有StringReader、FileReader、BufferedReader和InputStreamReader等等。Writer是用於寫入字元流的抽象類。它的子類必須實現的唯一方法是write(char [],int,int),flush()和close()。 而Reader是用於讀取字元流的抽象類。它的子類必須實現的唯一方法是read(char [],int,int)和close()。我們在使用Writer和Reader的過程中,可以通過繼承的方式實現,同時我們也可以在繼承了Writer或Reader的子類中將重寫這裡定義父類中已有的一些方法,來實現我們想要的功能。

字元流的結構體系圖為(JDK 1.8):

輸入字元流(Writer)和輸出字元流(Reader)咋區分?

就簡單的用磁碟和記憶體來說,以記憶體為核心。從記憶體出來的叫輸出,進入記憶體的叫輸入。那麼從記憶體中把流輸出寫入到磁碟上的就是輸出字元流,從磁碟上讀取資料寫入到記憶體中的就叫輸入流。不知這樣說是否合理,有問題還望大家多多指教。

 下面來看看常用的幾種字元流的使用:

1、FileReader & FileWriter

      FileReader類從InputStreamReader類繼承而來,該類按字元讀取流中資料。它的建構函式假定預設字元編碼和預設位元組緩衝區大小是適當的。 若要自己來指定這些值,需要在FileInputStream上構造一個InputStreamReader。 FileReader是用於讀取字元流,要讀取原始位元組流,請考慮使用FileInputStream。而FileWriter類從OutputStreamWriter類繼承而來,該類按字元向流中寫入資料。它的建構函式假定預設字元編碼和預設位元組緩衝區大小是可以接受的。若也要自己指定這些值,則需要在FileOutputStream上構造一個OutputStreamWriter。 FileWriter類建立物件之後所傳入的檔案是否可用或是否可能被建立取決於底層平臺,特別是某些平臺允許一次只能開啟一個檔案來寫入一個FileWriter (或其他檔案寫入物件)。 在這種情況下,如果所涉及的檔案已經開啟,則此類中的建構函式將失敗。FileWriter是用於寫入字元流,要編寫原始位元組流,請考慮使用FileOutputStream

示例程式碼:

 1 package com.tianjh.io.writer;
 2 
 3 import java.io.*;
 4 
 5 /**
 6  * Created on 2020/12/15
 7  * $FileReaderWriterDemo 包含FileWriter、FileReader的簡單使用
 8  * <p>
 9  * FileWriter 是向指定的檔案寫入資料,write方法會把字元一個一個的寫入磁碟中
10  * FileReader 是向指定的檔案讀取資料,read方法會一個一個字元的從磁碟往回讀資料
11  *
12  * @author tianjh
13  */
14 public class FileReaderWriterDemo {
15     public static void main(String[] args) {
16 
17         // 宣告一個檔案
18         String fileName = "D:\\hello.txt";
19         // 例項化一個file物件
20         File file = new File(fileName);
21         /*
22          * 1.使用FileWriter的write向磁碟上寫檔案
23          *   write方法會把字元一個一個的寫入磁碟中
24          */
25         try {
26             // 例項化一個fileWriter物件
27             FileWriter fileWriter = new FileWriter(file);
28             fileWriter.write(99);
29             fileWriter.write("您好!");
30             fileWriter.write("hello world!");
31             fileWriter.flush();
32             // 關閉流,釋放資原始檔
33             fileWriter.close();
34         } catch (IOException e) {
35             e.printStackTrace();
36         }
37 
38         /*
39          * 2.使用FileReader的read方法從磁碟上讀入檔案
40          *   read方法會一個一個字元的從磁碟往回讀資料
41          */
42         try {
43             int a;
44             // 1. 輸出指定檔案的每個位元組的ASCII碼
45             FileReader fileReader = new FileReader(fileName);
46             while ((a = fileReader.read()) != -1) {
47                 // 輸出指定檔案的每個位元組的ASCII碼
48                 System.out.print(a + " ");
49                 // expected output: 99 24744 22909 65281 104 101 108 108 111 32 119 111 114 108 100 33
50             }
51             System.out.println();
52             fileReader.close();
53 
54             // 2. 輸出每個位元組ASCII碼所對應的字元
55             FileReader fileReader1 = new FileReader(fileName);
56             while ((a = fileReader1.read()) != -1) {
57                 // 輸出每個位元組ASCII碼所對應的字元
58                 System.out.print((char) a);
59                 // expected output: c您好!hello world!
60             }
61             fileReader1.close();
62             System.out.println();
63         } catch (IOException e) {
64             e.printStackTrace();
65         }
66     }
67 }

測試結果:

寫入到hello.txt檔案之後的資料為:

 

 2、PrintWriter

PrintWriter將物件的格式化表示形式列印到文字輸出流。這個類實現了全部在PrintStream中找到的所有列印方法。但它不包含用於編寫原始位元組的方法,程式應使用未編碼的位元組流。它與PrintStream類不同,PrintStream是針對位元組流的,而PrintWriter是針對字元流的。如果PrintWriter啟用自動重新整理,它只會在呼叫的println,printf,或format方法來完成,而不是當一個換行符恰好是輸出。這些方法使用平臺自己的行分隔符而不是換行符。這個類中的方法不會丟擲IO異常,儘管它的一些建構函式可能會丟擲異常。我們可以通過呼叫checkError()方法查詢是否發生錯誤。

 示例程式碼:

 1 package com.tianjh.io.writer;
 2 
 3 import java.io.PrintWriter;
 4 
 5 /**
 6  * Created on 2020/12/15
 7  *
 8  */
 9 public class PrintWriterDemo {
10     public static void main(String[] args) throws Exception {
11         String fileName = "D:\\hello.txt";
12         String s1 = "hello world!";
13         String s2 = "您們好!";
14         PrintWriter printWriter = new PrintWriter(fileName);
15         printWriter.println(s1);
16         printWriter.println(s2);
17         printWriter.close();
18     }
19 }

測定結果:

 3、StringReader

StringReader是一個字元流,其源是一個字串。它主要用於處理字串。

示例程式碼:

 1 package com.tianjh.io.reader;
 2 
 3 import java.io.IOException;
 4 import java.io.StringReader;
 5 
 6 /**
 7  * Created on 2020/12/15
 8  * $StringReaderDemo 測試使用StringReader
 9  *
10  */
11 public class StringReaderDemo {
12     public static void main(String[] args) throws IOException {
13         String s = "hello,world!";
14         s = s + "我是一條測試資料";
15         System.out.println(s);
16         // expected output: hello,world!我是一條測試資料
17 
18         // 例項化一個stringReader物件,使用read方法進行讀取
19         StringReader stringReader = new StringReader(s);
20         int a;
21         while ((a = stringReader.read()) != -1) {
22             System.out.print((char) a);
23             // expected output: hello,world!我是一條測試資料
24         }
25         System.out.println();
26     }
27 }

輸出結果:

 5、BufferedReader

BufferedReader它的用法和BufferedInputStream類似,只是它們一個一個處理字元,一個處理位元組。BufferedReader用來處理字元。BufferedInputStream的使用可參考https://www.cnblogs.com/jhtian/p/14115355.html

示例程式碼:

package com.tianjh.io.reader;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

/**
 * Created on 2020/12/15
 * $BufferedReaderDemo 的基本使用
 *
 */
public class BufferedReaderDemo {
    public static void main(String[] args) throws IOException {
        // 宣告一個檔案
        String fileName = "D:\\hello.txt";
        String s2;
        StringBuilder s3 = new StringBuilder();
        FileReader fileReader = new FileReader(fileName);
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        while ((s2 = bufferedReader.readLine()) != null) {
            s3.append(s2);
        }
        System.out.println(s3);
        // expected output: hello world!您們好!
        bufferedReader.close();
    }
}

輸出結果:

 

 

 

 

 

相關文章