Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用相同的InputStreamReader轮询URL_Java_Inputstream - Fatal编程技术网

Java 如何使用相同的InputStreamReader轮询URL

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

我有一个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.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);
}

希望这有帮助。

听起来某种消息队列可能是更好的解决方案。对于给定的代码,
读取器
应该如何为空?您的代码中没有重新分配。此代码中的读取器不可能为空。