当前位置: 首页 > 知识库问答 >
问题:

java NIO、selectedKeys和STDIN、STDOUT、STDERR的通道

长孙永思
2023-03-14

我有一个程序,通过Pipe. SourceChannel将stdout、stderr和stdin传输到/从Bytes Buffers。

程序使用选择器注册每个通道。

循环中的程序定期遍历 selectedKeys 集中的每个键,这些键对应于 stdout、stderr 和 stdin。对于每个密钥,它确定密钥是否有效、可读或可写,如果是,则与 ByteBuffer 执行相应的 IO 操作

我的问题是,当程序开始时,我可以对最初选择的键集(对应于stdin、stdout、stderr)做什么假设。

stdin 的密钥是否始终是第一个准备好、有效和可读的密钥?标准输出的密钥是否可以在标准输出之前准备就绪、有效且可读?

我这样问是因为我的程序有随机的IO行为,我猜我关于初始键集成员的假设是错误的。

提前感谢。

共有1个答案

凤财
2023-03-14

当存在可以无阻塞读取的数据时,通道是可读的。

通道是可写的,除非它们的内核套接字发送缓冲区中没有空间,这仅在它们的写入速度快于读取器读取速度时才会发生。

 类似资料:
  • 问题内容: 我对这三个文件的目的感到困惑。如果我的理解是正确的,则是程序在其中写入其在进程中运行任务的请求的文件,是内核在其中写入其输出以及请求其从中访问信息的进程的文件,并且是该文件。输入所有例外。在打开这些文件以检查它们是否确实发生时,我似乎没有任何暗示! 我想知道的是这些文件的用途到底是什么,用很少的技术术语就可以完全肯定答案! 问题答案: 标准输入 -这是您的过程读取以获取您的信息的 文件

  • 在 Linux 中,一切都只是文件。这意味着,对于控制台程序: 键盘表示为一个文件,Bash 从中读取你的输入。 显示器表示为一个文件,Bash向输出写入它。 让我们假设,你有一个程序可以计算文件中的行。你可以通过键入wc -l来调用它。现在尝试一下 没有发生什么事吧?它只是卡在那里。错了,它正在等待你的输入。这是它的工作原理: line_counter = 0 while end of file

  • 问题内容: 我想通过python从目录中调用脚本(它们是可执行的shell脚本)。 到现在为止还挺好: 现在我想要的是:假设我有一个具有启动功能的bash脚本。我从那里打电话 回声“某事” 现在,我想看看sys.stdout和退出代码上的回显。我相信您可以使用.communicate()执行此操作,但是我的操作不符合我的预期。 我究竟做错了什么? 任何帮助深表感谢 问题答案: 授予http://d

  • 我试图与一个进程通信(该进程本身会写入stdin和stdout,以便在终端中与用户交互),并在C中读取它的stdin和写入它的stdout。 因此,我尝试以编程方式替换shell用户。一个methapohrical示例:假设出于某种原因我想在C中使用VIM。然后我还需要编写命令(stdout)并从编辑器(stdin)中读取内容。 起初我认为这可能是一项微不足道的任务,但似乎没有标准的方法<代码>i

  • 问题内容: 如果我通过Java的ProcessBuilder类启动流程,则可以完全访问该流程的标准输入,标准输出和标准错误流(如Java 和)。不过,我不能找到一种方法,这些流无缝连接,和。 可以用来获取包含子流程的标准输出和标准错误的单个文件,然后循环遍历并通过我的标准输出将其发送出去,但是我找不到一种方法可以让用户输入到流程中,如果我使用C 调用,他或她可以。 Java SE 7发行时似乎有可

  • 问题内容: 我的Java应用程序使用JNI调用用C编写的库。此本地库将错误记录到stderr,但是我想以某种方式通过我的log4j记录器重定向错误流。这可能吗? C库是外部的-我没有源,所以无法更改它。 谢谢 问题答案: 注意:我尚未尝试此答案;YMMV。 POSIX方法将更改与流关联的基础文件。如联机帮助页所述:“ freopen()函数的主要用途是更改与标准文本流(stderr,stdin或s