BufferedOutputStream записывает мусорные данные - PullRequest
2 голосов
/ 23 июня 2011

Я пишу загрузочный сервлет, который читает html-файл и записывает в servletOutputStream, проблема прямо в переданном файле заключается в добавлении некоторых данных мусора, любые предложения по этому поводу,

ниже код Iиспользую для этого


        int BUFFER_SIZE = 1024 * 8;
        servOut   = response.getOutputStream();
        bos       = new BufferedOutputStream(servOut);
        fileObj = new File(file);
        fileToDownload = new FileInputStream(fileObj);
        bis = new BufferedInputStream(fileToDownload);
        response.setContentType("application/text/html");
          response.setHeader("ContentDisposition","attachment;filename="+dump+".html");
        byte[] barray = new byte[BUFFER_SIZE];
        while ((bis.read(barray, 0, BUFFER_SIZE)) != -1) {
            bos.write(barray, 0, BUFFER_SIZE);
        }
        bos.flush();

Ответы [ 2 ]

3 голосов
/ 23 июня 2011

Проблема со следующей частью вашего кода:

        while ((bis.read(barray, 0, BUFFER_SIZE)) != -1) {
            bos.write(barray, 0, BUFFER_SIZE);
        }

Вы всегда записываете кратное BUFFER_SIZE байтов, , даже если размер вашего ввода не кратен BUFFER_SIZE. Это приводит к записи мусора в конце последнего блока.

Вы можете исправить это так:

        int read;
        while ((read = bis.read(barray, 0, BUFFER_SIZE)) != -1) {
            bos.write(barray, 0, read);
        }
3 голосов
/ 23 июня 2011

bis.read возвращает количество прочитанных байтов.Вы должны принять это во внимание при звонке write.

Что-то вроде:

int rd;
while ((rd=bis.read(...)) != -1) {
     bos.write(..., rd);
}
...