Java,使用套接字: is it necessary use bufferedinputstream and bufferedoutputstream?发送和接收文件

标签 java sockets bufferedinputstream bufferedoutputstream

我正在尝试在客户端-服务器应用程序中编写两种使用 java 套接字发送和接收文件的方法,但我有一些疑问:

我使用FileInputStreamFileOutputStream 。是BufferedInputStreamBufferedOutputStream更好的?

static protected long send_file(File file, DataOutputStream output) throws IOException, FileNotFoundException, SecurityException
{
    byte[] buffer = new byte[1024];
    long count = 0;
    int nread = 0;

    FileInputStream file_input = new FileInputStream(file);

    output.writeLong(file.length());

    while((nread = file_input.read(buffer)) != -1) 
    {
        output.writeInt(nread);

        output.write(buffer, 0, nread);
        count += nread;
    }

    output.flush();
    file_input.close();

    return count;   
}


static protected long receive_file(File file, DataInputStream input) throws IOException, FileNotFoundException, SecurityException, EOFException
{
    byte[] buffer = new byte[1024];
    long dim_file = 0;
    long count = 0;
    int nbyte = 0;
    int nread = 0;
    int n = 0;

    FileOutputStream file_output = new FileOutputStream(file);

    dim_file = input.readLong();

    while(count < dim_file) 
    {
        nbyte = input.readInt();

        nread = input.read(buffer, 0, nbyte);
        if(nread == -1)
        {
            file_output.close();
            throw new EOFException();
        }

        while(nread < nbyte) 
        {
            n = input.read(buffer, nread, nbyte-nread);

            if(n == -1)
            {
                file_output.close();
                throw new EOFException();
            }

            nread += n;
        }

        file_output.write(buffer, 0, nread);

        count += nread;
    }

    file_output.flush();
    file_output.close();

    return count;   
}

我不明白BufferedInputStream的必要性和BufferedOutputStream :

在第一种方法中,我使用 1024 字节的缓冲区,首先用 FileInputStream.read(byte[] b) 填充它。然后将其发送到套接字 DataOutputStream.write(byte[] b, int off, int len) .

在第二种方法同上:首先我用 DataInputStream.read(byte[] b) 填充缓冲区然后用 FileOutputStream.write(byte[] b, int off, int len) 写入文件.

那么为什么要使用 BufferedInputStreamBufferedOutputStream ? 这样,如果我理解它们是如何工作的,我首先在缓冲区中写入字节,然后 BufferedInputStreamBufferedOutputStream复制缓冲区中的字节。

最佳答案

这不是为了更好。他们提供不同的东西。当 fileoutputstream 写入文件时,BuffereOutputStreams 写入缓冲区(因此得名:))。 您应该将它们结合起来以获得最佳性能。例如

BufferedOutputStream bo = new BufferedOutputStream(new FileOutputStream("output.txt"))

然后,您的程序将首先将所有内容写入缓冲区,并且仅在刷新缓冲区时将其转储到文件中

关于Java,使用套接字: is it necessary use bufferedinputstream and bufferedoutputstream?发送和接收文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17083826/

相关文章:

java - Buffered reader 和 InputStreams 的不同可能嵌套

java - JSch - 如何使用 PortForwarding L 从远程服务器捕获流?

java - Mockito 可以在调用方法后将参数返回给方法吗?

iphone - 在iPhone SDK中使用套接字通信黑白两个应用程序

node.js - Kubernetes 和 Socket.io 404 错误 - 在本地可以工作,但应用到 kubernetes 后就不行了

java - 如何使用 Selenium webdriver 和 Java 读取 PDF

java - 将非泛型方法转换为泛型方法

java - 文件到 JTable、JTable 到文件

java - SWTBot 测试读取欢迎页面文本

c# - .NET C# 套接字并发问题