Java:正确处理管道作为标准输入

标签 java windows stdin pipe

如果我停止从适用于非管道输入的程序中读取管道输入,我会收到一个奇怪的错误(“该进程试图写入不存在的管道。”)。如何避免导致此错误?

代码:

package com.example.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class PipeTest {
    static public void main(String[] args) throws IOException
    {
        BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
        int i = 0;
        while (i < 10)
        {
            String s = r.readLine();
            if (s == null)
                break;
            ++i;
            System.out.println(i);
        }
    }
}

运行时输出(testfile.txt只是一个超过10行的大文本文件):

C:\proj\java\test-pipe\bin>java com.example.test.PipeTest < ../testfile.txt    
1
2
3
4
5
6
7
8
9
10

C:\proj\java\test-pipe\bin>type ..\testfile.txt | java com.example.test.PipeTest
1
2
3
4
5
6
7
8
9
10
The process tried to write to a nonexistent pipe.

最佳答案

该错误来自您的命令 shell,而不是来自 Java 程序。它提示是因为“type”仍在尝试写入其输出,但当 Java 程序终止时该管道突然关闭。

关于Java:正确处理管道作为标准输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1594940/

相关文章:

java - (Android) 通过一个简单的套接字攻击服务器

java - 哈希表 ||哈希码查找如何保持不变

java - 我试图从下拉列表中选择值,但我不能为什么?

python - 在 Windows 中将 MySQL 与 Python 集成

c - 写入另一个程序的标准输入/从 c 中另一个程序的标准输出读取

Java命令显示进程

c++ - 错误位置的对话框

windows - C stat() 函数报告 Windows 桌面文件夹是只读的

input - 如何在不收到 "Unsed Variable"警告的情况下获取用户输入?

ruby - 如何在 Ruby 中打开进程的 STDIN?