InputStream / OutputStream read()/ write()函数的相关性和用法

时间:2013-09-23 20:36:57

标签: java

对于java.io.InputStream,有两个主要读取函数 int read() public int read(byte [] b,int off,int len)

同样,对于java.io.OutputStream,有两个函数 write(b)和write((byte [] b,int off,int len))

虽然我理解了基本的区别,但是在阅读写(b)的描述时,它说“要写入的字节是参数b的8个低位.24个高位b被忽略了。“现在,如果是这种情况,那么我们实际上是浪费了32位指令集中的剩余24位,CPU会加载整数。相反,如果我使用另一个写((byte [] b,int off,int len)),那么我占用堆/堆栈的字节数组的大小。虽然我试图考虑哪一个更适合高可伸缩性,但我不能忽略写(b)浪费24位(3字节),而另一方面,如果我使用读/写(byte [] b,int off,int len),我冒着更高的堆栈大小。那么,最佳选择是什么?

在一种解决方法中,我尝试扩展InputStream和OutputStream,并通过提供一个字节[4]来使用所有32位来覆盖read(b)和write(b)函数。它工作得很好,但仍然要看看它是否有任何性能增强。它非常类似于使用读/写(4,0,int 4)

我将非常感谢您对此主题的任何帮助/评论。

2 个答案:

答案 0 :(得分:1)

使用带byte[]的版本不会将整个字节数组推入堆栈。您将对字节数组的引用推送到堆栈上。

除非您只编写单个字节,否则最好使用采用byte[]的版本。

答案 1 :(得分:1)

如果要实现速度,可能需要一次读取几个字节。例如,如果要在磁盘上写入/读取某些内容,则可能需要一次读取/写入完整扇区(4k或8k字节)。

此外,这样做可以最大限度地减少系统调用次数,从而使应用程序更快。

关于堆栈,在java中,字节数组将在堆上,并且只有引用存储在堆栈中,如@Mike所述。