2

我正在尝试将数据从一个程序传递MainProgram到另一个TestProgram我使用反射调用的程序。为此,我重新路由Standard.inByteArrayOutputStream包含我要传输的数据的路径。然后使用 a和TestProgram读取。我在for循环中多次执行整个事情。问题是这样的:第一次,一切正常,从第二次开始,读取. Java 文档指出,如果到达流的末尾,将返回。但是流中肯定有数据,而我的也是0。为什么会突然认为是空的或在流的末尾? Standard.inBufferedReaderreadLine()TestProgramnullSystem.inBufferedReadernullposByteArrayOutputStreamBufferedReaderSystem.in

这是操作流和调用方法的代码:

for(int i = 0; i < numberOfCases; i++) {

  Byte[] paramBytes = getCurrentParamBytes();

  InputStream inputStream = new BufferedInputStream(new ByteArrayInputStream(paramBytes));

  System.setIn(inputStream);
  String[] params = null;

  testProgram.invoke(null, (Object) params);
}  

这是从以下代码读取的代码System.in

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

String current = in.readLine();

我已经向自己保证了System.in使用 Eclipse 调试模式的状态,一切都很好。它只从null第二次调用TestProgrammain 方法开始读取的事实也让我非常困惑。特别是,因为我检查的所有值都与第一次完全相同(当然,流中的数据除外)。

可悲的是,我无法更改 the 的用法,BufferedReader因为TestProgram不是我的课程,必须按原样使用。

任何帮助将不胜感激。

4

1 回答 1

1

问题可能在于BufferedReader在第一次调用时创建了一次。BufferedReader使用InputStream您在循环的第一次迭代中提供的实例。在第二次、第三次等调用时,它仍然使用此流并且不会从 updated 中读取System.in。如果您无法修改TestProgram.

  1. 在每次迭代中创建新实例,TestProgram而不是重用旧实例。BufferedReader如果将内部存储为类变量而不是静态的,则可能有助于“刷新”内部。
  2. 如果您无法创建新实例,TestProgram因为它具有状态或存储在静态变量中,您可以尝试以下操作:使用允许您在运行中连接多个BufferedReader的特殊类型。检查ConcatInputStreamInputStreamInputStreams

第二种方法的示例:

ConcatInputStream concat = new ConcatInputStream();
System.setIn(concat);

for(int i = 0; i < numberOfCases; i++) {

  Byte[] paramBytes = getCurrentParamBytes();

  InputStream inputStream = new BufferedInputStream(new ByteArrayInputStream(paramBytes));

  concat.addInputStream(inputStream);
  String[] params = null;

  testProgram.invoke(null, (Object) params);
}  

我不确定它是否会起作用,因为我不知道 BufferedReader 的行为是什么,如果它在第一次调用时看到流结束,然后在第二次调用时,流突然不再为空(因为我们已将新流添加到concat)。但希望它会奏效。

还有第三种方法:您可以TestProgram使用例如JD进行反编译并找到BufferedReader存储实例的位置。然后您可以使用反射在迭代之间将其设置为 null。但它非常容易出错。

于 2013-12-02T16:03:04.550 回答