我正在尝试合并 n 文件成为单个文件。但我的功能上有奇怪的行为。该函数在 n 秒内调用 x 次。假设我有100个文件,我将合并,每秒我调用5个文件并合并它。并且在下一秒中,金额是10倍,但是从1-5开始是与新文件相同的文件。它工作正常,但在某些时候,它给出零字节或某个时候给出正确的大小。
你能帮我发现下面我的功能中的错误吗?
public void mergeFile(list<String> fileList, int x) {
int count = 0;
BufferedOutputStream out = null;
try {
out = new BufferedOutputStream(new FileOutputStream("Test.doc"));
for (String file : fileList) {
InputStream in = new BufferedInputStream(new FileInputStream(file));
byte[] buff = new byte[1024];
in.read(buff);
out.write(buff);
in.close();
count++;
if (count == x) {
break;
}
}
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
*对不起我的英文
答案 0 :(得分:1)
in.read(浅黄色);
检查Javadoc。该方法不能保证填充缓冲区。它返回一个值,告诉您它读取了多少字节。您应该使用,并且在这种情况下,您应该在决定要写入多少字节(如果有)时使用它。
答案 1 :(得分:0)
您没有阅读完整文件,只读取最多 1024字节的每个文件。只要它返回数据(或使用Files.copy()之类的东西,你就需要循环读取。
BTW:如果使用大缓冲区进行复制,则不需要BufferedOutputStream。
public void mergeFile(list<String> fileList, int x) throws IOException {
try (OutputStream out = new FileOutputStream("Test.doc");) {
int count=0;
for (String file : fileList) {
Files.copy(new File(file).toPath(), out);
count++;
if (count == x) {
break;
}
}
}
}
如果你关闭,你也不需要冲洗()。我在这里使用“try-with-resource”,所以我不需要明确地关闭它。最好传播例外。