日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java-IO流之BufferedReader 和BufferedWriter的使用和原理

發(fā)布時(shí)間:2023/12/1 java 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java-IO流之BufferedReader 和BufferedWriter的使用和原理 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

BufferedReader和BufferedWriter出現(xiàn)的目的是為了對(duì)FileReader以及FileWriter的讀寫操作進(jìn)行增強(qiáng),而怎么增強(qiáng)呢,原理類似于使用StringBuilder,是把數(shù)據(jù)先放入他們的一個(gè)char數(shù)組中,然后再操作char數(shù)組。

使用緩沖區(qū)的字符流是使用了裝飾著模式對(duì)FileReader等進(jìn)行功能上的增強(qiáng),裝飾者模式與繼承都可以實(shí)現(xiàn)功能上的增強(qiáng),但是裝飾者可以做得更加的靈活,也不會(huì)使繼承樹變得太過復(fù)雜。

?

以下是BufferedWriter源碼的一小部分

public class BufferedReader extends Reader {private Reader in; 構(gòu)造函數(shù)需要用到的Readerprivate char cb[]; 自己的char數(shù)組,它本身的read()方法將是訪問這個(gè)數(shù)組,這個(gè)數(shù)組就是緩沖區(qū)private int nChars, nextChar; char數(shù)組位置和數(shù)量的索引

接下來看一下BufferedWriter源碼的read()方法:

public int read() throws IOException {synchronized (lock) {ensureOpen();for (;;) {if (nextChar >= nChars) {fill();if (nextChar >= nChars)return -1;}if (skipLF) {skipLF = false;if (cb[nextChar] == '\n') {nextChar++;continue;}}return cb[nextChar++];}}}

這個(gè)read()方法是訪問的BufferedReader本身的char數(shù)組,當(dāng)發(fā)現(xiàn)數(shù)組的元素已經(jīng)被訪問完畢就調(diào)用fill()方法重新填充char數(shù)組。這個(gè)就是使用緩沖區(qū)的字符流的實(shí)質(zhì)。

同樣的,BufferedWriter也是先把數(shù)據(jù)寫入自身的char數(shù)組中,刷新的時(shí)候再寫入文件。

注意:

1、當(dāng)使用BufferedWriter或者是BufferedReader的時(shí)候,是把FileReader的賦給了BufferedReader里面的Reader對(duì)象,所以要保存數(shù)據(jù)到文件的時(shí)候調(diào)用傳入BufferedReader的參數(shù)Reader是無效的,需要使用BufferedReader進(jìn)行刷新或者關(guān)BufferedReader之后數(shù)據(jù)才會(huì)保存到文件;

2、當(dāng)關(guān)閉BufferedReader的時(shí)候,傳入作為參數(shù)的reader也會(huì)跟著關(guān)閉。

3、BufferedReader具有一個(gè)特殊的方法readerLine(),功能是讀取一行,原理是從char數(shù)組中讀取,判斷是否遇到換行符,是的話返回。

?

下面有根據(jù)傳智播客的IO視頻自己寫的一個(gè)BufferedReader代碼:

public class MyBufferedReader {private Reader reader;private int count;private int position;private char[] contentArray = new char[1024];private int ch;private final String LINE_SEPARATE = System.getProperty("line.separate");public MyBufferedReader(Reader reader) {this.reader = reader;}public int myReader() throws IOException {if (count == 0) {count = reader.read(contentArray);position = 0;}if (count == -1) {return -1;}count--;ch = contentArray[position];position++;return ch;}public String myReadLine() throws IOException {StringBuilder sb = new StringBuilder(256);int ch = 0;while ((ch = myReader()) != -1) {if (ch == '\r') {continue;}if ((char) ch == '\n') {return sb.toString();}sb.append((char) ch);}if (sb.length() > 0)return sb.toString();return null;}public void close() throws IOException {reader.close();}}

  這里是調(diào)用的代碼:

try (FileWriter fileWriter = new FileWriter("buffer.txt")) {try (BufferedWriter bufferedWriter = new BufferedWriter(fileWriter)) {int count = 3;while (count != 0) {bufferedWriter.write("123456");bufferedWriter.newLine();bufferedWriter.write("abcdef");bufferedWriter.newLine();count--;}}}try (FileReader fileReader = new FileReader("buffer.txt")) {MyBufferedReader bufferedReader = new MyBufferedReader(fileReader);String line = null;while ((line = bufferedReader.myReadLine()) != null) {System.out.println(line);}}

  運(yùn)行結(jié)果為:

Disconnected from the target VM, address: '127.0.0.1:26416', transport: 'socket' 123456 abcdef 123456 abcdef 123456 abcdefProcess finished with exit code 0

  

?

轉(zhuǎn)載于:https://www.cnblogs.com/heisehenbai/p/7897054.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的Java-IO流之BufferedReader 和BufferedWriter的使用和原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。