FileOutputStream vs ByteArrayOutputStream - PullRequest
       3

FileOutputStream vs ByteArrayOutputStream

9 голосов
/ 03 января 2011

Я читаю чужой код.Вот суть этого.

Класс сжимает и распаковывает файлы, используя GZIPInputStream и GZIPOutputStream.

Вот фрагмент того, что происходит во время сжатия.inputFile и outputFile являются экземплярами класса File.

FileInputStream fis = new FileInputStream(inputFile);
GZIPOutputStream gzos = new GZIPOutputStream(new FileOutputStream(outputFile));

//the following function copies an input stream to an output stream
IOUtils.copy(fis,gzos);

//outputFile is the compressed file
...

Теперь, вот что происходит во время декомпрессии.

GZIPInputStream gzis = new GZIPInputStream(new FileInputStream(inputFile));
ByteArrayOutputStream baos = new ByteArrayOutputStream();

//copies input stream to output stream
IOUtils.copy(gzis,baos);

//this method does as its name suggests
FileUtils.writeByteArrayToFile(outputFile, baos.toByteArray());

//outputFile is the decompressed file
...

Какова возможная причина первоначального программиставыбрал FileOutputStream во время сжатия и ByteArrayOutputStream во время распаковки?Это смущает меня.

Если нет веских причин, я думаю, что я изменяю их, чтобы они были последовательными, чтобы избежать путаницы в будущем.Это хорошая идея?

Ответы [ 4 ]

11 голосов
/ 03 января 2011

Хех, похоже, они скопировали и вставили код из разных источников?:-P Нет, серьезно, если вам не нужно проверять распакованные данные, вы можете просто использовать BufferedOutputStream как для сжатия, так и для распаковки.

6 голосов
/ 03 января 2011

ByteArrayOutputStream - больше памяти, поскольку он хранит весь контент в памяти Java (в духе byte[]).FileOutputStream записывает на диск напрямую и, следовательно, требует меньше памяти.Я не вижу разумной причины использовать ByteArrayOutputStream в данном конкретном случае.Это не изменяет отдельные байты впоследствии.Это просто записывается без изменений в файл впоследствии.Таким образом, это ненужный промежуточный шаг.

3 голосов
/ 03 января 2011

Программист использовал FileInputStream во время сжатия и буфер при распаковке. Я думаю, что причина была в том, что если вы не смогли прочитать файл, ничего плохого не случилось. Вы просто терпите неудачу, и выдается исключение.

Если во время распаковки произошел сбой, и вы уже начали запись в файл, файл поврежден. Поэтому он решил сначала записать буфер, а затем, когда распаковка завершена, записать буфер на диск. Это решение хорошо, если вы имеете дело с относительно небольшими файлами. В противном случае это потребует много памяти и может привести к OutOfMemeoryError.

Я бы распаковал zip напрямую в временный файл, а затем переименовал временный файл в его постоянное имя. Наконец, блок должен заботиться об удалении временного файла.

1 голос
/ 03 января 2011

ByteArrayOutputStream даст ему / ей хороший OutOfMemoryError?

Серьезно, они, вероятно, были сделаны в разное время.Если вы можете, я бы посмотрел журналы VCS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...