12

バイト配列を返すAPI呼び出しがあります。現在、結果をバイト配列にストリーミングし、チェックサムが一致することを確認してから、ByteArrayOutputStreamをファイルに書き込みます。コードはこのようなもので、かなりうまく機能します。

    String path = "file.txt";
    ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
    int bufferSize = 1024;
    byte[] buffer = new byte[bufferSize];
    int len = 0;
    while ((len = inputStream.read(buffer)) != -1) {
        byteBuffer.write(buffer, 0, len);
    }
    FileOutputStream stream = new FileOutputStream(path); 
    stream.write(byteBuffer.toByteArray());

私の懸念は、inputstreamの結果がAndroidのヒープサイズよりも大きくなる可能性があり、バイト配列全体がメモリ内にある場合にOutOfMemory例外が発生する可能性があることです。バイト配列がヒープサイズより大きくならないように、inputStreamをチャンクでファイルに書き込む最も洗練された方法は何ですか?

4

2 に答える 2

15

には書き込まないでくださいByteArrayOutputStream。に直接書き込みますFileOutputStream

String path = "file.txt";
FileOutputStream output = new FileOutputStream(path); 
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
    output.write(buffer, 0, len);
}
于 2012-03-28T15:25:12.967 に答える
10

ByteArrayOutputStreamをスキップしてFileOutputStreamに書き込むようにアドバイスしましたが、これは私の懸念に対処しているようです。FileOutputStreamがBufferedOutputStreamによって装飾されている1つのクイック調整で

String path = "file.txt";
OutputStream stream = new BufferedOutputStream(new FileOutputStream(path)); 
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int len = 0;
while ((len = is.read(buffer)) != -1) {
    stream.write(buffer, 0, len);
}
if(stream!=null)
    stream.close();
于 2012-03-28T19:36:10.953 に答える