【发布时间】:2013-12-02 06:14:04
【问题描述】:
让我们有一个简单的 Java 应用程序,其中我有以下代码来扫描用户输入:
Scaner scan = new Scanner(System.in);
System.out.print("Enter the value: ");
int value = scan.nextInt();
System.out.println("You entered: " + value);
当我手动运行它时,正如预期的那样,我看到了我输入的内容,示例运行将是:
Enter the value: 3
You entered: 3
但是,当我有一个包含内容的文件时
3
我想通过这个将程序标准输出重定向到一个文件:
java Test < INPUT > OUTPUT
我得到的都是cat OUTPUT:
Enter the value: You entered: 3
由于输入的值没有显示在标准输出上,这是正确的,它们不在标准输出上,我知道,我看到它们是因为我手动将它们输入到我的终端。但是当我像这样重定向标准输出时,如何让它们也被看到?
编辑:
我可以看到代码正在进行read(0, 系统调用。
$ (strace -ff -e trace=read -e read 2>&1 java Test < INPUT) | grep "read(0,"
[pid 7297] read(0, "3\n", 8192) = 2
有没有更好的拦截方法?
编辑 2:
我的意思是,当我使用java < INPUT > OUTPUT 运行它时,输出应该如下所示
Enter the value: 3
You entered: 3
【问题讨论】:
-
检测输入是否为TTY(终端),如果不是,手动打印输入数据。也许在 Java 中检测不是那么容易,请参阅 stackoverflow.com/questions/1403772/… 。 (在大多数其他语言中,此功能是内置的。)
-
我不想修改提供的代码,它们来自外部。
-
如果您不想更改提供的代码,还有哪些适合您的选项?
-
除了更改提供的代码之外的任何东西。我可以编写另一个程序、脚本来运行给定的代码,并以不同的方式处理输入/输出重定向。也许会检测到
java Test何时需要输入,然后将 INPUT 的内容写入 OUTPUT 和 STDIN 到文件中,但我想知道是否还有另一种更简单的方法,我觉得我在发明轮子。 -
检测
java Test何时需要输入是不可能的。您可以查看它打印的内容,并从中推断出它最可能需要输入的时间。
标签: java linux shell io-redirection