Как написать потенциально огромный InputStream в файл?

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

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

Ответ 1

Я пошел с советом пропустить 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();

Ответ 2

Не пишите в 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);
}