Java的 io流( 七 )


字节缓冲流的基本原理
创建缓冲流后,在实际写入与读取时还是用的基本流,只是数据在内存的的过程中用到了缓冲流
每一个缓冲流对象都会创建一个缓冲区
整体过程就是:
首先基本流读取数据,一次性读8192个数据,把读取到的数据放到缓冲区当中,而中间的变量就是一个中转站,把数据从缓冲输入流的缓冲区转移到缓冲输出流的缓冲区
,当右边的缓冲区填满了,就会利用基本流自动的写出数据,当变量在缓冲输入流的缓冲区读不到数据了,这时基本流又会读取8192个数据,然后循环,直到文件读取完毕 。
由于数据从硬盘到硬盘转移到内存中去,所以效率提高
如果中间变量是数组,原理也类似,只不过中间变量变成了数组
字符缓冲流
提高效率的原理:
底层自带了长度8192的缓冲区提高性能
方法名说明
( r)
把基本流变成高级流
( w)
把基本流变成高级流
方法名说明
()
读取一行数据,如果没有数据可读了,会返回null
方法名说明
()
跨平台的换行
之前写换行是\r\n但是这不合理,因为只有在中是\r\n,在Mac中是\r,在Linux中是\n
所以|() | 跨平台的换行 |是一个很有用的方法,方法的底层会先判断程序运行的是什么操作系统,然后给出相应的值来换行
public static void main(String[] args) throws IOException {BufferedReader br=new BufferedReader(new FileReader("D:\\我的世界\\a1.txt"));//一次读取一行,与read一样,再次读取会读取下一行//readLine遇到回车换行结束,但是不会把回车和换行读到内存中//String s1 = br.readLine();//System.out.println(s1);////String s2 = br.readLine();//System.out.println(s2);//殷勤昨夜三更雨,又得浮生一日凉 。——《鹧鸪天·林断山明竹隐墙》我//何日功成名遂了,还乡,醉笑陪公三万场 。//一次读取所有数据String line;while((line=br.readLine())!=null){System.out.println(line);}//殷勤昨夜三更雨,又得浮生一日凉 。——《鹧鸪天·林断山明竹隐墙》我//何日功成名遂了,还乡,醉笑陪公三万场 。//何日功成名遂了//12345//123br.close();}
public static void main(String[] args) throws IOException {//这里write的续写要在基本流里打开BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\我的世界\\b2.txt",true));String s1="画堂人静雨蒙蒙,屏山半掩余香袅 。";bw.write(s1);bw.newLine();String s2 = "——寇准《踏莎行·春暮》";bw.write(s2);bw.newLine();bw.close();//画堂人静雨蒙蒙,屏山半掩余香袅 。//——寇准《踏莎行·春暮》}
小结
综合练习
public static void main(String[] args) throws IOException {//基本流FileInputStream fis=new FileInputStream("D:\\我的世界\\UnitySetup64-2020.3.47f1c1.exe");FileOutputStream fos1=new FileOutputStream("D:\\我的世界\\copy1.txt");FileOutputStream fos2=new FileOutputStream("D:\\我的世界\\copy2.exe");long l1 = System.currentTimeMillis();int b1;while((b1=fis.read())!=-1){fos1.write(b1);}long l2 =System.currentTimeMillis();System.out.println(l2-l1);byte[]bytes1=new byte[1024];long l3 = System.currentTimeMillis();System.out.println(l3);int len1;while ((len1=fis.read(bytes1))!=-1){fos2.write(bytes1,0,len1);}long l4 = System.currentTimeMillis();System.out.println(l4);System.out.println(l4-l3);fos2.close();fos1.close();fis.close();//缓冲流BufferedInputStream bis=new BufferedInputStream(new FileInputStream("D:\\我的世界\\a1.txt"));BufferedOutputStream bos1=new BufferedOutputStream(new FileOutputStream("D:\\我的世界\\copy3.txt"));BufferedOutputStream bos2=new BufferedOutputStream(new FileOutputStream("D:\\我的世界\\copy4.txt"));long l5 = System.currentTimeMillis();int b2;while((b2=bis.read())!=-1){bos1.write(b2);}long l6 =System.currentTimeMillis();System.out.println(l6-l5);byte[]bytes2=new byte[1024];long l7 = System.currentTimeMillis();int len2;while ((len2=bis.read(bytes2))!=-1){bos2.write(bytes2,0,len2);}long l8 = System.currentTimeMillis();System.out.println(l8-l7);bos2.close();bos1.close();bis.close();}