FileWriter为什么有缓冲区还是慢

缓冲和非缓冲的区别我就不想说了,除了什么缓冲比较快用车子拖和你一个人搬,下面是我研究的一些I问题

在使用FileWriter时,证明:

非缓冲流也有缓冲区,在单个字节读取时,

//m2缓冲m1非缓冲
//相同的输出流,in是缓冲流,in1是非缓冲
m2(in,f1);

m1(in1,f1);

相同的输出流,显然m2一直比m1快效率甚至快了很多

在实验非缓冲有没有缓冲区时:

FileWriter out=new
FileWriter(a);

out.write(“123”);

发现文件是空的

再加上FileWriter out=new FileWriter(a);

out.write(“123”);

out.flush();

发现文件中写入了内容

经过实验,发现FileWriter在写入8193个字节时会进行写入

不过他的缓冲区是直接在内存中的,读取时还是一个字符一个字符进入内存,还是很浪费时间,同理在读取时也是如此

BufferWriter在写入8192*3+1时才会写入

他的缓冲区不在内存中,他的读取是还在文件中,不过记住了读取哪些文件然后一股脑传入内存。

这是缓冲字节流:

public BufferedOutputStream(OutputStream
out) {

this(out, 8192);

}
8192是缓冲区大小

这是缓冲字符:

private static int defaultCharBufferSize =
8192;

8192个字符

在缓冲中都可以发现缓冲区的踪影,但是非缓冲我找了很久没找到,令人疑惑的是非缓冲如果只写入一个字符时,不关闭流也不进行flash操作,这个字符就不会写入。

下面将会进行解释:

1、只要有输出流写入文件,一旦你的append属性没有设置true那么就会出现文件直接清空,你读取文件都是读取不到的。只要建立连接就会清空文件内容。

BufferedReader in = new BufferedReader(new FileReader(“day02/a.txt”));

BufferedWriter out = new BufferedWriter(new FileWriter(“day02/a.txt”));

System.out.println(in.readLine());

输出结果:

Null

2、使用InputStreamReader可以把指定的字节流按照指定编码格式进行转换为字符

OutputStreamWriter可以把字符流按照指定编码转换字节

3、FileWriter内部有一部分自处理内存,底层虽然是使用字节流实现但是他进行了一部分的处理导致没有输出,所以说它是有缓冲区但是他的缓冲是字符缓冲,字符缓冲之后,还要把它转换回字节,然后给它再一个一个传给输出流,再把它一个字节一个字节的转回字符,再一个一个写入文件。

Writer类中的缓冲大小:

private static final int WRITE_BUFFER_SIZE = 1024;

字节流是没有缓冲的所以最后还是一个字节的传递,所以速度还是很慢,缓冲的字符和字节是单独分开的,字符流的底层不是字节,所以节省了非缓冲字符最后还要转换字节的时间。
结论就是FileWriter有1024字符大小的缓冲区,但是底层是字节实现的,FileOutputStream是没有缓冲区的,所以还是慢。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值