Java Buffered Stream Writer写短文并破坏DOCX文件

时间:2017-03-10 14:52:19

标签: java

我正在编写一个文件上传Java应用程序,我的问题是我的缓冲编写器正在编写文件,而不是完整的文件大小。当我记录写入的字节数时,新文件大小与旧文件大小相比 - 总是存在差异 - 我的缓冲读取器根据缓冲区大小停止缩短。

因此,当我的缓冲区设置为1024时 - 它只会写入1024的增量,而不是剩余的字节(最后几个小于1024字节的字节)。 DOCX(所有X Office文件)对它们的文件大小都很挑剔,当你把它们写得很短时,它们会在办公室被标记为已损坏。

       int originalSize = (int) file.length();

        FileInputStream fis = null;
        BufferedOutputStream bout = null;
        BufferedInputStream bin = null;
        FileOutputStream fout = null;

        try {
            fis = new FileInputStream(file);
            fout = new FileOutputStream(newfile);
            bout = new BufferedOutputStream(fout);
            bin = new BufferedInputStream(fis);

            log.info("Setting buffer to 1024");

            int total = 0;
            byte buf[] = new byte[1024]; // Buffer Size (works when set to 1)

            while((bin.read(buf)) != -1) {

                Float size = (float) newfile.length();

                bout.write(buf);
                total += buf.length;

                log.info("LOOP: Current Size:" + total + " New File Size: " + size + " Original Size: " + originalSize);
             }

            int size = (int) newfile.length();
            log.info("new file size bytes: " + size);
            log.info("original file size bytes: " + originalSize);
            log.info("File created: " + newfile.getName());

            return newfile.getName();
        } catch (Exception e) {
            log.error("ERROR: during input output file streaming: " + e.getMessage());
        } finally {
            fis.close();
            bout.close();
            bin.close();
        }

因此,当我将缓冲区大小设置为1个字节时,这将起作用,因为它将完全写出文件

任何建议我如何得到这样的缓冲编写器(我必须缓冲它/使用流,因为它处理大量文件)写出该文件的确切字节数量,非常感谢。

由于

1 个答案:

答案 0 :(得分:1)

read()方法返回读取的字节数。缓冲区并不总是完全填满。

你应该写这样的东西:

int bytesRead = 0;
while((bytesRead = bin.read(buf)) != -1) {
  bout.write(buf, 0, bytesRead); // Write only the bytes read
  total += bytesRead;
  // ...
}