Linux 中的许多命令采用两种输入方式之一,标准输入,或作为文件的参数。例子
echo "来自标准输入的文本" | lpr
lpr 文件名.txt
echo "来自标准输入的文本" | 荷兰语
nl 文件名.txt
awk、sed、grep 和许多其他方法也是如此。用 Java 编写的命令行应用程序怎么会发生同样的行为?我相信 System.in 代表标准输入。阅读标准输入并不困难。从文件中读取并不难,但是应用程序如何根据命令行调用它的方式进行操作?
基本上,您必须解析传递给您的 java 应用程序的参数。这些参数将指示您的程序逻辑如何处理传递给标准输入的信息。
您可以使用此处显示的简单方法解析参数 http://docs.oracle.com/javase/tutorial/essential/environment/cmdLineArgs.html
或者您可以使用此处提到的强大库
您处理方法的参数main(String[] args)
。如果提供了一个参数,args[0]
它将是非空的,因此您可以假设/验证它是一个文件名。否则,假设/验证输入是通过标准输入提供的。
在代码中:
public static void main(String[] args) {
if (args.length > 0) {
String filename = args[0];
... // process the file
}
else {
Scanner sc = new Scanner(System.in);
... // process STDIN
}
}
这只是编程。例如:
public class Main {
public void run(OutputStream out) {
// Write output to 'out'
}
public static void main(String[] args) {
if (args.length == 1) {
try (FileOutputStream out = new FileOutputStream(args[0])) {
new Main().run(out);
}
} else {
new Main().run(System.out);
}
}
}
此版本假定第一个参数是输出文件名,如果没有给出文件名,则写入标准输出。你可以对标准输入做同样的事情,你可以不同地处理参数。
out
注意:您可以使用System.setOut(...)
修改 JVM 的System.out
“变量”而不是使用参数。但我更喜欢这样做,因为它使应用程序逻辑更可重用。(考虑您想Main
在更大的应用程序中嵌入/使用该类的情况......用于System.out
其他目的。)
您可以执行典型的 unix 程序所做的事情...检查命令行参数(传递给main(String[] args)
方法,如果没有给出适当的输入文件,则使用System.in
.