我正在使用这段复制大文件.Android正好在32个缓冲区加载时因"内存不足"而崩溃.它就像dos.write将数据放入一个大缓冲区,而不是将其假脱机到i/o设备.没有异常被抛出.
bufferSize = 512*1024.bis是BufferedInputStream.byteArray是一个ByteArrayBuffer,
try {
FileOutputStream fos = new FileOutputStream(file);
dos = new DataOutputStream(fos);
int current = 0;
while((current = bis.read()) != -1){
byteArray.append((byte)current);
if (byteArray.isFull()){
byte[] b = byteArray.toByteArray();
dos.write(b, 0, bufferSize);
byteArray.clear();
}
}
int count = byteArray.length();
byte[] b = byteArray.toByteArray();
dos.write(b, 0, count);
dos.flush();
dos.close();
bis.close();
}
catch (Exception e) {
RunTimeError("Exception: " + e);
return false;
}
Run Code Online (Sandbox Code Playgroud)
我的猜测是因为某种原因byteArray.isFull()总是回来false.然后当你加载了16MB的数据时,你就会内存不足.我不会打扰ByteArrayBuffer.(就此而言,512KB对于这种操作来说太大了.你应该尝试匹配文件I/O块大小.它可能因设备而异,但4K-8K可能很接近.)你也不要吨需要包装fos在一个DataOutputStream; 你只是在写字节.一BufferedOutputStream,在另一方面,可能是有用的.如果bis没有缓冲,将它包装在BufferedInputStream遗嘱中也会有所帮助.
我会像这样重写你的代码:
BufferedOutputStream bos = null;
try {
bos = new BufferedOutputStream(new FileOutputStream(file), 8192);
byte[] buffer = new byte[1024];
int len = 0;
while((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
} catch (Exception e) {
RunTimeError("Exception: " + e);
return false;
} finally {
try { bis.close(); } catch (Exception ignored) { }
try { bos.close(); } catch (Exception ignored) { }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2947 次 |
| 最近记录: |