Java 合并文件时,BufferOutputStream写入零字节

Java 合并文件时,BufferOutputStream写入零字节,java,io,fileinputstream,bufferedinputstream,bufferedoutputstream,Java,Io,Fileinputstream,Bufferedinputstream,Bufferedoutputstream,我正在尝试将n个文件合并为单个文件。但我的函数有奇怪的行为。该函数在n秒内被调用x次。假设我有100个文件,我将合并,每秒钟我调用5个文件并合并它。在接下来的一秒钟里,数量增加了一倍,达到了10,但是从1到5是与之前相同的文件,其余的是新文件。它工作正常,但在某些情况下,它会给出零字节,或者有时给出正确的大小 你能帮我找出下面函数中的错误吗 public void合并文件(列表文件列表,int x){ 整数计数=0; BufferedOutputStream out=null; 试一试{ out

我正在尝试将n个文件合并为单个文件。但我的函数有奇怪的行为。该函数在n秒内被调用x次。假设我有100个文件,我将合并,每秒钟我调用5个文件并合并它。在接下来的一秒钟里,数量增加了一倍,达到了10,但是从1到5是与之前相同的文件,其余的是新文件。它工作正常,但在某些情况下,它会给出零字节,或者有时给出正确的大小

你能帮我找出下面函数中的错误吗

public void合并文件(列表文件列表,int x){
整数计数=0;
BufferedOutputStream out=null;
试一试{
out=新的BufferedOutputStream(新的FileOutputStream(“Test.doc”);
for(字符串文件:文件列表){
InputStream in=new BufferedInputStream(new FileInputStream(file));
字节[]buff=新字节[1024];
in.read(buff);
写出(buff);
in.close();
计数++;
如果(计数=x){
打破
}
}
out.flush();
out.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
*对不起,我的英语不好

in.read(buff)


检查一下。该方法不能保证填充缓冲区。它返回一个值,告诉您它读取了多少字节。您应该使用它,在这种情况下,您应该在决定要写入多少字节(如果有)时使用它。

您不读取完整文件,您只读取每个文件最多1024字节。您需要循环读取,只要它返回数据(或使用类似的方法)

顺便说一句:如果使用大缓冲区进行复制,则不需要缓冲输出流

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;
            }
        }
    }
}
public void mergeFile(list fileList,int x)引发IOException{
try(OutputStream out=newfileoutputstream(“Test.doc”);){
整数计数=0;
for(字符串文件:文件列表){
复制(新文件(File.toPath(),out);
计数++;
如果(计数=x){
打破
}
}
}
}

如果关闭,也不需要刷新()。我使用的是“使用资源重试”这里,所以我不需要明确地关闭它。最好传播异常。

是从线程内调用
mergeFile
吗?如果您尝试合并MS Word文档文件:我认为这不起作用,因为格式不允许。对不起,我不明白。您能再解释一下吗?Thanks@david我添加了一个链接,如果你读了,请注意它可以是介于0和1024(或-1)之间的任何值。并且必须循环直到它为-1。