java 缓冲区read方法_牛客网Java刷题知识点之字符流缓冲区、BufferedWriter、BufferedReader、BufferedReader-readLine方法原理、自定义MyBu...

不多说,直接上干货!

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

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

什么是字符流缓冲区?

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

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

即BufferedReader 比 FileReader要增强。

BufferedWriter 比 FileWriter要增强。

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

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

79148251702bd892378e940bafa2cdf4.png

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

042f2189d66aa1e712afeec0f7739e8b.png

BufferedWriterDemo.java

445d9690547e55139553d1896e7afb65.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();

}

}

由fw变成bufw

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

BufferedReaderDemo.java

b68c885836eafb71e92ecf2a2b5e4036.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();

}

}

BufferedReader-readLine方法原理

b39b30754cda5e3c25e2b4138b05114b.png

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

18f26bc8f076ce1c4483dfbda25f4302.png

MyBufferedReader.java

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

即BufferedReader 比 FileReader要增强。

BufferedWriter 比 FileWriter要增强。

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 {

}

}

MyBufferedReaderDemo.java

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();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值