Java 如何使用相同的InputStreamReader轮询URL
我有一个URL,它不断地用我想要检索的新数据更新。我写这段代码是为了每5秒检索一次内容,但是Java 如何使用相同的InputStreamReader轮询URL,java,inputstream,Java,Inputstream,我有一个URL,它不断地用我想要检索的新数据更新。我写这段代码是为了每5秒检索一次内容,但是阅读器在一次迭代后为空 InputStream is = new URL("someURL").openStream(); Reader reader = new InputStreamReader(is); Gson gson = new GsonBuilder().create(); while (true){ Info info = gson.fromJson(reader, Info.cl
阅读器在一次迭代后为空
InputStream is = new URL("someURL").openStream();
Reader reader = new InputStreamReader(is);
Gson gson = new GsonBuilder().create();
while (true){
Info info = gson.fromJson(reader, Info.class);
for (Update update : info.updates){
if (update.type.equals("data")){
System.out.println(update.toString());
}
}
Thread.sleep(500);
}
是否可以以某种方式重置读取器
并使其在下一次迭代中从流中读取更新的数据,或者我必须在每次迭代中创建InputStreamReader
的新实例?您需要重新创建输入流(即“Is”)。因此,您需要一次又一次地重新打开连接。并关闭它,如果你想它做的时候(真的)
我不认为reader为null,可能刚刚到达EOS。以下是reader类的文档,InputStreamReader扩展了这些文档:
/**
*重置流。如果已标记流,则尝试
*在标记处重新定位。如果未标记流,则
*尝试以适合特定流的方式重置它,
*例如,将其重新定位到起点。不是全部
*字符输入流支持reset()操作,有些支持
*重置()而不支持标记()。
*
*@exception IOException如果未标记流,
*或者,如果该标记已无效,
*或者,如果流不支持reset(),
*或者如果发生其他I/O错误
*/
public void reset()引发IOException{
抛出新IOException(“不支持重置());
}
InputStreamReader不会重写reset()方法,因此您将无法使用它重置流。您将需要找到一个不同的实现来完成您想要的。或者,您可以通过每次迭代重新创建流。根据性能方面的考虑,只要在每次迭代结束时关闭打开的资源,这可能不是问题
InputStream is = new URL("someURL").openStream();
Reader reader = new InputStreamReader(is);
Gson gson = new GsonBuilder().create();
while (true){
Info info = gson.fromJson(reader, Info.class);
for (Update update : info.updates){
if (update.type.equals("data")){
System.out.println(update.toString());
}
}
Thread.sleep(500);
}
希望这有帮助。听起来某种消息队列可能是更好的解决方案。对于给定的代码,读取器
应该如何为空?您的代码中没有重新分配。此代码中的读取器不可能为空。