在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)您是否知道在InputStream不关闭相关套接字的情况下中断Java读取的方法?
以下是抓取套接字输入流并转换为可中断DataInputStream的当前构造策略:
InputStream interruptibleInputStream = Channels.newInputStream(Channels.newChannel(m_ConnectionData.getSocket().getInputStream()));
DataInputStream myInterruptibleDIS = new DataInputStream(interruptibleInputStream);
Run Code Online (Sandbox Code Playgroud)
这使用了一个ReadableByteChannel提供read(ByteBuffer)支持ClosedByInterruptExceptionthrowable的方法.
问题是,调用线程使一个中断read()的电话DataInputStream的原因底层套接字被关闭.
对于我的上下文,我需要套接字保持打开状态; 该read调用正在等待未来的用户输入,因此我正在使用中断将控制权传递回更高的组件,然后最终read再次返回.
如果有人能够建议使用JDK内置类来实现这一目标,或者可能指出某些信息无法实现,我将非常感激.
我知道还有其他方法可以达到同样的效果,但我很想知道这种方法是否可行.
我是java新手,我试图制作客户端 - 服务器形式.客户端和服务器可以相互聊天.所以我的客户端有2个线程用于2个任务:发送和接收消息.我想当我的SendThread从键盘字符串"Bye"读取时,我的客户端将停止2个线程.但问题是线程接收仍然执行BufferedReader的语句readline()所以它无法到达出口这里是我的代码:
try {
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (!stop) {
String temp = br.readLine();
if (temp.length() == 0) {
Thread.sleep(100);
}
else System.out.println(" Receiving from server: " + temp);
}
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
更新:对不起大家,因为我没有更清楚地解释.我的客户端有2个独立运行的线程.因此,此代码所在的ReceiveThread可以始终等待来自服务器的消息.SendThread也总是从键盘读取数据.因此,当我输入"Bye"时,SendThread会读取此字符串并停止客户端.问题是ReceiveThread正在执行,readLine()所以它无法自行停止.