gpt4 book ai didi

java - 如何立即关闭InputStream?

转载 作者:行者123 更新时间:2023-11-30 05:23:37 32 4
gpt4 key购买 nike

有一个无限的输入流,我用以下简单的代码行读取传入的消息:

InputStream inputStream = response.getBody();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
while ((event = reader.readLine()) != null) {
// do the work
}
}
System.out.println("Connection closed");

一切都很好。但我希望能够在一定时间内没有新消息时断开连接。

第一个问题是 readLine 方法会阻塞执行,直到收到下一条消息。这就是我想避免的。我发现this implementation CloasableReader - Bufferedreader 的包装,允许从外部中断 readLine。所以我只是用 CloasableReadervoalá 替换了 BufferedReader - 我退出了 while 循环。但带有“连接已关闭”消息的行仍然没有执行。

我稍微改变了代码......

InputStream inputStream = response.getBody();
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(inputStream));
while ((event = reader.readLine()) != null) {
// do the work
}
} finally {
if (reader != null) {
reader.close();
}
}
System.out.println("Connection closed");

...并意识到实际上 close 方法也会一直等待,直到收到下一条消息。因此,Guava 的 TimeLimiter::callWithTimeout 方法对我不起作用。实际上它工作得很好(在上面的示例中包装了标记为“执行工作”的代码),但我不能离开 try-catch-finaly block 。

内部BufferedReader::close调用InputStreamReader::close,它又调用InputStream::close,这就是问题所在。我只是在等待,并且会永远这样做。

我现在不知道该怎么办。如何强制关闭流?

最佳答案

您的问题看起来与 this one 非常相似。您可以尝试在那里找到有关 callWithTimeout 的线索。

如果您的输入流来自某个套接字,您可以尝试不带 callWithTimeout 的版本并添加 Socket.setSoTimeout,这样它会抛出 java.net.在指定的毫秒数后从 InputStream 读取时出现 SocketTimeoutException

编辑:由于您使用的是ClientHttpResponse,因此您可以像这样设置读取和连接超时

    @Component
public static class RestTemplateInitializer implements ApplicationListener<ApplicationReadyEvent> {

public static HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();

@Override
public void onApplicationEvent(ApplicationReadyEvent e) {
clientHttpRequestFactory.setConnectTimeout(10000);
clientHttpRequestFactory.setReadTimeout(10000);
}


}

关于java - 如何立即关闭InputStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59091719/

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