Java中的命令行管道输入

13

这是一段简单的代码:

import java.io.*;
public class Read {
 public static void main(String[] args) {
     BufferedReader f = new BufferedReader(new InputStreamReader(System.in));
  while(true)
  {
   String x = null;
   try{
    x = f.readLine();
   }
   catch (IOException e) {e.printStackTrace();}
   System.out.println(x);
  }
 }
}

我用以下命令运行程序:java Read < input.txt

一旦 input.txt 文件被完全输入到程序中,变量 x 就会不断地得到无限个 null。为什么会这样?有没有办法让标准输入(命令行)在文件传输到代码后保持活动状态? 我尝试过关闭流并重新打开,但没有效果。重置等也试了。


原始代码是否被编辑以考虑接受的答案?因为那个答案现在似乎不适用于这段代码:代码不会从参数列表中读取文件,也不会像答案所暗示的那样执行任何操作。如果是这样的话,最好将错误的代码保留下来,以使整个页面更有意义。 - Rondo
@Rondo - 不是。这里是修订版链接:http://stackoverflow.com/posts/1431551/revisions。 - TJ-
4个回答

17
通过执行 "java Read < input.txt" 命令,你已经告诉操作系统对于这个进程,输入的文件就是标准输入。此时你不能在应用程序内部切换回命令行。
如果要这样做,可以把 input.txt 作为参数传递给应用程序,在应用程序内部自己打开/读取/关闭文件,然后从标准输入读取命令行中的内容。

谢谢回复,这解释得很清楚。 - TJ-

13

嗯,这在使用 BufferedReader 读取时很常见。当达到流的末尾时,readLine() 返回 null。也许无限循环是问题所在。

// try / catch ommitted

String x = null;

while( (x = f.readLine()) != null )
{
   System.out.println(x);
}

9

当行为空时,您需要终止while循环,代码如下:

    BufferedReader in = null;
    try {
        in = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while ((line = in.readLine()) != null) {
            System.out.println(line);
        }
    }
    catch (IOException e) {
        logger.error("IOException reading System.in", e);
        throw e;
    }
    finally {
        if (in != null) {
            in.close();
        }
    }

1

有没有办法在将文件输入代码后,使标准输入(命令行)处于活动状态?

很抱歉打扰了一个老问题,但到目前为止,没有一个答案指出在管道传输文件后,存在一种(仅限于shell的)方法可以将控制台输入返回。

如果运行以下命令:

{ cat input.txt & cat; } | java Read

接着,来自 input.txt 的文本将被传递给 java Read,然后您将回到控制台输入。

请注意,如果您随后按下 Ctrl+D,除非您修改程序以在接收到 null 时结束循环,否则会得到无限循环的 null


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接