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

时间:2009-10-20 14:18:28

标签: 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.

1 个答案:

答案 0 :(得分:2)

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