Java IO流字符流簡介及基本使用
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的使用可參考//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(); } }
輸出結果: