聊聊為什么要使用BufferedReader讀取File
使用BufferedReader讀取File
Java編程思想一書里面有云,為了提高速度,可以用BufferedReader過濾器類,以提供緩沖區(qū)域。但是這個(gè)解釋太簡(jiǎn)略了,看了這句話仍然不知道為什么要使用它,于是感覺值得研究一下。
其實(shí)只用FileReader也能完成讀取文件的任務(wù)。
FileReader有三個(gè)用于read的函數(shù)
public int read()
:每次只read一個(gè)字符public int read(char cbuf[], int offset, int length)
:每次read從offset到offset+length-1的字符,然后放進(jìn)cbuf中public int read(char cbuf[])
:一次性的read出來所有的字符,直接放入cbuf中
這三個(gè)read方法,每次調(diào)用一次就會(huì)read一次file,進(jìn)行一次IO。不管是多次read還是一次性的read,都不是很優(yōu)雅的在read文件的方式。多次read必然會(huì)產(chǎn)生多次IO,一次性的read如果遇到很大的文件,對(duì)內(nèi)存是極不友好的。
于是BufferedReader就顯現(xiàn)出好處來了。BufferedReader使用裝飾器模式,它的IO行為是每次讀進(jìn)來8k的數(shù)據(jù)到緩沖區(qū),如果需要使用數(shù)據(jù)的時(shí)候,再直接從緩沖區(qū)里面拿出數(shù)據(jù)來使用。這樣一來,既提高的讀取速度,又節(jié)省了IO的次數(shù),是一種比較優(yōu)雅的讀取文件的方式。
使用BufferedReader讀取File的代碼舉例
BufferedReader bufferedReader = new BufferedReader(new FileReader("./pom.xml")); StringBuilder stringBuilder = new StringBuilder(); while ((s = bufferedReader.readLine()) != null) { stringBuilder.append(s + "\n"); } System.out.println(stringBuilder.toString());
使用BufferedReader循環(huán)讀文件(新手要注意的細(xì)節(jié))
使用BufferedReader(緩存讀取流)可以每次讀取文件的一行。對(duì)于文件內(nèi)容如果是按行為單位排列的話,則使用BufferedReader來讀取文件還是比較方便的。
舉例如下
1、BufferedReader讀取一行
在F盤下有個(gè)txt文件,文件內(nèi)容為
import java.io.*; public class test { public static void main(String[] args) { BufferedReader br = null; try { br = new BufferedReader(new FileReader("F:\\test.txt")); System.out.println(br.readLine()); } catch (IOException e) { e.printStackTrace(); } }
結(jié)果為:
哈哈0
2、BufferedReader循環(huán)讀每一行
import java.io.*; public class test { public static void main(String[] args) { BufferedReader br = null; try { br = new BufferedReader(new FileReader("F:\\test.txt")); String text = null; //讀取內(nèi)容為null則表示讀到了文件末尾 while ((text = br.readLine()) != null) { System.out.println(text); } } catch (IOException e) { e.printStackTrace(); } }
結(jié)果為:
哈哈0
哈哈1
哈哈2
哈哈3
哈哈4
哈哈5
哈哈6
哈哈7
哈哈8
哈哈9
3、注意細(xì)節(jié)
新手如果沒不注意,容易寫成:
import java.io.*; public class test { public static void main(String[] args) { BufferedReader br = null; try { br = new BufferedReader(new FileReader("F:\\test.txt")); String text = null; // while (true) { if (br.readLine() == null) { break; } System.out.println(br.readLine()); } } catch (IOException e) { e.printStackTrace(); } }
結(jié)果為:
哈哈1
哈哈3
哈哈5
哈哈7
哈哈9
原因
while (true) { if (br.readLine() == null) { break; } System.out.println(br.readLine()); }
因?yàn)樵趙hile循環(huán)中, if 語句在做判斷時(shí),其實(shí)已經(jīng)讀取了一行,而讀取的這行沒有被打印出來,所以就造成了只打印了一部分。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 使用BufferedReader讀取TXT文件中數(shù)值,并輸出最大值
- 關(guān)于BufferedReader的讀取效率問題
- 基于bufferedreader的read()與readline()讀取出錯(cuò)原因及解決
- Java?IO及BufferedReader.readline()出現(xiàn)的Bug
- 解決BufferedReader.readLine()遇見的坑
- 關(guān)于BufferedReader的read()和readLine()的區(qū)別
- Java基礎(chǔ)知識(shí)之BufferedReader流的使用
- 關(guān)于BufferedReader讀取文件指定字符集問題
相關(guān)文章
一文帶你理解@RefreshScope注解實(shí)現(xiàn)動(dòng)態(tài)刷新原理
RefeshScope這個(gè)注解想必大家都用過,在微服務(wù)配置中心的場(chǎng)景下經(jīng)常出現(xiàn),他可以用來刷新Bean中的屬性配置,那大家對(duì)他的實(shí)現(xiàn)原理了解嗎,它為什么可以做到動(dòng)態(tài)刷新呢,所以本文小編將給大家詳細(xì)介紹@RefreshScope注解實(shí)現(xiàn)動(dòng)態(tài)刷新原理2023-07-07解決springboot使用logback日志出現(xiàn)LOG_PATH_IS_UNDEFINED文件夾的問題
這篇文章主要介紹了解決springboot使用logback日志出現(xiàn)LOG_PATH_IS_UNDEFINED文件夾的問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Java常用面板之JScrollPane滾動(dòng)面板實(shí)例詳解
這篇文章主要介紹了Java常用面板JScrollPane的簡(jiǎn)單介紹和一個(gè)相關(guān)實(shí)例,,需要的朋友可以參考下。2017-08-08