我想读取URL的内容,但如果URL没有响应则不想"挂起".我使用URL创建了一个BufferedReader ...
URL theURL = new URL(url);
URLConnection urlConn = theURL.openConnection();
urlConn.setDoOutput(true);
BufferedReader urlReader = new BufferedReader(newInputStreamReader(urlConn.getInputStream()));
Run Code Online (Sandbox Code Playgroud)
...然后开始循环阅读内容......
do
{
buf = urlReader.readLine();
if (buf != null)
{
resultBuffer.append(buf);
resultBuffer.append("\n");
}
}
while (buf != null);
Run Code Online (Sandbox Code Playgroud)
...但如果读取挂起,则应用程序挂起.
有没有办法,如果没有将代码磨到套接字级别,必要时"超时"读取?
在InputStream我的Process应该安装和拆卸每当用户希望看到这一点.附着工作正常,但分离失败.中断该readLine()方法的默认答案始终是关闭流,但我不能在这种情况下或Process将完成或至少不可用于将来的附件.这是流的读取方式:
BufferedReader reader = new BufferedReader(new InputStreamReader(getProcess().getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
Run Code Online (Sandbox Code Playgroud)
为了分离,我尝试了一些东西:
SequenceInputStream,失败:当一个人InputStream在等待输入时,另一个甚至没有被调用使用反射解锁read()任何流内的方法,失败:不确定原因,但没有工作.我们应该继续这个尝试吗?这是源代码:
try {
Field modifiers = Field.class.getDeclaredField("modifiers");
modifiers.setAccessible(true);
Field fdecoder = stream.getClass().getDeclaredField("sd");
fdecoder.setAccessible(true);
modifiers.setInt(fdecoder, 1);
StreamDecoder decoder = (StreamDecoder) fdecoder.get(stream);
Field flock = decoder.getClass().getSuperclass().getDeclaredField("lock");
flock.setAccessible(true);
modifiers.setInt(flock, 1);
Object lock = (Object) flock.get(decoder);
synchronized (lock) {
lock.notifyAll();
}
} catch (NoSuchFieldException | IllegalAccessException e) …Run Code Online (Sandbox Code Playgroud)