Как записать потенциально огромный InputStream в файл? - PullRequest
11 голосов
/ 28 марта 2012

У меня есть вызов 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());

Я обеспокоен тем, что результат от inputtream потенциально может быть больше размера кучи в Android, и я могу получить исключения OutOfMemory, если весь байтовый массив находится в памяти.Каков самый элегантный способ записи inputStream в файл в виде кусков, чтобы байтовый массив никогда не превышал размер кучи?

Ответы [ 2 ]

14 голосов
/ 28 марта 2012

Не пишите на 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);
}
10 голосов
/ 28 марта 2012

Я пошел с советом пропустить ByteArrayOutputStream и записать в FileOutputStream, и это, кажется, решает мои проблемы. С одной быстрой настройкой, где FileOutputStream декорируется BufferedOutputStream

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();
...