在java中通过套接字传输文件的缓冲区大小应该是多少

时间:2015-12-17 09:45:15

标签: java sockets

这可能是愚蠢的问题,但我想知道缓冲区大小应该是什么 文件传输

以下是发送文件的代码

try {
        ServerSocket serverSocket = new ServerSocket(1234);
        Socket socket = serverSocket.accept();
        jTextArea1.append("Accepted connection : " + socket+"\n");
        byte [] bytearray = new byte [10485760];      //Buffer size 10Mb
        FileInputStream fin = new FileInputStream(GetFile);
        BufferedInputStream bin = new BufferedInputStream(fin);
        int read;
         OutputStream os = socket.getOutputStream();
        while((read=bin.read(bytearray))!=-1){
            jTextArea1.append("Sending Files...\n");//I have printed the read variable
            System.out.println("Read: "+read);
            os.write(bytearray,0,read);
            os.flush();

        }
        socket.close();
        serverSocket.close();
        System.out.println("File transfer complete\n");
    } catch (IOException ex) {
        Logger.getLogger(BufferedFileTransfar.class.getName()).log(Level.SEVERE, null, ex);
    }
}           

注意: - 输入文件大小为143mb,因此每个缓冲区大小文件应分为15个部分,然后进行划分

输出: -

Read: 10485760
Read: 10485760
Read: 10485760
Read: 10485760
Read: 10485760
Read: 10485760
Read: 10485760
Read: 10485760
Read: 10485760
Read: 10485760
Read: 10485760
Read: 10485760
Read: 10485760
Read: 10485760
Read: 3603264
File transfer complete

因此对于同一个文件,如果我使用大缓冲区那么它会没问题吗?

2 个答案:

答案 0 :(得分:0)

通常可以是10241024*161024*32

此外,您还应该使用不同的缓冲区大小测试您的应用程序,以确定哪个是最佳的。你不能提前猜测。

答案 1 :(得分:0)

传输缓冲区的常用值在几千字节(10248192左右)范围内。小尺寸的原因在于,当瓶颈是实际转移时,没有优势来获得大缓冲;小批量的几千字节的字节。使用更大的缓冲区,只会使用其中的一小部分,其余部分将浪费。

这可以通过网络或文件传输轻松测试,从8字节左右的小缓冲区开始,然后逐渐增加它。虽然性能明显受到小缓冲区的影响,但增加超过几千字节不再影响性能。