标签:回车 必须 copy 的区别 高效 throws ide private ++
其实就是将数组进行封装。变成对象后,方便于对缓冲区的操作,提高效率。并提供了对文本便捷操作的方法。readLine( )&newLine( )。
缓冲区的基本思想就是对要处理的数据进行临时存储。譬如购物车以及篮子。
原理:减少频繁的操作,给读取流对象和写入流对象提供中转站,相对于来回跑的麻烦,利用缓冲区的容量,可以一边先存储,满了后再写入的方式,这样就提高了效率。
BufferedWriter的特有方法:newLine():跨平台的换行符。
BufferedReader的特有方法:readLine():一次读一行,到行标记时,将行标记之前的字符数据作为字符串返回。当读到末尾时,返回null。(返回的字符是不带回车符的)
在使用缓冲区对象时,要明确,缓冲的存在是为了增强流的功能而存在的,所以在建立缓冲区对象时,要先有流对象存在。其实缓冲内部就是在使用流对象的方法,只不过加入了数组对数据进行了临时存储,为了提高操作数据的效率。
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();
其实缓冲区中的该方法,用的还是与缓冲区关联的流对象的read方法,只不过,每一次读到一个字符,先不进行具体操作,而是进行临时存储。当读到回车标记时,将临时容器中的数据一次性返回。----->StringBuilder调用了buff.read()将缓冲区中的数据存储到了该容器中。
缓冲区的read()和流对象的read()方法的区别?
流对象:从目的地一次读取一个字符
缓冲区:通过流对象的read([])将一批数据读取到缓冲数组,然后在数组中一次取一个字符,内存比硬盘操作要高效。
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 }
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