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

时间:2016-04-10 16:20:33

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

  }

1 个答案:

答案 0 :(得分:3)

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

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