java - 将输入流连接到输出流

标签 java inputstream outputstream

java9 中的更新:https://docs.oracle.com/javase/9/docs/api/java/io/InputStream.html#transferTo-java.io.OutputStream-

我看到了一些类似的,但不是我需要的线程。

我有一个服务器,它基本上会从客户端客户端 A 接收输入,并将其逐字节转发到另一个客户端客户端 B。

我想将客户端 A 的输入流与客户端 B 的输出流连接起来。这可能吗?有什么方法可以做到这一点?

此外,这些客户端正在相互发送消息,这些消息对时间有些敏感,因此无法进行缓冲。我不想要一个 500 的缓冲区,客户端发送 499 个字节,然后我的服务器推迟转发 500 个字节,因为它没有收到最后一个字节来填充缓冲区。

现在,我正在解析每条消息以查找其长度,然后读取长度字节,然后转发它们。我认为(并测试)这比读取一个字节并一遍又一遍地转发一个字节要好,因为那会非常慢。由于我在上一段中所述的原因,我也不想使用缓冲区或计时器 - 我不希望仅仅因为缓冲区未满而等待很长时间才能通过的消息。

有什么好的方法可以做到这一点?

最佳答案

仅仅因为您使用缓冲区并不意味着流必须填充该缓冲区。换句话说,这应该没问题:

public static void copyStream(InputStream input, OutputStream output)
    throws IOException
{
    byte[] buffer = new byte[1024]; // Adjust if you want
    int bytesRead;
    while ((bytesRead = input.read(buffer)) != -1)
    {
        output.write(buffer, 0, bytesRead);
    }
}

这应该可以正常工作 - 基本上 read 调用将阻塞,直到有 一些 数据可用,但它不会等到 all可用于填充缓冲区。 (我想它可以,而且我相信 FileInputStream 通常 填充缓冲区,但附加到套接字的流更有可能立即为您提供数据。)

我认为至少值得先尝试这个简单的解决方案。

关于java - 将输入流连接到输出流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1574837/

相关文章:

java - 从日期对象获取日期

java - Java 中 String.replaceFirst ("^...") 的预期运行时间是多少

java - 拆分一个数组并将它们保存在 2 个单独的数组中

java - Java 中的套接字流

c++ - 未显示 Char 变量值

java - 如果函数调用在多个线程中运行,则中止该函数调用

java - 当文件中只有 1 个字节时,FileInputStream available 方法返回 2

java - 在 Java 中将流连接到套接字

c++ - 输出文件的字符串数组

android - 在Android中,当应用程序在写入过程中发生崩溃时,文件会发生什么变化?