有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何确定BufferedOutputStream的写入方法的缓冲区大小

我正在尝试使用以下代码复制文件:

1:

        int data=0;
        byte[] buffer = new byte[4096];
        while((data = bufferedInputStream.read())!=-1){
            bufferedOutputStream.write(data);
        }

2:

        byte[] buffer = new byte[4096];
        while(bufferedInputStream.read(buffer)!=-1){
            bufferedOutputStream.write(buffer);
        }

文件的实际大小为3892028字节(在windows上)。该文件将由用户通过struts2 fileupload上传。上传的文件大小与windows完全相同。当我试图从临时文件夹复制上传的文件时,复制的文件大小不同,所用的时间也不同(可以忽略不计)。请找到下面的读数

Without using buffer(Code 1)
Time taken 77
3892028
3891200

Buffer size 1024(Code 2)
Time taken 17
3892028
3891200

Buffer size 4096(Code 2)
Time taken 18
3892028
3891200

Buffer size 10240(Code 2)
Time taken 14
3892028
3901440

Buffer size 102400(Code 2)
Time taken 9
3892028
3993600

如果我进一步增加缓冲区的大小,所需的时间就会增加,同样可以忽略不计。所以我的问题是

  1. 为什么文件大小会改变
  2. 这种尺寸变化是否会产生微妙的后果
  3. 实现此功能(复制文件)的最佳方式是什么

我不知道下面发生了什么?谢谢你的建议。 Edit:我有flush()和close()方法调用。 注意:我对代码进行了精简,使其更简单


共 (1) 个答案

  1. # 1 楼答案

    问题是,BufferedInputStream.read(byte[])尽可能多地读入缓冲区。因此,如果流只包含1个字节,那么字节数组中只有第一个字节将被填充。但是,BufferedInputStream.write(byte[])所有给定字节写入流,这意味着它仍将写入完整的4096字节,其中包含当前迭代的1个字节和上一次迭代的4095个剩余字节

    您需要做的是保存读取的字节数,然后写入相同的字节数

    示例:

    int lastReadCnt = 0;
    byte[] buffer = new byte[4096];
    while((lastReadCnt = bufferedInputStream.read(buffer))!=-1){
        bufferedOutputStream.write(buffer, 0, lastReadCnt);
    }
    

    参考文献: