2012-10-23 24 views
6

可能重复:
Writing data to System.in在Java中如何为System.in赋值?

我们知道,System.in(标准输入)连接到控制台。所以,无论何时我们在控制台中写入,它都会流向这个流。但是有没有办法将值传递给这个标准输入而无需从控制台输入,即如System.in = "ABCD"。我只是想模仿价值从控制台传递。

+0

你到底想干什么?我听起来很奇怪。其实你读了System.in中有什么,而不是分配给它。 –

回答

13

是的,有。使用System.setIn(InputStream in)

您可以提供的InputStream任何亚型为好,所以如果你要提供一个特定的值,可以使用StringBufferInputStream,就像这样:

StringBufferInputStream s = new StringBufferInputStream("ABCD"); 
System.setIn(s); 
+1

虽然它被声明为'public final static InputStream' –

+0

但它不适用于多线程。我在一个线程中使用System.setIn(s),并在另一个线程中使用Scanner.nextLine()。当我从一个线程将值传递给System.SetIn时,它对使用Scanner.nextLine()的另一个线程没有任何影响。有什么办法让它在多线程中工作吗? – Angom

+2

当我读到它时,您已经在第二个线程中创建了一个'Scanner',*在第一个线程中更改'System.in'之前*。扫描器保存对创建期间提供给它的“InputStream”的引用。如果在第二个线程中创建'Scanner'之前从第一个线程调用'System.setIn(...)',它应该没有问题。 – mthmulders

0

我认为,而不是你的方法是直接访问System.in:

public void run() { 

    process(System.in); 

} 

public void process(InputStream is) { 

    byte b[] = new byte[4000]; 
    int bytesRead = is.read(b); 

    ... 

} 

public void process() { 

    byte b[] = new byte[4000]; 
    int bytesRead = System.in.read(b); 

    ... 

} 

你应该让输入流被传递到方法因素说出来

这给了你相同的行为,但可以让你用自己设计的输入流调用业务逻辑以用于测试目的。