Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java InputStream/OutputStream read()/write()函数的相关性和用法_Java - Fatal编程技术网

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

Java InputStream/OutputStream read()/write()函数的相关性和用法,java,Java,对于java.io.InputStream,有两个主要的读取函数int read()和public int read(字节[]b,int off,int len) 类似地,对于java.io.OutputStream,有两个函数write(b)和write((字节[]b,int off,int len)) 虽然我理解基本的区别,但在阅读write(b)的描述时,它说“要写入的字节是参数b的8个低阶位。忽略了b的24个高阶位。”。如果是这样的话,那么我们实际上是在浪费CPU为整数加载的32位指令集

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

类似地,对于java.io.OutputStream,有两个函数write(b)和write((字节[]b,int off,int len))

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

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


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

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


除非您只写一个字节,否则最好使用采用
字节[]

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

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


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

谢谢Mike。你不认为对于带有局部变量的函数,整个数组都会被复制到堆栈中吗?如果字节数组是一个类变量,我理解它自然是一个引用,因为byte[]声明在堆上。请。让我知道你的想法。不。您可以在中找到有关这方面的更多信息。数组实际上被语言视为对象,并且总是这样传递。再次感谢Mike。我认为你的澄清澄清了我的疑虑。在下面的这篇文章中,@csoroiu建议使用大小为4K/8k的字节数组(等于硬盘上的扇区)。声明4K/8K字节是一个很好的技巧。然而,你不认为,在堆上声明一个块相当于硬盘上的扇区会很大吗?在我看来,一次写入的字节越多越好。(通常)根据规模,几千字节的空间不应该成为问题。(有多少个线程?多久分配一次空间?等等)谢谢。任何关于写入(b)的评论都会浪费24位(3字节)?谢谢。声明4K/8K字节是一个很好的技巧。然而,你不认为,在堆上声明一个相当于硬盘扇区的块会很大吗?你不认为对于带有局部变量的函数,整个数组都会被复制到堆栈中吗?如果byte array是一个类变量,我理解它自然是一个引用,因为byte[]声明在堆上。@Ashley,我认为您对数组在Java中的工作方式有一个误解。看见数组总是存储在堆上。@Ashley磁盘上的4k/8k与jvm存储在应用程序内存中的其他东西相比是非常小的。再次感谢。我认为现在很清楚,数组总是存储在堆上,而不管它们的作用域是类还是本地函数。这也澄清了为什么读/写(字节[])更好。另一方面,我对你们关于磁盘扇区的回答有点困惑。4K/8K对于硬盘来说很小,但对于阵列大小(加载到内存时),它仍然是一个很大的数字。不是吗?@Ashley如果你有一台1GB=1024MB=1048576KB内存的电脑,那么4KB真的很小。