在Windows命令行上,如何将来自cat的输出提供给我的java main方法?

我无法弄清楚如何让命令行命令“cat”和我的微不足道的Java程序在Windows命令行中一起工作。 就像在Linux中常见的一样:

cat *.* | grep stackoverflow 

我想在Windows中这样做:

 cat inputfile.txt | java Boil 

虽然我不能让猫喂养Boil。 正如你在下面看到的,命令行命令“cat”可以正常工作, 如果我以“java Boil these are parameters”的格式提供参数,Boil程序就可以正常工作。

我的Boil.java代码

 // Boil down lines of input code to just ;{}( and ) // and enjoy seeing the patterns public class Boil { public static void main(String[] args) { int outputCounter = 0; for (int i = 0; i < args.length; i++) { for (int j = 0; j < args[i].length(); j++) { if (args[i].charAt(j) == ';' || args[i].charAt(j) == '(' || args[i].charAt(j) == ')' || args[i].charAt(j) == '{' || args[i].charAt(j) == '}') { System.out.print(args[i].charAt(j)); outputCounter++; if (outputCounter >= 80) { System.out.print("\n"); outputCounter = 0; } } } } } } 

我知道这可以更好地优化:)

从我的C:\ Windows \ System32 \ cmd.exe中,在Windows 7 Professional SP1 32位操作系统的计算机上运行的“Administrator:cmd.exe”Windows命令行窗口:

 Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. All rights reserved. C:\Windows\System32>cd ../../workspace1/Boil/bin C:\workspace1\Boil\bin>ls Boil.class inputfile.txt C:\workspace1\Boil\bin>cat inputfile.txt This is a sample text file() with { multiple lines!; } C:\workspace1\Boil\bin>java Boil this should print nothing C:\workspace1\Boil\bin>java Boil this should print a semicolon; ok? ; C:\workspace1\Boil\bin>java Boil test all good chars ;(){} ;(){} C:\workspace1\Boil\bin>cat inputfile.txt | java Boil C:\workspace1\Boil\bin>java Boil < inputfile.txt C:\workspace1\Boil\bin>java Boil < cat inputfile.txt The system cannot find the file specified. C:\workspace1\Boil\bin>cat inputfile.txt > java Boil cat: Boil: No such file or directory C:\workspace1\Boil\bin>dir Volume in drive C is OS Volume Serial Number is 0666-2986 Directory of C:\workspace1\Boil\bin 11/20/2013 04:29 PM <DIR> . 11/20/2013 04:29 PM <DIR> .. 11/20/2013 02:28 PM 864 Boil.class 11/20/2013 04:22 PM 57 inputfile.txt 11/20/2013 04:29 PM 57 java 3 File(s) 978 bytes 2 Dir(s) 872,764,809,216 bytes free C:\workspace1\Boil\bin>cat java This is a sample text file() with { multiple lines!; } C:\workspace1\Boil\bin>rm java 

任何想法非常赞赏。 先谢谢你。

而不是试图读取行作为参数,你应该从标准输入流中读取。

 try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String input; while((input = br.readLine()) != null){ System.out.println(input); } } catch (IOException io){ io.printStackTrace(); } 

管道意味着将输出流(STDOUT)作为STDIN传递给另一个命令。 在这个例子中,Boil和grep都没有任何参数。

如果你的命令是java Boil ,那么没有参数。 因此,循环中的任何代码都不会执行。 你试图让cat命令把它的输出提供给命令的参数 ,但是你不能在Windows中这样做。 (使用|在Unix / Linux上也不这样做,必须使用反引号来实现,但是Windows不支持反引号。

(PS你在Linux上的命令:

 cat *.* | grep stackoverflow 

没有做你认为它的事情。 在模式“ stackoverflow ”之后, grep希望看到要搜索的文件的文件名,或者如果没有,则使用标准输入。 |cat的输出管理到grep的标准输入,而不是命令行参数。 你不能用这个来使用cat的输出作为grep模式 [除非有一些方法可以使用-f选项。