gpt4 book ai didi

Java Buffered Stream Writer 写入短且损坏的 DOCX 文件

转载 作者:行者123 更新时间:2023-12-02 13:41:28 25 4
gpt4 key购买 nike

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

例如,当我的缓冲区设置为 1024 时,它仅写入 1024 的增量,而不写入剩余字节(小于 1024 字节的最后几个字节)。 DOCX(所有 X Office 文件)对其文件大小很挑剔,当您将它们写得很短时,它们会在 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 字节时,这会起作用,因为它将完全写出文件

任何建议我如何获得这样的缓冲写入器(我必须缓冲它/使用流,因为它处理大量文件)来写出该文件的确切字节数,我将不胜感激。

谢谢

最佳答案

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

你应该写这样的东西:

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

关于Java Buffered Stream Writer 写入短且损坏的 DOCX 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42721248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com