Java中的命令行管道输入

这是一段简单的代码:

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读取<input.txt

一旦input.txt被完全传送到程序中,x就会不断获得无限空值。 为什么? 在将文件送入代码之后,有没有办法使标准输入(命令行)生效? 我试过关闭流并重新打开,它不起作用。 重置等也。

通过执行"java Read < input.txt"您已经告诉操作系统,对于此过程,管道文件标准的。然后,您无法从应用程序内部切换回命令行。

如果你想这样做,那么将input.txt作为文件名参数传递给应用程序,从应用程序内部自己打开/读取/关闭文件,然后从标准输入读取以从命令行获取内容。

嗯,这是在BufferedReader读取的典型情况。 readLine()在流结束时返回null 。 也许你的无限循环是问题;-)

 // try / catch ommitted String x = null; while( (x = f.readLine()) != null ) { System.out.println(x); } 

当行为null时,您需要终止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(); } } 

在将文件送入代码之后,有没有办法使标准输入(命令行)生效?

很抱歉碰到一个老问题,但到目前为止,没有一个答案指出在管道传输文件后有一种(仅限shell)方式传回控制台输入。

如果您运行该命令

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

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

请注意,如果您按Ctrl + D ,您将获得null s的无限循环,除非您修改程序以在接收null时结束循环。