2013-09-23 100 views
1

对于java.io.InputStream中,有两个主要的功能读INT 读()和公共INT读(字节[] B,诠释断, int len)的InputStream/OutputStream的读()/ write()函数的相关性和用法

类似地,对于java.io.OutputStream中有两个功能写入(b)和写((字节[] B,诠释断,INT LEN))

虽然我理解的基本差异,但在阅读写(b)的描述时,它表示它说:“要写入的字节是参数b的八个低位,而b的24个高位被忽略。”现在如果是这样的话,那么我们实际上是在浪费32位指令集中的剩余24位,CPU将加载一个整数。相反,如果我使用其他写入((byte [] b,int off,int len)),那么我将占用堆栈/堆栈以获取字节数组的大小。虽然我试图想到哪一个更适合高可伸缩性,但我不能忽视写(b)浪费24位(3字节),而另一方面,如果我使用读/写(byte [] b,int关闭,int len),我有更高的堆栈大小的风险。那么,什么是最好的选择?

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

我将不胜感激任何关于此主题的帮助/评论。

回答

1

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

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

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

+0

谢谢。声明4K/8K字节是一个很好的提示。但是,你不觉得,在硬盘上声明一个相当于扇区的块会很大吗?你不认为对于具有局部变量的函数,整个数组将被复制到堆栈?在字节数组是一个类变量的情况下,我明白它自然是一个引用,因为byte []声明在堆上。 – Ashley

+0

@Ashley,我想你对Java中的数组如何工作存在误解。看到[这个问题](http://stackoverflow.com/questions/2099695/java-array-is-stored-in-stack-or-heap)。数组总是存储在堆上。 – mpontillo

+0

@Ashley在磁盘上的4k/8k相比其他应用程序的内存中的jvm存储相当小。 – Claudiu

1

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

除非您只写一个字节,否则最好使用需要byte[]的版本。

+0

谢谢迈克。你不认为对于具有局部变量的函数,整个数组将被复制到堆栈?在字节数组是一个类变量的情况下,我明白它自然是一个引用,因为byte []声明在堆上。 PLS。让我知道你的想法。 – Ashley

+0

不可以。您可以在[Java语言规范](http://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html)中找到关于此的更多信息。数组实际上被语言认为是对象,并且总是这样传递。 – mpontillo

+0

再次感谢迈克。我认为你的澄清已经清除了我的疑虑。在下面的这篇文章中,@csoroiu建议使用4K/8k大小的字节数组(等于硬盘上的扇区)。声明4K/8K字节是一个很好的提示。但是,你不觉得,在硬盘上声明一个相当于扇区的块会很大吗? – Ashley