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