gpt4 book ai didi

java - 写一个巨大的文件和 Java 堆空间

转载 作者:行者123 更新时间:2023-12-03 23:18:54 25 4
gpt4 key购买 nike

我正在尝试将一个500mb 到 1.5 gb 之间的大文件写入磁盘。我使用 zipOutputStream 压缩它然后通过网络发送它

但在客户端中,当我尝试解压和写它,它给了我 Java heap space. exception

  try (FileOutputStream fos = new FileOutputStream(outFile)) {
int fileLength = (int)zipEntry.getSize();

byte[] fileByte = new byte[fileLength];
zips.read(fileByte);
fos.write(fileByte);
}

我知道字节数组的内存分配相当大,但我怎么可能修复它?

最佳答案

您创建的 byte[] 数组是您的缓冲区,该缓冲区在从您的 InputStream 传输到您的 期间用作堆中的临时位置输出流。除非您希望您的程序在内存中使用 500mb - 1.5gb,否则您需要减少缓冲区大小。这是我用于执行此操作的常用方法。此方法使用 1kb 缓冲区,您可以调整大小并查看最适合您的大小。

/**
* writes all bytes from inputStream to outputStream
* @param source
* @param destination
* @throws IOException
*/
public static void pipeStreams(java.io.InputStream source, java.io.OutputStream destination) throws IOException {

// 1kb buffer
byte [] buffer = new byte[1024];
int read = 0;
while((read=source.read(buffer)) != -1) {
destination.write(buffer, 0, read);
}
destination.flush();
}

使用此方法的代码看起来像

try (FileOutputStream fos = new FileOutputStream(outFile)) {
pipeStreams(zips, fos);
}

关于java - 写一个巨大的文件和 Java 堆空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24227597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com