Java-Java I/O 字节流之BufferedReader/BufferedWriter
- 概述
- Reader InputStreamReader FileReader and BufferedReader
- Writer OutputStreamWriter FileWriter and BufferedWriter
- Character Encoding and Charset
- 示例
- BufferedReader
- BufferedWriter
概述
本篇博文主要介紹 如何使用java.io包中提供的類讀取和寫入文本(或字符)文件
Reader, InputStreamReader, FileReader and BufferedReader
Reader是讀取字符流的抽象類。 它實現以下基本方法:
- read(): reads a single character.
- read(char[]): reads an array of characters.
- skip(long): skips some characters.
- close(): closes the stream.
InputStreamReader是從字節流到字符流的橋梁。 它使用指定的字符集將字節轉換為字符。 字符集可以是操作系統的默認字符編碼,也可以在創建InputStreamReader時顯式指定。
FileReader是使用操作系統的默認字符編碼讀取文本文件的便捷類。
BufferedReader從字符流中讀取文本(字符被緩沖以避免從基礎流中經常讀取),并提供了一種方便的閱讀文本行readLine()的方法。
我們來看下Reader的繼承關系
Writer, OutputStreamWriter, FileWriter and BufferedWriter
Writer是寫入字符流的抽象類。 它實現以下基本方法:
- write(int): writes a single character.
- write(char[]): writes an array of characters.
- write(String): writes a string.
- close(): closes the stream.
OutputStreamWriter是從字節流到字符流的橋梁。 使用指定的字符集將字符編碼為字節。 字符集可以是操作系統的默認字符編碼,也可以在創建OutputStreamWriter時顯式指定。
FileWriter是使用操作系統的默認字符編碼編寫文本文件的便捷類。
BufferedWriter有效地將文本寫入字符流(字符,數組和字符串被緩沖以避免頻繁寫入底層流),并為寫入行分隔符newLine()提供了一種方便的方法。
Character Encoding and Charset
當構建reader 或者 writer 對象時,使用操作系統的默認字符編碼
FileReader fileReader = new FileReader("myFile.txt");FileWriter fileWriter = new FileWriter("YourFile.txt");所以,如果我們要使用特定的字符集,請改用InputStreamReader或OutputStreamWriter
InputStreamReader reader = new InputStreamReader(new FileInputStream("MyFile.txt"), "UTF-16");這將創建一個具有Unicode字符編碼UTF-16的InputStreamReader
構造具有UTF-8編碼OutputStreamWriter
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("MyFile.txt"), "UTF-8");如果我們想使用BufferedReader,只需將InputStreamReader包裝在其中,例如:
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("MyFile.txt"), "UTF-8"));同樣的 BufferedWriter 如下
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("MyFile.txt"), "UTF-16");BufferedWriter bufferedWriter = new BufferedWriter(osw);示例
BufferedReader
示例一: 從文件MyFile.txt讀取單個字符,并將所有字符打印到輸出控制臺:
@Testpublic void test() {FileReader fileReader = null;try {fileReader = new FileReader(new File("D:/xgj.txt"));int character;while ((character = fileReader.read()) != -1) {System.out.println((char) character);}// close streamfileReader.close();} catch (IOException e) {e.printStackTrace();}}示例二 讀取文本文件,假設編碼為UTF-8:
@Testpublic void test() {InputStreamReader in;try {in = new InputStreamReader(new FileInputStream(new File("D:/xgj.txt")), "UTF-8");int character;while ((character = in.read()) != -1) {System.out.println((char) character);}// close streamin.close();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}示例三 使用BufferedReader逐行讀取文本文件(這是最有效和首選的方式):
@Testpublic void test() {BufferedReader bufferedReader;try {bufferedReader = new BufferedReader(new FileReader(new File("D:/xgj.txt")));String line;while ((line = bufferedReader.readLine()) != null) {System.out.println(line);}// close streambufferedReader.close();} catch (IOException e) {e.printStackTrace();}}BufferedWriter
使用FileWriter將兩個單詞“Hello World”和“Good Bye!”寫入名為MyFile.txt的文件:
@Testpublic void test() {FileWriter fileWriter;try {// If the second argument is true, then bytes will be written to the// end of the file rather than the beginning.fileWriter = new FileWriter(new File("D:/MyFile.txt"), true);fileWriter.write("Hello World");fileWriter.write("\r\n"); // write new linefileWriter.write("Good Bye!");// close streamfileWriter.close();} catch (IOException e) {e.printStackTrace();}}請注意,FileWriter默認使用操作系統的默認字符編碼。 如果文件不存在將創建一個新的文件,存在則覆蓋現有的。
如果要將文本附加到現有文件,請將FileWriter類的構造函數第二個入參true.
如下:
FileWriter writer = new FileWriter("MyFile.txt", true);示例二 使用一個包含FileWriter的BufferedWriter 來將文本附加到現有文件中:
這是寫入文本文件的首選方法,因為BufferedWriter 提供了寫入字符流的有效方式。
@Testpublic void test() {BufferedWriter bufferedWriter;try {bufferedWriter = new BufferedWriter(new FileWriter("D:/Myfile.txt", true));bufferedWriter.write("Hello World");bufferedWriter.newLine(); // 分隔符bufferedWriter.write("See You Again!");// close streambufferedWriter.close();} catch (IOException e) {e.printStackTrace();}}以下示例在寫入文件時指定特定字符編碼(UTF-8):
@Testpublic void test() {try {FileOutputStream outputStream = new FileOutputStream("D:/MyFile.txt");OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);bufferedWriter.write("Hello");bufferedWriter.newLine();bufferedWriter.write("I/O");// close streambufferedWriter.close();} catch (IOException e) {e.printStackTrace();}}注意:
從Java 7開始,我們可以使用try-with-resources語句簡化打開和關閉讀寫器的代碼。 例如:
總結
以上是生活随笔為你收集整理的Java-Java I/O 字节流之BufferedReader/BufferedWriter的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java-Java I/O流解读之Obj
- 下一篇: Java-工具类之ZIP压缩解压