java - 如何在java中连接字节数组而不是System.arrayCopy()方法

标签 java arrays compression

我正在尝试解压缩大约 1 GB 的大文件,但无法使用文件输出流方法。我的最终文档需要解压缩文件的字节数组来创建新文件。现在我已经手动增加每次读取的数组大小。但这对于大文件来说太慢了。有什么办法可以提高这种方法的效率吗?

      if (primaryDocumentInputStream != null) {
  byte[] tempbuffer = new byte[536870912];
  byte[] mainbuffer = new byte[536870912];
  int lenMainBuffer = 0;
  try {
    int aIntBuffer = aGZIPInputStream.read(tempbuffer);
    while (aIntBuffer > 0) {
      byte[] copyBuffer = new byte[lenMainBuffer + aIntBuffer];
      System.arraycopy(mainbuffer, 0, copyBuffer, 0, lenMainBuffer);
      System.arraycopy(tempbuffer, 0, copyBuffer, lenMainBuffer, aIntBuffer);
      mainbuffer = copyBuffer;
      aIntBuffer = aGZIPInputStream.read(tempbuffer);
      lenMainBuffer = mainbuffer.length;
    }
    primaryDocumentOutputDocument.setBody(mainbuffer);
    wfc.putPrimaryDocument(primaryDocumentOutputDocument);

  }

最佳答案

将您的数据写入 ByteArrayOutputStream 。它包装一个字节数组并在需要时调整它的大小。完成后,调用 toByteArray 返回字节。

ByteArrayOutputStream 与您在此处编写的内容之间的一个区别是,典型的实现将支持数组的大小加倍,这意味着写入 n 个字节具有 O(n) 摊销时间复杂度。如果像这里一样按固定增量增长数组,您将获得 O(n^2) 时间复杂度。

关于java - 如何在java中连接字节数组而不是System.arrayCopy()方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36532281/

相关文章:

java - 格式化数组元素

java - 未找到 Native Lcom/slytechs/library/NativeLibrary 的实现

python - 基于其他数组的掩码数组?

selenium - 如何压缩 Selenium 客户端和 Selenium 服务器之间的传输

c# - 在 C# 中从内存中的多个文件创建 Zip 存档

python - 将大数据数组压缩为 PNG 文件

Java Web 服务方法从 C# 客户端接收空参数

java - 如何部分解析 XML(仅 1 层深)

android - Volley jsonArray 请求不工作

python - 如何防止意外分配到空的 NumPy View