Java中BufferedReader與BufferedWriter類的使用示例
BufferedReader
BufferedReader 是緩沖字符輸入流。它繼承于Reader。
BufferedReader 的作用是為其他字符輸入流添加一些緩沖功能。
創(chuàng)建BufferReader時,我們會通過它的構(gòu)造函數(shù)指定某個Reader為參數(shù)。BufferReader會將該Reader中的數(shù)據(jù)分批讀取,每次讀取一部分到緩沖中;操作完緩沖中的這部分?jǐn)?shù)據(jù)之后,再從Reader中讀取下一部分的數(shù)據(jù)。
為什么需要緩沖呢?原因很簡單,效率問題!緩沖中的數(shù)據(jù)實際上是保存在內(nèi)存中,而原始數(shù)據(jù)可能是保存在硬盤或NandFlash中;而我們知道,從內(nèi)存中讀取數(shù)據(jù)的速度比從硬盤讀取數(shù)據(jù)的速度至少快10倍以上。
那干嘛不干脆一次性將全部數(shù)據(jù)都讀取到緩沖中呢?第一,讀取全部的數(shù)據(jù)所需要的時間可能會很長。第二,內(nèi)存價格很貴,容量不想硬盤那么大。
示例:
import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.File; import java.io.InputStream; import java.io.FileReader; import java.io.IOException; import java.io.FileNotFoundException; import java.lang.SecurityException; public class BufferedReaderTest { private static final int LEN = 5; public static void main(String[] args) { testBufferedReader() ; } /** * BufferedReader的API測試函數(shù) */ private static void testBufferedReader() { // 創(chuàng)建BufferedReader字符流,內(nèi)容是ArrayLetters數(shù)組 try { File file = new File("bufferedreader.txt"); BufferedReader in = new BufferedReader( new FileReader(file)); // 從字符流中讀取5個字符。“abcde” for (int i=0; i<LEN; i++) { // 若能繼續(xù)讀取下一個字符,則讀取下一個字符 if (in.ready()) { // 讀取“字符流的下一個字符” int tmp = in.read(); System.out.printf("%d : %c\n", i, tmp); } } // 若“該字符流”不支持標(biāo)記功能,則直接退出 if (!in.markSupported()) { System.out.println("make not supported!"); return ; } // 標(biāo)記“當(dāng)前索引位置”,即標(biāo)記第6個位置的元素--“f” // 1024對應(yīng)marklimit in.mark(1024); // 跳過22個字符。 in.skip(22); // 讀取5個字符 char[] buf = new char[LEN]; in.read(buf, 0, LEN); System.out.printf("buf=%s\n", String.valueOf(buf)); // 讀取該行剩余的數(shù)據(jù) System.out.printf("readLine=%s\n", in.readLine()); // 重置“輸入流的索引”為mark()所標(biāo)記的位置,即重置到“f”處。 in.reset(); // 從“重置后的字符流”中讀取5個字符到buf中。即讀取“fghij” in.read(buf, 0, LEN); System.out.printf("buf=%s\n", String.valueOf(buf)); in.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
程序中讀取的bufferedreader.txt的內(nèi)容如下:
abcdefghijklmnopqrstuvwxyz 0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ
運行結(jié)果:
0 : a 1 : b 2 : c 3 : d 4 : e buf=01234 readLine=56789 buf=fghij
BufferedWriter
BufferedWriter 是緩沖字符輸出流。它繼承于Writer。
BufferedWriter 的作用是為其他字符輸出流添加一些緩沖功能。
BufferedWriter通過字符數(shù)組來緩沖數(shù)據(jù),當(dāng)緩沖區(qū)滿或者用戶調(diào)用flush()函數(shù)時,它就會將緩沖區(qū)的數(shù)據(jù)寫入到輸出流中。
示例:
import java.io.BufferedWriter; import java.io.File; import java.io.OutputStream; import java.io.FileWriter; import java.io.IOException; import java.io.FileNotFoundException; import java.lang.SecurityException; import java.util.Scanner; public class BufferedWriterTest { private static final int LEN = 5; // 對應(yīng)英文字母“abcdefghijklmnopqrstuvwxyz” //private static final char[] ArrayLetters = "abcdefghijklmnopqrstuvwxyz"; private static final char[] ArrayLetters = new char[] {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; public static void main(String[] args) { testBufferedWriter() ; } /** * BufferedWriter的API測試函數(shù) */ private static void testBufferedWriter() { // 創(chuàng)建“文件輸出流”對應(yīng)的BufferedWriter // 它對應(yīng)緩沖區(qū)的大小是16,即緩沖區(qū)的數(shù)據(jù)>=16時,會自動將緩沖區(qū)的內(nèi)容寫入到輸出流。 try { File file = new File("bufferwriter.txt"); BufferedWriter out = new BufferedWriter( new FileWriter(file)); // 將ArrayLetters數(shù)組的前10個字符寫入到輸出流中 out.write(ArrayLetters, 0, 10); // 將“換行符\n”寫入到輸出流中 out.write('\n'); out.flush(); //readUserInput() ; out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 讀取用戶輸入 */ private static void readUserInput() { System.out.println("please input a text:"); Scanner reader=new Scanner(System.in); // 等待一個輸入 String str = reader.next(); System.out.printf("the input is : %s\n", str); } }
運行結(jié)果: 生成文件“bufferwriter.txt”,文件的內(nèi)容是“abcdefghij”。
相關(guān)文章
springboot實現(xiàn)發(fā)送短信驗證碼的示例代碼
項目里面有用到用戶手機號注冊發(fā)短信功能,本文主要介紹了springboot實現(xiàn)發(fā)送短信驗證碼的示例代碼,具有一定的參考價值,感興趣的可以了解一下2023-09-09深入理解JSON及其在Java中的應(yīng)用小結(jié)
json它是一種輕量級的數(shù)據(jù)交換格式,由于其易于閱讀和編寫,同時也易于機器解析和生成,因此廣泛應(yīng)用于網(wǎng)絡(luò)數(shù)據(jù)交換和配置文件,這篇文章主要介紹了深入理解JSON及其在Java中的應(yīng)用,需要的朋友可以參考下2023-12-12Java RocketMQ 路由注冊與刪除的實現(xiàn)
這篇文章主要介紹了Java RocketMQ 路由注冊與刪除的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11jar的MANIFEST.MF配置Class-Path, java -classpath設(shè)置無效的解
這篇文章主要介紹了jar的MANIFEST.MF配置Class-Path, java -classpath設(shè)置無效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07java遞歸實現(xiàn)復(fù)制一個文件夾下所有文件功能
這篇文章主要介紹了java遞歸實現(xiàn)復(fù)制一個文件夾下所有文件功能n次,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-08-08Java線程的生命周期和狀態(tài)控制_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了Java線程的生命周期和狀態(tài)控制,需要的朋友可以參考下2017-05-05