前言----
昨天失眠,今天一大早又睡不着,睡了差不多只有4个小时.这篇博客写完,IO流的总结应该也差不多了, 不过写完差不多也要3点了,赶紧回宿舍补觉
饭后写了半小时后,困得不行,回宿舍睡到5点,拖到现在才补完了
注:欢迎转载,转载请注明来处
目录
一.什么是缓存流 ,为什么效率高?
- 首先我们以硬盘为介质先看看非缓存流的弊端(以字节流为例):
我们在操作系统 或者计算机组成的课上, 应该知道访问内存的速度>>访问硬盘的速度 , 我们在读写文件的时候,其实主要的时间花费就是在硬盘的访问上, 如果是字节流的话, 我们
- 在了解了非缓存流的弊端后, 我 可以明确的告诉你, 缓存流可以减少访问硬盘的次数来减少读取的时间, 效率高
我给大家画个图:
二. 从底层代码看缓冲流
附一篇博客(超链接)
注:最特别的是缓冲区的字节数组是可变长的
三.缓冲字节流
- 1.通过缓冲字节流从文件中读取字符
demo:
测试内容:"简1998"(GBK编码)
public void testBufferedIntputStream(File f) {
isFile(f);
byte[] myByte = new byte[10];
try(BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f))) {
while(bis.read(myByte)!=-1) {
}
System.out.println(new String(myByte, "GBK"));
}catch(Exception e ) {
e.printStackTrace();
}
测试结果:
- 2.通过缓冲字节流向文件中写入字符
demo:
测试内容:内容为空(Unicode编码)
public void testBufferedOutputStream(File f) {
isFile(f);
try(BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(f),10)) {
String str = "简1998";
bos.write(str.getBytes("Unicode"));
}catch(Exception e) {
e.printStackTrace();
}
}
测试结果:
四.缓冲字符流
- 1.通过缓冲字符流从文件中读取字符
缓冲流是在某个流的基础上提供缓冲区的功能,所以需要在构造函数中传流对象
demo:
文件测试内容:简1998(Unicode编码)
public void testBufferedReader(File f) {
isFile(f);
try(
FileInputStream is = new FileInputStream(f);
InputStreamReader isr= new InputStreamReader(is,Charset.forName("Unicode"));
BufferedReader br = new BufferedReader(isr)
){
char [] myChar = new char[(int)f.length()];
br.read(myChar);
System.out.println(myChar);
}catch(Exception e) {
e.printStackTrace();
}
}
测试结果:
- 2.用缓冲字符流向文件中写入
demo:
文件测试内容:内容为空GBK编码)
public void testBufferedWriter(File f) {
isFile(f);
String str = "简1998";
try(
OutputStreamWriter osw= new OutputStreamWriter(new FileOutputStream(f),Charset.forName("Unicode"));
BufferedWriter bw =new BufferedWriter(osw);
){
bw.write(str);
}catch(Exception e) {
}
}
测试结果:
五.对字节流有缓冲区的错误理解
大家应该知道FileInputStream中read方法有read(byte[] b), FileOutputStream中有write(byte[] b), 有很多人包括我一开始都没理解好,以为这也是缓冲区, 总以为访问一次硬盘也能读取多个字节, 后面发现了自己一开始就没理解好, 其实这是代表一次性读取或者写入b.length个字节, 但是不代表访问一次硬盘就能读取或者写入多个字节,这是缓冲区才有的功能!! 其实跟read(byte) ,write(byte)效率是一样的
大家可以看到,两者访问硬盘的次数都是差不多了