java - ByteArrayOutputStream.toByteArray() 还是从流中读取?

标签 java android stream

在我的 Android 应用程序中,我将数据存储在 ByteArrayOutputStream 中(目前最大约为 1 MB),我想将其传递给 DataOutputStream

最明显的方法当然是调用:

dataOS.write(byteArrayOS.toByteArray())

但是还有一种更复杂(但可能更有效)的方法:

ByteArrayInputStream rdr = new ByteArrayInputStream(byteArrayOS.toByteArray());
int read;
byte[] buffer = new byte[1024];
while ((read = rdr.read(buffer)) > 0){
    dataOS.write(buffer,0,read);
}

将来存储在 ByteArrayOutputStream 中的数据量可能会增长。这两者哪个效率更高?一次写入大量数据还是顺序写入?

更新:

DataOutputStream 用于通过网络写入(它是通过 UrlConnection.getOutputStream() 创建的)。

最佳答案

第一个更有效,因为它不是创建 N 个 1024 字节的 block 并将它们分别发送到 DataOutputStream,而是一次发送整个字节数组。

无论如何,您已经在内存中拥有了整个字节数组。有用的是从不从内存中字节数组(如文件或套接字输入流)读取的流中以 block 的形式读取和写入,因为这样可以避免将整个字节数组放在内存中。

关于java - ByteArrayOutputStream.toByteArray() 还是从流中读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18297694/

相关文章:

android - 迁移到 Android 11 后无法绑定(bind)到服务

android - 保证 android 继续检索传感器数据

c# - 计算校验和的流链接 : avoiding memory issues

powershell - 如何在 PowerShell 中将文件作为流逐行处理

c++读取文件太慢

java - JPA : Can we use different collection type on either sides of ManyToMany relationship?

java - Sun VM 与 IBM VM 的 -Xcheck :jni:alwayscopy? 的等效选项是什么

java - gwt 日期选择器中当前日期以外的日期

java - 使用 javafx 在对话框 Pane 上设置左上角图像

android - 如何混淆或加密客户端-服务器通信