我有一组大文件(每个大约2-3GB),我需要使用InputStream
来读取它并将其中一部分输出到新文件中。
//this is just for example
int size=100;
String src="pathtofile";
OutputStream os = null;
Inputstream is = new FileInputStream(new File(src));
byte[] buffer = new byte[size];
byte[] bufferis = getBytesFromIS(is);
buffer=Arrays.copyOfRange(bufferis,0,buffer.length);
String tempstr=new String(buffer);
byte[] tempBytes=Arrays.copyOfRange(bufferis, buffer.length,is.available());
os = new FileOutputStream(new File(dest));
copy(new ByteArrayInputStream(tempBytes), os); //function writing to file
这适用于小文件,但在大文件上使用时,即使我设置OutOfMemoryError
,我仍然会收到-Xmx6114m
,但仍然获得OutOfMemoryError
。
答案 0 :(得分:1)
最大数组长度略小于Integer.MAX_VALUE
,即大约2e9
。因此,您无法将整体读入byte[]
并且必须使用其他内容。 ByteByffer
可能是最快的解决方案(内存映射文件)。
答案 1 :(得分:1)
您不会显示getBytesFromIS(is)
,但假设它会读取整个文件,则表示没有必要。
最简单的方法是使用已经提供此功能的库并进行全面测试。例如,Apache Commons IOUtils。
否则,您可以使用InputStream.read(b, off, len),从0的偏移量开始,并使用所需的长度。 请注意,此功能 保证无法读取您想要的全部数据。