2016-12-14 33 views
2

比方说,我有一个程序,要求使用扫描仪的三个数字,这样的事情:如何将输入管道输入到java程序中,但是输入中仍显示输入?

Scanner console = new Scanner(System.in); 
int[] numbers = new int[3]; 
System.out.println("Hello!"); 
for (int i = 0; i<3; i++){ 
    System.out.print("Please enter a number: "); 
    numbers[i] = console.nextInt(); 
} 

我想通过重定向一些输入到它,然后将输出重定向到一个文件来测试像这样的程序。

input.txt中

3 
4 
5 

命令

java program <input.txt> output.txt 

的问题是,output.txt的会是这个样子

Hello! 
Please enter a number: Please enter a number: Please enter a number: 

至于反对这样的事情

Hello! 
Please enter a number: 3 
Please enter a number: 4 
Please enter a number: 5 

有什么办法让output.txt看起来更像第二个?我在Mac上,如果这改变了任何东西。

我不想修改代码 - 我必须为很多类似的程序运行此测试。

+0

也许,如果你打印出来就可以了(的System.out.println())也是许多用户输入 – pringi

+0

的问题其实是,我需要评分约300名学生的java作业,并且无法修改他们的所有代码。 – Arya

+2

@pringi如果用户直接使用该程序,这会将数字打印到控制台两次 – flakes

回答

2

为什么预期

在你的输出你的程序不能正常工作,字符串“请输入一个数字:”是链接不换行,因为你没有在程序打印换行。当程序在交互模式下运行时,用户进入换行符。

输出文件中没有数字,因为您的程序不会将它们打印到标准输出。再次,当程序以交互模式运行时,用户输入数字,但不是程序。在重定向输出的情况下,来自输入文件的数字被程序读取,但从未打印到标准输出。

正确的方法

如果该程序是在交互模式(当输入从TTY读)运行时,您应检查。

测试/ MyApp.java

package test; 

import java.util.Scanner; 
import java.io.Console; 

class MyApp { 
    public static void main(String args[]) { 
     Scanner scanner = new Scanner(System.in); 
     Console console = System.console(); 

     int[] numbers = new int[3]; 
     for (int i = 0; i < 3; i++){ 
      if (console != null) { 
       System.out.print("Please enter a number: "); 
      } 
      numbers[i] = scanner.nextInt(); 
      System.out.printf("Number: %d\n", numbers[i]); 
     } 
    } 
} 

测试

$ printf '%d\n%d\n%d\n' 1 2 3 > file 
$ javac -cp . test/MyApp.java 
$ java -cp . test/MyApp <file> out 
$ cat out 
Number: 1 
Number: 2 
Number: 3 
+0

很好的答案 - 但我特别不想修改程序。 – Arya

+0

@Arya,恐怕是不可避免的 –

1

你可以做些什么来对输入和输出的混合值是:

1)创建您自己的应用程序,它将调用应用程序的main方法进行测试(如果所有应用程序都有相同的包和主类名称,或者您必须将此信息提供给您自己的程序,并使用反射来调用其他程序)。

您的应用程序将执行以下步骤:

2)存储常规系统InputStream

InputStream oldInputStream = System.in; 

3)创建您自己的InputStream(子类我们称之为YourCustomInputStream),并实现不同读取方法,将从System.in读取的内容打印到System.out,并返回该值。

e.g:

@Override 
public int read(){ 

    int readInt = oldInputStream.read(); 
    System.out.println(readInt); 
    return readInt; 

} 

4)通过自己的流更换系统的输入:

System.setIn(new YourCustomInputStream()); 

5)调用应用程序进行测试的方法main

0

首先,我想合并输出和错误是这样的:

while read -r num; do 
    sleep 1 
    echo ${num}>&2 
    echo ${num} 
done < input.txt | java program 

当你想要的结果重定向到一个文件,则会失败。

所以,你可以尝试下建设:

while read -r num; do 
    sleep 1 
    echo ${num} 
done < input.txt| tee -a output.txt| java program >> output.txt