摘要:通常,所作的每個(gè)讀取請(qǐng)求都會(huì)導(dǎo)致對(duì)底層字符或字節(jié)流進(jìn)行相應(yīng)的讀取請(qǐng)求。因此,建議用包裝所有其操作可能開(kāi)銷很高的如和構(gòu)造函數(shù)創(chuàng)建一個(gè)使用默認(rèn)大小輸入緩沖區(qū)的緩沖字符輸入流。
BufferedReader和BufferedWriter
BufferedReader這兩個(gè)類是高效率的提高文件的讀取速度,它們?yōu)樽址斎牒洼敵鎏峁┝艘粋€(gè)緩沖區(qū),可以顯著的調(diào)高寫入和讀取的速度,特別針對(duì)大量的磁盤文件讀取的時(shí)候,下面著重的講講這兩個(gè)類
構(gòu)造函數(shù)從字符輸入流中讀取文本,緩沖各個(gè)字符,從而實(shí)現(xiàn)字符、數(shù)組和行的高效讀取,要特別注意的是這個(gè)市針對(duì)字符流而不是字節(jié)流。
通常,Reader 所作的每個(gè)讀取請(qǐng)求都會(huì)導(dǎo)致對(duì)底層字符或字節(jié)流進(jìn)行相應(yīng)的讀取請(qǐng)求。因此,建議用 BufferedReader 包裝所有其 read() 操作可能開(kāi)銷很高的 Reader(如 FileReader 和 InputStreamReader)
實(shí)例BufferedReader(Reader in) 創(chuàng)建一個(gè)使用默認(rèn)大小輸入緩沖區(qū)的緩沖字符輸入流。
BufferedReader(Reader in, int sz) 創(chuàng)建一個(gè)使用指定大小輸入緩沖區(qū)的緩沖字符輸入流。
可以看出構(gòu)造函數(shù)使用了Reader這個(gè)抽象類來(lái)初始化,我們前面說(shuō)過(guò)這個(gè)是針對(duì)字符流的讀取,因此可以使用Reader類的兩個(gè)子類FileReader,InputStreamReader來(lái)初始化
File file=new File("/tmp"+File.separator+"test"+File.separator+"test.txt"); BufferedReader bufferedReader=new BufferedReader(new FileReader(file)); //使用FileReader實(shí)例化 //使用InputStreamReader來(lái)實(shí)例化 BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(new FileInputStream(file)));常用方法
實(shí)例close()
String readLine() 讀取一行的數(shù)據(jù)
int read() 讀取一個(gè)字符,注意這里的和字節(jié)的不一樣,這里的漢字占用了一個(gè)字節(jié),前面講到讀取字節(jié)流的時(shí)候使用byte讀取漢字占用三個(gè)字節(jié)
skip(int n) 跳過(guò)n個(gè)字節(jié)
ready() 判斷此流是否已準(zhǔn)備好被讀取。
用于控制臺(tái)的讀取,前面已經(jīng)說(shuō)過(guò)System.in返回的是InputStream類型的,因此可以使用InputStreamReader實(shí)例化,當(dāng)然這個(gè)有點(diǎn)多余了,我們完全可以使用java.util提供的Scanner直接進(jìn)行輸入
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in)); String str=bufferedReader.readLine(); //將控制臺(tái)輸入的字符串讀取 System.out.println(str); //打印出來(lái)
用于文件的讀取
BufferedReader bufferedReader=new BufferedReader(new FileReader(file)); // BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(new FileInputStream(file))); // bufferedReader.skip(2); //跳過(guò)兩個(gè)字節(jié) // // 第一種讀取的方式 while(bufferedReader.ready()) //判斷是否還有字符 { String str=bufferedReader.readLine(); //直接讀取一行 System.out.println(str); } bufferedReader.close(); //第二種讀取方式 int len=bufferedReader.read(); while(len!=-1) //判斷是否讀到文件的末尾 { System.out.print((char)len); //強(qiáng)制轉(zhuǎn)化成字符 len=bufferedReader.read(); }BufferedWriter
將文本寫入字符輸出流,緩沖各個(gè)字符,從而提供單個(gè)字符、數(shù)組和字符串的高效寫入。
通常 Writer 將其輸出立即發(fā)送到底層字符或字節(jié)流。除非要求提示輸出,否則建議用 BufferedWriter 包裝所有其 write() 操作可能開(kāi)銷很高的 Writer(如 FileWriters 和 OutputStreamWriters)。例如
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));構(gòu)造函數(shù)
BufferedWriter(Writer out) 創(chuàng)建一個(gè)使用默認(rèn)大小輸出緩沖區(qū)的緩沖字符輸出流。
BufferedWriter(Writer out, int sz) 創(chuàng)建一個(gè)使用給定大小輸出緩沖區(qū)的新緩沖字符輸出流。
File file=new File("/tmp"+File.separator+"test"+File.separator+"test.txt"); BufferedWriter bufferedWriter=new BufferedWriter(new FileWriter(file));
常用函數(shù)注意這里的FileWriter是Writer的子類,因此可以使用其實(shí)例化
實(shí)例close()
flush()
newLine() 寫入一個(gè)與平臺(tái)相關(guān)的換行符
write(int data) 寫入一個(gè)字符,這里的寫入的不是整數(shù)
write(String str) 寫入一個(gè)字符串
write(String str,int off,int len) 寫入部分字符串
write(char[] c)
write(char[] c,int off,int len)
File file=new File("/tmp"+File.separator+"test"+File.separator+"test.txt"); File file1=new File("/tmp"+File.separator+"test"); File file2=new File("/tmp"+File.separator+"test"+File.separator+"demo.txt"); if(!file1.exists()) { file1.mkdir(); System.out.println("文件夾創(chuàng)建成功"); } BufferedWriter bufferedWriter=new BufferedWriter(new FileWriter(file)); String str="陳加兵"; int data=48; String name="chenjiabing"; char[] chars=name.toCharArray(); bufferedWriter.write(str); //寫入一個(gè)字符串,當(dāng)然也可以截取這個(gè)字符串的某一段 bufferedWriter.newLine(); //寫入一個(gè)平臺(tái)自帶的換行符,因?yàn)槊恳粋€(gè)操作系統(tǒng)的換行符都不一樣 bufferedWriter.write(data); //寫入的并不是整數(shù),而是這個(gè)整數(shù)所代表的字符 bufferedWriter.newLine(); bufferedWriter.write(chars,1,4); //寫入字符數(shù)組 bufferedWriter.flush(); bufferedWriter.close()
拓展:通過(guò)了上面的學(xué)習(xí),你不覺(jué)得使用這個(gè)類寫入文件數(shù)據(jù)有點(diǎn)煩了,只能寫入String char類型的數(shù)據(jù),此時(shí)我們就想到了前面說(shuō)過(guò)的打印流(PrintWriter),這是一個(gè)便捷的寫入文件的類,可以指定任意格式任意類型的數(shù)據(jù),同樣是輸出流,我么可以將他們結(jié)合起來(lái),構(gòu)成一個(gè)更加強(qiáng)大的輸出流,如下:
File file=new File("/tmp"+File.separator+"test"+File.separator+"test.txt"); //用BufferedWriter實(shí)例化PrintWriter,顯著提高寫入的效率 PrintWriter printWriter=new PrintWriter(new BufferedWriter(new FileWriter(file))); String name="陳加兵"; int age=22; float grade=99.9f; printWriter.printf("姓名:%s,年齡:%s,grade:%s",name,age,grade); //格式化的寫入 printWriter.close();綜合實(shí)例
將一個(gè)文件中數(shù)據(jù)轉(zhuǎn)移到另外一個(gè)文件中
package IO; import java.io.*; /** * Created by chenjiabing on 17-5-26. */ public class demo13 { /** * 常用函數(shù): * newLine() * write(String str) * write(String str,int off,int len) * write(Char[] c) * write(Char[] c,int off,int len) * write(int data) * close() * flush() */ public static void main(String[] args) throws IOException { File file = new File("/tmp" + File.separator + "test" + File.separator + "test.txt"); File file1 = new File("/tmp" + File.separator + "test"); File file2 = new File("/tmp" + File.separator + "test" + File.separator + "demo.txt"); BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(file2)); BufferedReader bufferedReader = new BufferedReader(new FileReader(file)); while (bufferedReader.ready()) { String str = bufferedReader.readLine(); //讀取文件test.txt中的一行數(shù)據(jù) bufferedWriter.write(str); //將這一行數(shù)據(jù)寫入文件demo.txt bufferedWriter.newLine(); } bufferedReader.close(); bufferedWriter.flush(); bufferedWriter.close(); } }參考文章
http://ifeve.com/java-io-char-buffered-filter/
http://www.cnblogs.com/lich/archive/2011/12/11/2284223.html
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67175.html
摘要:通常,所作的每個(gè)讀取請(qǐng)求都會(huì)導(dǎo)致對(duì)底層字符或字節(jié)流進(jìn)行相應(yīng)的讀取請(qǐng)求。因此,建議用包裝所有其操作可能開(kāi)銷很高的如和構(gòu)造函數(shù)創(chuàng)建一個(gè)使用默認(rèn)大小輸入緩沖區(qū)的緩沖字符輸入流。 BufferedReader和BufferedWriter 這兩個(gè)類是高效率的提高文件的讀取速度,它們?yōu)樽址斎牒洼敵鎏峁┝艘粋€(gè)緩沖區(qū),可以顯著的調(diào)高寫入和讀取的速度,特別針對(duì)大量的磁盤文件讀取的時(shí)候,下面著重的講講...
摘要:學(xué)習(xí)筆記總結(jié)前言前面的八篇文章詳細(xì)的講述了的操作方法,文章列表如下基本的文件操作字符流和字節(jié)流的操作和操作內(nèi)存操作流管道流打印流對(duì)的支持和后續(xù)字節(jié)流字節(jié)流的操作都是基于和這兩個(gè)抽象類是字節(jié)輸入流,主要的功能是從文件中讀取數(shù)據(jù)它的子類有內(nèi)存操 Java IO學(xué)習(xí)筆記總結(jié) 前言 前面的八篇文章詳細(xì)的講述了Java IO的操作方法,文章列表如下 基本的文件操作 字符流和字節(jié)流的操作 In...
摘要:在接口服務(wù)開(kāi)發(fā)中,難免會(huì)校驗(yàn)傳入方的參數(shù)校驗(yàn),尤其在請(qǐng)求時(shí),驗(yàn)證字符長(zhǎng)度,字符類型是否滿足數(shù)據(jù)庫(kù)中字段的最大長(zhǎng)度及類型,如果不符合條件應(yīng)及時(shí)攔截并返回,避免后續(xù)的流程。 showImg(https://segmentfault.com/img/remote/1460000018664784); 公司轉(zhuǎn)java開(kāi)發(fā)也有一段時(shí)間了,在實(shí)際開(kāi)發(fā)過(guò)程中還是會(huì)遇到一些問(wèn)題的,本篇主要記錄下接口服...
摘要:哪吒社區(qū)技能樹(shù)打卡打卡貼函數(shù)式接口簡(jiǎn)介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號(hào)作者架構(gòu)師奮斗者掃描主頁(yè)左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無(wú)意間聽(tīng)到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡(jiǎn)而言之,不缺干 ? 哪吒社區(qū)Java技能樹(shù)打卡?【打卡貼 day2...
閱讀 3481·2023-04-26 02:31
閱讀 3638·2021-11-23 09:51
閱讀 1300·2021-11-17 09:33
閱讀 2453·2021-11-16 11:45
閱讀 2581·2021-10-11 11:12
閱讀 2424·2021-09-22 15:22
閱讀 2728·2021-09-04 16:40
閱讀 2592·2021-07-30 15:30