4 回答
![?](http://img1.sycdn.imooc.com/54586453000163bd02200220-100-100.jpg)
TA贡献1829条经验 获得超7个赞
InputStream您可以使用负责处理的自定义实现通过另一个线程发送输入。我下面的版本也允许用户输入。
请注意,此解决方案并不完美,但应该让您对如何操作有一个粗略的印象。
public static void main(final String[] args) {
System.out.println("What now?");
DoubleSourceInputStream inputStream = new DoubleSourceInputStream();
final Scanner scanner = new Scanner(inputStream);
new Thread() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
inputStream.addBytes(("do task " + i + "\r\n").getBytes());
}
// to signal we are done, otherwise the queue would be polled forever
inputStream.addBytes(new byte[] { -1 });
}
}.start();
final String response = scanner.nextLine();
scanner.close();
System.out.println("Finished: " + response);
}
static class DoubleSourceInputStream extends InputStream {
BlockingQueue<Byte> buffer = new LinkedBlockingQueue<>();
@Override
public int read() throws IOException {
if (System.in.available() > 0)
return System.in.read();
try {
return buffer.take().intValue();
}
catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
public void addBytes(byte[] bytes) {
for (byte b : bytes) {
buffer.offer(Byte.valueOf(b));
}
}
}
![?](http://img1.sycdn.imooc.com/545850c80001ebf202200220-100-100.jpg)
TA贡献1875条经验 获得超3个赞
与其重新发明轮子,不如使用终端的功能来完成。
您通常使用 运行程序的图像java -jar program.jar
,您现在需要将其运行为java -jar program.jar <input.txt
,其中input.txt
包含您在交互运行时通常从键盘传递的所有数据。
这仅在您的程序是可预测的情况下才有效,但不可预测程序的计时结果通常是无用的,除非运行数千次。
![?](http://img1.sycdn.imooc.com/545863e80001889e02200220-100-100.jpg)
TA贡献1821条经验 获得超6个赞
使用 Main 类作为引导程序方法,并在对InputStream(输入)和PrintStream(输出)进行操作的单独类中实现被测试的代码。
import java.util.Scanner;
public class Main {
public static void main(final String[] args) {
MyCode code = new MyCode(System.in, System.out);
code.run();
}
}
现在您不再局限于System.in为. 从测试引导代码时,只需将 System.in 和 out 替换为测试代码写入和读取的纯流。System.outMyCode
添加回答
举报