java 缓冲区read方法_Java刷题知识点之字符流缓冲区、BufferedWriter、BufferedReader、BufferedReader-readLine方法原理、自定义MyBuffe...

本文深入探讨Java中字符流缓冲区的概念,解释为何使用BufferedReader和BufferedWriter能提高读写效率,并通过示例代码展示它们的使用方法。同时,文章还介绍了自定义MyBufferedReader的read和readLine方法的实现原理。
摘要由CSDN通过智能技术生成

不多说,直接上干货!

把提高效率的动作,封装成一个对象。即把缓冲区封装成一个对象。

就是在一个类里封装一个数组,能对流锁操作数据进行缓存。

什么是字符流缓冲区?

善于使用字符流缓冲区,减轻负担,提高下效率。

其实啊,无非是将源中数据,存储到自定义数组里,进行缓存。并对数组操作,从而提高效率。

即BufferedReader 比 FileReader要增强。

BufferedWriter 比 FileWriter要增强。

什么情况下需要使用字符流缓冲区?

先从一个例子,来由浅入深的

3facfcf44c76ed4a0b50314af56e5801.png

为了提高写入的效率,需引入字符流的缓冲区。

cdaf12ad07caf99680aff7b93587e239.png

BufferedWriterDemo.java

e8a90166085077165dd2c849490f8056.png

69c5a8ac3fa60e0848d784a6dd461da6.png

package zhouls.bigdata.DataFeatureSelection.test;

import java.io.BufferedWriter;

import java.io.FileWriter;

import java.io.IOException;public classBufferedWriterDemo {private static final String LINE_SEPARATOR = System.getProperty("line.separator");/**

* @param args

* @throws IOException*/

public static voidmain(String[] args) throws IOException {

FileWriter fw= new FileWriter("buf.txt");//为了提高写入的效率。使用了字符流的缓冲区。//创建了一个字符写入流的缓冲区对象,并和指定要被缓冲的流对象相关联

BufferedWriter bufw = new BufferedWriter(fw);//使用缓冲区的写入方法将数据先写入到缓冲区中。

bufw.write("abcdefq"+LINE_SEPARATOR+"hahahha");

bufw.write("xixiixii");

bufw.newLine();

bufw.write("heheheheh");//使用缓冲区的刷新方法将数据刷目的地中。

bufw.flush();//关闭缓冲区。其实关闭的就是被缓冲的流对象。

bufw.close();

}

}

69c5a8ac3fa60e0848d784a6dd461da6.png

由fw变成bufw

同样,为了读取的效率,引入字符流缓冲区。

BufferedReaderDemo.java

841d4dd63e0ec234c501e6d3be3dd259.png

69c5a8ac3fa60e0848d784a6dd461da6.png

package zhouls.bigdata.DataFeatureSelection.test;

import java.io.BufferedReader;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;public classBufferedReaderDemo {/**

* @param args

* @throws IOException*/

public static voidmain(String[] args) throws IOException {

FileReader fr= new FileReader("buf.txt");

BufferedReader bufr= newBufferedReader(fr);

String line= null;while((line=bufr.readLine())!=null){

System.out.println(line);

}

bufr.close();

}/**

* @throws FileNotFoundException

* @throws IOException*/

public static voiddemo() throws FileNotFoundException, IOException {

FileReader fr= new FileReader("buf.txt");char[] buf = new char[1024];int len = 0;while((len=fr.read(buf))!=-1){

System.out.println(new String(buf,0,len));

}

fr.close();

}

}

69c5a8ac3fa60e0848d784a6dd461da6.png

BufferedReader-readLine方法原理

435170acbf0b6479ba0a9aa16d143e01.png

自定义MyBufferedReader-read方法和自定义MyBufferedReader-readLine方法

1a8ed0cc4604b00af50824d3a738106b.png

MyBufferedReader.java

其实啊,无非是将源中数据,存储到自定义数组里,进行缓存。并对数组操作,从而提高效率。

即BufferedReader 比 FileReader要增强。

BufferedWriter 比 FileWriter要增强。

69c5a8ac3fa60e0848d784a6dd461da6.png

package zhouls.bigdata.DataFeatureSelection.test;

import java.io.FileReader;

import java.io.IOException;

import java.io.Reader;/**

* 自定义的读取缓冲区。其实就是模拟一个BufferedReader.

*

* 分析:

* 缓冲区中无非就是封装了一个数组,

* 并对外提供了更多的方法对数组进行访问。

* 其实这些方法最终操作的都是数组的角标。

*

* 缓冲的原理:

* 其实就是从源中获取一批数据装进缓冲区中。

* 在从缓冲区中不断的取出一个一个数据。

*

* 在此次取完后,在从源中继续取一批数据进缓冲区。

* 当源中的数据取光时,用-1作为结束标记。

*

* @author Administrator*/

public classMyBufferedReader extends Reader {privateReader r;//定义一个数组作为缓冲区。

private char[] buf = new char[1024];//定义一个指针用于操作这个数组中的元素。当操作到最后一个元素后,指针应该归零。

private int pos = 0;//定义一个计数器用于记录缓冲区中的数据个数。 当该数据减到0,就从源中继续获取数据到缓冲区中。

private int count = 0;

MyBufferedReader(Reader r){this.r =r;

}/**

* 该方法从缓冲区中一次取一个字符。

* @return

* @throws IOException*/

public intmyRead() throws IOException{if(count==0){

count=r.read(buf);

pos= 0;

}if(count<0)return -1;char ch = buf[pos++];

count--;returnch;/*//1,从源中获取一批数据到缓冲区中。需要先做判断,只有计数器为0时,才需要从源中获取数据。

if(count==0){

count = r.read(buf);

if(count<0)

return -1;

//每次获取数据到缓冲区后,角标归零.

pos = 0;

char ch = buf[pos];

pos++;

count--;

return ch;

}else if(count>0){

char ch = buf[pos];

pos++;

count--;

return ch;

}*/}publicString myReadLine() throws IOException{

StringBuilder sb= newStringBuilder();int ch = 0;while((ch = myRead())!=-1){if(ch=='\r')continue;if(ch=='\n')returnsb.toString();//将从缓冲区中读到的字符,存储到缓存行数据的缓冲区中。

sb.append((char)ch);

}if(sb.length()!=0)returnsb.toString();return null;

}public voidmyClose() throws IOException {

r.close();

}public int read(char[] cbuf, int off, intlen) throws IOException {return 0;

}public voidclose() throws IOException {

}

}

69c5a8ac3fa60e0848d784a6dd461da6.png

MyBufferedReaderDemo.java

69c5a8ac3fa60e0848d784a6dd461da6.png

package zhouls.bigdata.DataFeatureSelection.test;

import java.io.FileReader;

import java.io.IOException;

import java.util.Collections;

import java.util.HashMap;public classMyBufferedReaderDemo {/**

* @param args

* @throws IOException*/

public static voidmain(String[] args) throws IOException {

FileReader fr= new FileReader("buf.txt");

MyBufferedReader bufr= newMyBufferedReader(fr);

String line= null;while((line=bufr.myReadLine())!=null){

System.out.println(line);

}

bufr.myClose();

Collections.reverseOrder();

HashMap map= null;

map.values();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值