WedX - журнал о программировании и компьютерных науках

Как записать потенциально огромный 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 в файл кусками, чтобы массив байтов никогда не превышал размер кучи?


  • Вы предполагаете, что мое беспокойство не имеет значения? 28.03.2012
  • Просто исключите использование ByteArrayOutputStream. (Я неправильно прочитал.. я вообще его использую?) 28.03.2012

Ответы:


1

Не пишите 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);
}
28.03.2012
  • хм, думаю, в этом есть смысл. 28.03.2012
  • Я пошел с этим OutputStream output = new BufferedOutputStream (новый FileOutputStream (путь)); после прочтения документов FileOutputStream. 28.03.2012
  • Не стесняйтесь редактировать мой ответ, чтобы отразить это, и принять его. В противном случае вы можете/должны опубликовать и принять свой собственный ответ. 28.03.2012

  • 2

    Я пошел с советом пропустить 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();
    
    28.03.2012
  • разве is не должно быть FileInputStream ? это не определено 03.03.2016
  • в чем преимущество использования BufferedOutputStream вместо прямого использования FileOutputStream? 16.05.2017
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]