当前位置: 首页 > 面试题库 >

有什么方法可以使用java.nio。*在不关闭套接字的情况下中断InputStream#read()?

訾高明
2023-03-14
问题内容

您是否知道在InputStream不关闭关联套接字的情况下中断Java读取的方法?

这是获取套接字输入流并转换为可中断的DataInputStream的当前构造策略:

InputStream interruptibleInputStream = Channels.newInputStream(Channels.newChannel(m_ConnectionData.getSocket().getInputStream()));
DataInputStream myInterruptibleDIS = new DataInputStream(interruptibleInputStream);

这利用ReadableByteChannel提供了read(ByteBuffer)ClosedByInterruptExceptionthrowable的支持的方法的a

问题在于,在线程上调用中断再在原因read()上调用DataInputStream会导致底层套接字被关闭。

就我而言,我需要使套接字保持打开状态。该read呼叫正在等待即将到来的用户输入,因此我正在使用中断将控制权传递回更高的组件,然后最终read再次返回

如果有人可以提出一种使用JDK内置类实现此目标的方法,或者指出某些信息是不可能的,我将不胜感激。

我知道还有其他方法可以达到相同的效果,但是我很想知道这种方法是否可行。


问题答案:

如果在读取过程中中断了InterruptibleChannel,它将被关闭并抛出ClosedByInterruptException。如果您只想读取超时,请不要使用任何通道,而只需使用常规的Socket;用较短的超时调用Socket.setSoTimeout(),并在每次超时触发时检查线程的isInterrupted()状态。更好的是,查看中断线程的要求。那个有什么用途?



 类似资料:
  • 问题内容: 前几天与同事进行了交谈。 使用构造函数是显而易见的,但是还有其他方法吗? 问题答案: 有四种在Java中创建对象的方法: 一 。使用关键字 这是在Java中创建对象的最常见方法。几乎99%的对象都是通过这种方式创建的。 乙 。使用 如果我们知道类的名称,并且它具有公共的默认构造函数,则可以通过这种方式创建一个对象。 Ç 。使用 clone()可用于创建现有对象的副本。 d 。使用 对象

  • 本文向大家介绍什么情况下可以不写PHP的闭合标签“?>”,包括了什么情况下可以不写PHP的闭合标签“?>”的使用技巧和注意事项,需要的朋友参考一下 在一些PHP项目里我们经常会看到有些PHP文件中的代码是只有开始标签,而没有结束标签的,那么什么情况下可以不写这个结束标签,而什么情况下又必须写? 对此我们先来看2个例子: 下面的代码可以正常运行: 下面的代码会报错: 原因分析: 前者是纯php代码,

  • 更奇怪的是,当我在对等程序之外使用它时,这段代码仍然有效。任何帮助都将非常感谢,我已经为这件事挣扎了两天了。

  • 我正在练习作曲。我有一个简单的设计,其中包含LazyColzo和TextField。我想做的就是将TextField固定在底部。问题是由于可组合没有静态高度,它填充了所有屏幕并使消失。我使用可组合并设置高度修复了这个问题。我想知道是否有任何方法可以通过仅使用而不是来实现这一点。

  • 问题内容: 在我应重视和每当用户希望看到它或不分离。附加工作正常,但分离失败。中断方法的默认答案始终是关闭流,但是在这种情况下,我将无法完成,否则将完成或至少无法用于将来的附件。这是读取流的方式: 为了分离,我尝试了一些东西: 关闭任何流,失败:close方法被阻塞并等待readLine() 实现另一个流,以发送空值/中止值,失败:当一个人等待输入时,另一个甚至没有被调用 使用反射来解锁任何流中的