InputStream读取文件和输出的一部分

时间:2016-12-19 18:21:59

标签: java heap

我有一组大文件(每个大约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

2 个答案:

答案 0 :(得分:1)

最大数组长度略小于Integer.MAX_VALUE,即大约2e9。因此,您无法将整体读入byte[]并且必须使用其他内容。 ByteByffer可能是最快的解决方案(内存映射文件)。

答案 1 :(得分:1)

您不会显示getBytesFromIS(is),但假设它会读取整个文件,则表示没有必要。

最简单的方法是使用已经提供此功能的库并进行全面测试。例如,Apache Commons IOUtils

否则,您可以使用InputStream.read(b, off, len),从0的偏移量开始,并使用所需的长度。 请注意,此功能 保证无法读取您想要的全部数据。