我正在编写一个文件上传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个字节时,这将起作用,因为它将完全写出文件
任何建议我如何得到这样的缓冲编写器(我必须缓冲它/使用流,因为它处理大量文件)写出该文件的确切字节数量,非常感谢。
由于
答案 0 :(得分:1)
read()
方法返回读取的字节数。缓冲区并不总是完全填满。
你应该写这样的东西:
int bytesRead = 0;
while((bytesRead = bin.read(buf)) != -1) {
bout.write(buf, 0, bytesRead); // Write only the bytes read
total += bytesRead;
// ...
}