我正在尝试将一个大文件(> 20GB)分割成块来上传。
这是我的方法:
public List<byte[]> chunkFile() throws IOException {
File file = new File(backupPath);
List<byte[]> chunks = new ArrayList<>();
try (FileInputStream fis = new FileInputStream(file)) {
byte[] buffer = new byte[1024 * 1024 * 10];
int bytesRead;
while ((bytesRead = fis.read(buffer)) > 0) {
byte[] chunk = new byte[bytesRead];
System.arraycopy(buffer, 0, chunk, 0, bytesRead);
chunks.add(chunk);
}
return chunks;
}
}
它适用于小文件(500mb),但是当我尝试使用更大的文件时,我遇到了这个错误:
路径 [] 上下文中 servlet [dispatcherServlet] 的 Servlet.service() 抛出异常 [处理程序调度失败:java.lang.OutOfMemoryError:Java 堆空间],其根本原因
java.lang.OutOfMemoryError:Java 堆空间
我需要将文件分割成块,以便能够使用多部分文件上传到 s3。
您不能将 20Gb 放入堆中。即使您增加堆大小,这也将是一个非常糟糕的做法。
创建一个缓冲区并在创建后立即上传每个块。重用相同的缓冲区来加载下一个块。
您也可以使用临时文件。