java - InputStream/OutputStream read()/write()函数相关性及用法

标签 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))

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

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

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

最佳答案

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

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

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

关于java - InputStream/OutputStream read()/write()函数相关性及用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18968372/

相关文章:

java - Storm KafkaSpout 停止消费来自 Kafka Topic 的消息

带有首字母缩略词的 Java 命名约定

java - 使用 Maven Central 作为辅助存储库

java - 将批处理文件打包到 jar 文件中

Java用数字初始化一个数组

java - Gson忽略序列化排除策略

java - 如何提高Spring Boot应用程序的性能

java - 如何将基于 Rest 的 Java Web 应用程序与 okta 集成以实现 sso?

如果不满足条件则忽略方法调用的 Java 注释

java - 如何制作面向android的应用程序修复?