19.Java IO: BufferedInputStream && BufferedOutputStream

来源:互联网 发布:js实现dos窗口效果 编辑:程序博客网 时间:2024/04/28 13:56

本文是在Java IO: BufferedInputStream 和 Java IO: BufferedOutputStream翻译而来。

BufferedInputStream

BufferedInputStream类给你的输入流提供缓存。缓存可以提升一点输入输出的速度。BufferedInputStream每次读取更大的数据块到内存,而不是每次从网络或磁盘读取字节。当你从BufferedInputStream中读取字节,所有你是从它的内部缓存区读取数据的,当缓存已被完全读取,BufferedInputStream会读取另一个更大的数据块到内存缓存区。通常这样会比每次从InputStream读取一个字节要快太多,特别对磁盘和更大量的数据。

BufferedInputStream例子

给InputStream添加缓存,简单地讲它包装成BufferedInputStream。像这样:

InputStream input = new BufferedInputStream(new           FileInputStream("c:\\data\\input-file.txt"))

和你看到的一样,用BufferedInputStream给无缓存的InputStream加缓存太简单了。BufferedInputStream内部创建字节数组,通过调用InputStream底层的InputStream.read(byte[])方法,试图填充数组。

给BufferedInputStream设置缓存大小

你可以内部用BufferedStream设置缓存大小。给BufferedInputStream的构造方法传一个缓存大小的参数,想这样:

int bufferSize = 8 * 1024;InputStream input = new BufferedInputStream(      new FileInputStream("c:\\data\\input-               file.txt",bufferSize));

这个例子设置了内部缓存大小为8KB。使用缓存大小为1024个字节的倍数是最好的。这样和大多数内置缓存的硬盘等工具工作最好。

除了对你的输入流添加缓存,BufferedInputStream的行为表现和InputStream一样。

BufferedInputStream最优缓存大小

要找出哪一个缓存大小在具体的硬件上回表现最好,你需要对不同的缓存大小做一些实验。最优缓存大小可能取决于你在磁盘或网络InputStream下使用BufferedInputStream。

在使用磁盘或网络流时,最优缓存大小也取决于电脑上的具体硬件。如果硬盘在任何方式下每次最小读取4KB数据,用小于4KB的缓存大小是很蠢得,用4kB倍数的缓存大小是更好的。比如,用6KB缓存大小也是很蠢的。

即使你的磁盘每次读取如4KB的数据块,用比4KB大的缓存仍是个好想法。磁盘擅长连续地读取数据-意味着它擅长读取在存储位置上一个接着一个的多个数据。因此,BufferedInputStream用16KB的缓存,或者64KB的缓存(或者更大)可能比只用4KB的缓存给你更好的性能。

也要记住的是,有些应硬盘有兆字节的读取缓存。如果你的硬盘以任意大小缓存读取数据,像64KB,读取文件到内存里,你也可以用一个读取操作获取所有的数据到BufferedInputStream里,而不是多个读取操作。多个读取操作会很慢,同时你也冒着在读取操作之间硬盘的读取缓存擦除,导致硬盘重新读取数据块到缓存里。

为了找到最优BufferedInputStream缓存大小,找到你的硬盘读取的数据块大小,可能也是它的缓存大小,确保缓BufferedInputStream缓存大小是这个大小的倍数。你确实得实验以找到最优缓存大小。通过测量不同缓存大小的读取速度就可以了。

mark()和reset()方法

注意一个有趣的关于BufferedInputStream的现象,那就是它支持mark()和reset()方法,这是从InputStream继承来的。不是所有的InputStream子类都支持这俩个方法。大体上,你可以调用markSupport()方法来确定已给出的InputStream支不支持mark()和reset()方法,但是BufferedInputStream支持这俩个方法。

BufferedOutputStream

BufferedOutputStream类给输出流提供缓存。缓存可以提升一点输入输出的速度。每次写更大的数据块,而不是每次向网络或磁盘写入字节。通常这样会要快太多,特别对磁盘和更大量的数据。

简单地讲OutputStream包装成BufferedOutputStream就可缓存OutputStream.像这样:

    OutputStream output = new BufferedOutputStream(                new FileOutputStream("                c:\\data\\output-file.txt"));

设置BufferedOutputStream缓存大小

你可以设置缓存大小来内部使用BufferedOutputStream。你像一个构造对象参数设置这个大小,像这样:

    int bufferSize = 8 * 1024;    OutputStream output = new BufferedOutputStream                (new FileOutputStream(                "c:\\data\\output-file.txt")                ,bufferSize);

例子设置了内部缓存到8KB。最好使用1024字节倍数的缓存大小。这样和内置缓存的硬盘等硬件工作会最好。

除了对你的输出流加入缓存,BufferedOutputStream和OutputStream表现的完全一样。唯一不同的是,如果你完全保证到现在已写的数据刷入缓存、到网络或磁盘,需要调用flush()方法。

BufferedOutputStram最优缓存大小

要找出哪一个缓存大小在具体的硬件上回表现最好,你需要对不同的缓存大小做一些实验。最优缓存大小可能取决于你在磁盘或网络OutputStream下使用BufferedOutputStream。

在使用磁盘或网络流时,最优缓存大小也取决于电脑上的具体硬件。如果硬盘在任何方式下每次最小写入4KB数据,用小于4KB的缓存大小是很蠢得,用4kB倍数的缓存大小是更好的。比如,用6KB缓存大小也是很蠢的。

即使你的磁盘每次写入如4KB的数据块,用比4KB大的缓存仍是个好想法。磁盘擅长连续地写入数据-意味着它擅长吸入在存储位置上一个接着一个的多个数据。因此,BufferedOutputStream用16KB的缓存,或者64KB的缓存(或者更大)可能比只用4KB的缓存给你更好的性能。

为了找到最优BufferedOutputStream缓存大小,找到你的硬盘写入的数据块大小,可能也是它的缓存大小,确保缓BufferedOutputStream缓存大小是这个大小的倍数。你确实得实验以找到最优缓存大小。通过测量不同缓存大小的写入速度就可以了。

0 0
原创粉丝点击