【问题标题】:Java: How do I pipe InputStream to standard out?Java:如何通过管道将 InputStream 传输到标准输出?
【发布时间】:2010-02-27 01:21:44
【问题描述】:

是否有一种简单(因此快速)的方法来完成此操作?基本上只需要一些输入流,可能类似于 socket.getInputStream(),并让流的缓冲区自动重定向到标准输出?

【问题讨论】:

    标签: java io


    【解决方案1】:

    从Java 9开始,你可以使用InputStream.transferTo

    例子

    try (InputStream stream = Application.class.getResourceAsStream("/test.txt")) {
        stream.transferTo(System.out);
    }
    

    【讨论】:

      【解决方案2】:

      没有简单的方法可以做到这一点,因为InputStream 有一个拉式界面,而OutputStream 有一个推式界面。您需要某种泵循环来从InputStream 提取数据并将它们推送到OutputStream。像这样(如果需要,在单独的线程中运行它):

      int size = 0;
      byte[] buffer = new byte[1024];
      while ((size = in.read(buffer)) != -1) out.write(buffer, 0, size);
      

      它已经在 Apache Commons IO 中实现为 IOUtils.copy()

      【讨论】:

      • Apache Common 的 IO 工具有帮助吗?
      • @Zombies:是的,你可以使用IOUtils.copy()
      • @axtavt - 作为一般规则,在无缓冲流上执行字节操作是个坏主意。每次调用 read(byte)write(byte) 时,您可能最终都会进行一次系统调用,这非常昂贵。
      • 复制(inputStream, System.out) ?
      • @Zombies:是的。你应该在一个单独的线程中运行它,你不想阻塞你当前的线程
      【解决方案3】:

      您需要一个简单的线程来读取输入流并写入标准输出。确保它屈服于其他线程。

      【讨论】: