Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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中连接字节数组而不是System.arrayCopy()方法_Java_Arrays_Compression - Fatal编程技术网

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

如何在java中连接字节数组而不是System.arrayCopy()方法,java,arrays,compression,Java,Arrays,Compression,我正在尝试解压缩一个大小约为1GB的大文件,但无法使用文件输出流方法。我的最终文档需要解压缩文件的字节数组来创建新文件。目前,我一直在为每次读取手动增加数组大小。但是这对于大文件来说太慢了。这种方法有没有办法提高效率 if (primaryDocumentInputStream != null) { byte[] tempbuffer = new byte[536870912]; byte[] mainbuffer = new byte[536870912]; int l

我正在尝试解压缩一个大小约为1GB的大文件,但无法使用文件输出流方法。我的最终文档需要解压缩文件的字节数组来创建新文件。目前,我一直在为每次读取手动增加数组大小。但是这对于大文件来说太慢了。这种方法有没有办法提高效率

      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);

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

ByteArrayOutputStream与您在这里编写的内容之间的一个区别是,典型的实现是备份数组大小的两倍,这意味着写入n个字节的时间复杂度为O(n)。如果按如下所示的固定增量增长数组,则会得到O(n^2)的时间复杂度。

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


ByteArrayOutputStream与您在这里编写的内容之间的一个区别是,典型的实现是备份数组大小的两倍,这意味着写入n个字节的时间复杂度为O(n)。如果按此处所示的固定增量增长数组,您将获得O(n^2)的时间复杂度。

比什么更有效,执行与此相同的操作,但使用自己编写的代码?不,它的效率也差不多,除非你犯了错误,最后写了更糟糕的东西。比我的代码在这个问题上做的效率更高。谢谢你的帮助。我以这种方式更新了代码,但得到了以下错误:线程“main”java.lang.OutOfMemoryError中的异常:java堆空间ByTearrayOutStream数据=new ByTearrayOutStream();请尝试{int-aIntBuffer=gZIPInputStream.read(buffer);而(aIntBuffer>0){data.write(buffer);}这意味着JVM没有足够的内存来保存所有解压缩的数据。如果文件有1GB的数据,则应将堆大小增加到至少3或4GB。上一条评论是对另一个人的回应,他后来顺便删除了他们的评论。比什么更有效,做同样的事情,但使用编写的代码你自己吗?不,它的效率也差不多,除非你犯了错误并最终写了更糟糕的东西。比我的代码在问题中所做的效率更高。谢谢你的帮助。我以这种方式更新了代码,但我得到了以下错误:线程“main”中的异常java.lang.OutOfMemoryError:java堆空间ByteArrayOutputStream data=new ByteArrayOutputStream();尝试{int-aIntBuffer=gzip输入流.read(buffer);while(aIntBuffer>0){data.write(buffer);}这意味着JVM没有足够的内存来保存所有解压缩的数据。如果文件有1GB的数据,则应将堆大小增加到至少3或4GB。上一条注释是对另一个人的响应,他后来顺便删除了他们的注释。您可以保留一个缓冲区列表,并在最后只执行一次分配/复制。Or您使用较大的初始缓冲区(可能使用已知的扩展大小)。但最终,您调用的方法需要重新设计,该方法需要一个大字节数组。您可以保留一个缓冲区列表,并在最后只执行一次分配/复制。或者您使用较大的初始缓冲区(可能使用已知的扩展大小)。但最终,您正在调用的方法需要重新设计,该方法需要一个大字节数组。