码迷,mamicode.com
首页 > 其他好文 > 详细

字符流缓冲区

时间:2020-09-17 13:01:26      阅读:33      评论:0      收藏:0      [点我收藏+]

标签:回车   必须   copy   的区别   高效   throws   ide   private   ++   

 

1、字符缓冲区的原理

其实就是将数组进行封装。变成对象后,方便于对缓冲区的操作,提高效率。并提供了对文本便捷操作的方法。readLine( )&newLine( )。

 

缓冲区的基本思想就是对要处理的数据进行临时存储。譬如购物车以及篮子。

原理:减少频繁的操作,给读取流对象和写入流对象提供中转站,相对于来回跑的麻烦,利用缓冲区的容量,可以一边先存储,满了后再写入的方式,这样就提高了效率。

BufferedWriter的特有方法:newLine():跨平台的换行符。

BufferedReader的特有方法:readLine():一次读一行,到行标记时,将行标记之前的字符数据作为字符串返回。当读到末尾时,返回null。(返回的字符是不带回车符的)

在使用缓冲区对象时,要明确,缓冲的存在是为了增强流的功能而存在的,所以在建立缓冲区对象时,要先有流对象存在。其实缓冲内部就是在使用流对象的方法,只不过加入了数组对数据进行了临时存储,为了提高操作数据的效率

2、代码上的体现

A:写入缓冲区对象-------->带缓冲区的写操作,一般都要进行刷新!

建立缓冲区对象必须把流对象作为参数传递给缓冲区的构造函数。

1 BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));
2 
3 bw.write("abcd");//将数据写入缓冲区
4 
5 bw.flush();//对缓冲区的数据进行刷新,将数据刷到目的地中
6 
7 bw.close();//关闭缓冲区,其实关闭的是被包装在内部的流对象。

 

B:读取缓冲区对象

 1 BufferedReader br = new BufferedReader(new FileReader("b.txt"));
 2 
 3 String line = null;
 4 
 5 while((line= br.readLine)!=null){
 6 
 7 System.out.println(line);
 8 
 9  }
10 
11 br.chose();

 

3、readLine( )方法的原理

其实缓冲区中的该方法,用的还是与缓冲区关联的流对象的read方法,只不过,每一次读到一个字符,先不进行具体操作,而是进行临时存储。当读到回车标记时,将临时容器中的数据一次性返回。----->StringBuilder调用了buff.read()将缓冲区中的数据存储到了该容器中。

 缓冲区的read()和流对象的read()方法的区别?

流对象:从目的地一次读取一个字符

缓冲区:通过流对象的read([])将一批数据读取到缓冲数组,然后在数组中一次取一个字符,内存比硬盘操作要高效。

4、自定义缓冲区MyBufferedReader

 1 /*
 2  * 模拟一个缓冲区
 3  * 基于已有的缓冲区思想,我们可以从源读取用read方法。
 4  * 我们的缓冲区,应该是一个更高效的read读取方法。
 5  */
 6 public class MyBufferedReader extends Reader{
 7     private Reader r;
 8     private char[] buf = new char[1024];
 9 //用于记录缓冲区数据的个数
10     private int count = 0,pos = 0;
11     public MyBufferedReader(Reader r){
12         this.r = r;
13     }
14     /**
15      * 一次从缓冲区中取一个
16      * @return    返回一个缓冲区中的字符
17      * @throws IOException 
18      */
19     public int myRead() throws IOException {
20         //1,首先判断缓冲区中是否有数据,如果没有就从源中去拿。
21         if(count == 0){
22 //读取一批数据到缓冲数组buf中
23             count = r.read(buf);
24             pos = 0;
25         }
26         //2,当缓冲区中没数据了且源中也没有数据时,count自减1小于0时就返回-1结束.
27         if(count < 0)
28             return -1;
29         //3,如果以上都不满足,那么从缓冲区中写入一个字符到新的文件中。
30         char ch = buf[pos];
31         pos++;
32         count--;
33         return ch;
34     }
35     /**
36      * 按照文本特点,提供一个特有的操作文本的方法。
37      * 一次读取一行文本,只要是到行结束符之前的文本即可。
38      * @return 返回读取到的一行文本
39      * @throws IOException
40      * 原理:就是从缓冲区中取出数据,并存储到一个临时容器中。
41      *     如果取到了回车符,就将临时容器中的数据转成字符串返回。
42      */
43     public String myReadLine() throws IOException{
44         //1,定义一个临时容器,进行临时存储
45         StringBuilder sb = new StringBuilder();
46         //2,定义一个变量,接收读取到的字符对应的二进制(ASCII),0-65535
47         int ch = 0;
48         while((ch = myRead()) != -1){
49             //3,当读取到\r时,直接跳出本次循环,进行下次循环
50             if(ch == ‘\r‘)
51                 continue;
52             //4,当读取到\n时,直接跳出当前循环
53             if(ch == ‘\n‘)
54                 return sb.toString();
55             //5,当都没有读取到时,就将这些数据存储到临时容中。
56             sb.append((char)ch);
57         }
58         //6,当临时容器中的长度不等于0时,就输出字符。
59         if(sb.length() != 0)
60             return sb.toString();
61         return null;
62     }
63     @Override
64     public void close() throws IOException {
65     }
66     @Override
67     public int read(char[] arg0, int arg1, int arg2) throws IOException {    
68         return 0;
69     }
70 }

 

 

5、通过缓冲区的形式,对文本文件进行拷贝

 1 public class BufferCopyTest {
 2     public static void main(String[] args) throws IOException {
 3         BufferedReader br = new BufferedReader(new FileReader("e:\\a.txt"));
 4         BufferedWriter bw = new BufferedWriter(new FileWriter("i:\\copy.txt"));
 5         String line = null;
 6         while((line = br.readLine())!=null){//高效读操作
 7             bw.write(line);//高效写
 8             bw.newLine();//换行符
 9             bw.flush();
10         }
11         bw.close();
12         br.close();
13     }
14 }

 

 

字符流缓冲区

标签:回车   必须   copy   的区别   高效   throws   ide   private   ++   

原文地址:https://www.cnblogs.com/rookie-10/p/13613501.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!