我有一个类,用户在终端窗口上进行交互并输入某些选项,基于这些选项进行切换并使用某些方法;我需要使用扫描仪来检测用户输入。
我试了几天做一个测试类来模拟用户输入,但我找不到合适的方法来做,因为我无法模拟扫描仪的System.in,也没有找到任何具体的信息,我有看到有关缓冲的事情,但我无法使用它。
这是一次尝试,导致扫描程序出现nullPointerException - 因为没有检测到输入..我也尝试睡眠,然后设置输入。
非常感谢为扫描仪模拟System.in的一个例子。
public void test1addItem()
{
InputStream input = new ByteArrayInputStream("".getBytes());
String data1="1"; //Add an item option
String data2="bread"; //The item to add
input = new ByteArrayInputStream(data1.getBytes());
//System.out.println("DATA1="+input);
System.out.println("TEMP - 1");
System.setIn(input);
System.out.println("TEMP - 2");
tsl.start(); //reference to the class which I am testing
System.out.println("TEMP - 3");
try {
Thread.sleep(2000);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
System.out.println("TEMP - 4");
input = new ByteArrayInputStream(data2.getBytes());
System.out.println("TEMP - 5");
System.setIn(input);
System.out.println("TEMP - 6");
}
它在TEMP - 2处停止,因为它是递归方法,直到给出终止程序的某个选项。
答案 0 :(得分:0)
您是否尝试过重新分配System.in?
System.setIn(new ByteArrayInputStream("data".getBytes()));
答案 1 :(得分:0)
这个想法背后的根本原因是有缺陷的。我假设你想做一些像
这样的事情scanner.read(2);
但是,Scanner旨在从InputStreams中读取,例如标准输入和文件。它需要一个源来读取,而一个常量(如2)只是一个无效的源。
如果您在调用readLine()时使用的方法是将2输入作为输入,则也会出现问题。当您调用read方法时,扫描仪仅开始读取,并且在读取完成之前它们不会停止。所以如果你要做的话
String s = scanner.readLine();
scanner.feed("hi");
代码永远不会到达第二行。如果你要做
scanner.feed("hi");
String s = scanner.readLine();
扫描仪永远不会看到“hi”,因为它是在扫描仪读取之前送入的。
您可以设置某种仅输出常量“hi”的流,但是从System.in或文件中自己模拟输入更为实用。
您也可以将变量设置为输入的内容!例如:
String s = "hi"; //scanner.readLine();