gpt4 book ai didi

java - BufferedReader 返回 null,即使它正在读取的流位于 pos 0

转载 作者:行者123 更新时间:2023-11-30 11:25:17 25 4
gpt4 key购买 nike

我正在尝试将数据从程序 MainProgram 传递到另一个程序 TestProgram,我使用反射调用它。为此,我将 Standard.in 重新路由到包含我要传输的数据的 ByteArrayOutputStreamTestProgram 然后使用 BufferedReaderreadLine()Standard.in 中读取。我在 for 循环中多次执行整个过程。问题是这样的:第一次,一切正常,从第二次开始,TestProgramSystem.in 读取 null。 Java 文档指出,如果到达流的末尾,BufferedReader 将返回 null。但是流中肯定有数据,而且我的ByteArrayOutputStreampos也是0。为什么BufferedReader会突然认为System .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();

我已经使用 Eclipse 的 Debug模式确定了 System.in 的状态,一切正常。从第二次调用 TestProgram 的 main 方法开始,它只读取 null 的事实也让我很困惑。特别是,因为我检查过的所有值都与第一次时完全相同(当然,流中的数据除外)。

遗憾的是,我无法更改 BufferedReader 的使用,因为 TestProgram 不是我的类,必须按原样使用。

如有任何帮助,我们将不胜感激。

最佳答案

问题可能在于 BufferedReader 在第一次调用时创建了一次。 BufferedReader 使用您在循环的第一次迭代中提供的 InputStream 实例。在第二次、第三次等调用中,它仍然使用此流并且不从更新的 System.in 中读取。如果您不能修改 TestProgram 的源代码,我看到 2 种可能的解决方案。

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

第二种方法的例子:

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。但它很容易出错。

关于java - BufferedReader 返回 null,即使它正在读取的流位于 pos 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20332011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com