Java: несколько выходных потоков в одном файле

Мне нужно прочитать несколько небольших файлов и добавить их в один файл большего размера.

Base64OutputStream baos = new Base64OutputStream(new FileOutputStream(outputFile, true));

for (String fileLocation : fileLocations) {
InputStream fis = null; 
        try
        {
            fis = new FileInputStream(new File(fileLocation));
            int bytesRead = 0;
            byte[] buf = new byte[65536];
            while ((bytesRead=fis.read(buf)) != -1) {
                if (bytesRead > 0) baos.write(buf, 0, bytesRead);
            }
        }
        catch (Exception e) { 
            logger.error(e.getMessage());
        }
        finally{
            try{
                if(fis != null)
                    fis.close();
            }
            catch(Exception e){
                logger.error(e.getMessage());
            }
        }
}

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

Вопросы:

  • Мне сказали, что открытие/закрытие выходного потока для одного и того же ресурса не является хорошей практикой, почему?
  • Почему использование одного выходного потока не дает того же результата, что и несколько отдельных?

person javaNoober    schedule 04.12.2012    source источник
comment
Вы вызываете flush() или close() на baos?   -  person Michael    schedule 04.12.2012
comment
Что именно здесь не так -› все файлы, следующие за первым, написанные baos, неверны (неверный вывод).?   -  person Yogendra Singh    schedule 04.12.2012
comment
close() закроет поток навсегда, а это означает, что мне нужно создать новый. Не думали о flush(), разве write() не работает так же, как и flush?   -  person javaNoober    schedule 04.12.2012
comment
@YogendraSingh ошибается, так как я должен получить /9j/4AAQSkZJRgABAgEAYABgAAD/, но он говорит 2f/Y/+AAEEpGSUYAAQIBAGAAYAAA, совершенно другой вывод   -  person javaNoober    schedule 04.12.2012


Ответы (1)


Возможно, проблема в том, что если вы предполагаете, что кодировка в base64, то объединение нескольких файлов должно давать тот же результат, что и объединение кодировки base64 каждого файла? Это не обязательно; base64 кодирует группы из трех последовательных входных байтов в 4 символа ascii, поэтому, если вы не знаете, что каждый файл имеет размер, кратный трем, кодировка base64 будет давать совершенно разные выходные данные.

person leonbloy    schedule 04.12.2012
comment
хорошо, мне потребовалось пару раз перечитать предыдущий ответ, чтобы понять, вы совершенно правы. Мое предположение было неверным. - person javaNoober; 04.12.2012