问题标签 [nio]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2666 浏览

java - java - 如何在java NIO中创建不同的选择器以接受新连接

我想使用 java NIO 编写 java tcp socket 编程。它工作正常。但是我使用相同的选择器来接受客户端的读取和写入。

如何创建不同的选择器来接受 java NIO 中的新连接、读取和写入。有没有在线帮助。

实际上,当我忙于阅读或编写时,我的选择器会使用更多迭代器。因此,如果连接的客户端数量更多,那么接受新连接的性能就会变慢。但我不希望接受客户变慢

// 创建一个选择器并注册两个套接字通道 Selector selector = null; try { // 创建选择器 selector = Selector.open();

谢谢迪帕克

0 投票
2 回答
10344 浏览

java - 如何使用套接字通道读取和写入数据并接受连接

我使用 java NIO 创建了一个简单的服务器客户端应用程序。我在那里使用了一个选择器来接受连接、读取数据和写入。但我想要一个应用程序,其中 1 个选择器将忙于接受连接,而第 2 个选择器将读取数据,而第 3 个选择器将写入数据。

意味着我不想将所有负载放入单个选择器中。

如何做到这一点?有没有在线帮助

谢谢迪帕克。

// 创建选择器 Selector selector = Selector.open();

0 投票
2 回答
1057 浏览

java - NIO Server 无法监听客户端

您好我正在尝试实现一个简单的 Java NIO 服务器;它将 socketChannel 注册到选择器。因此,我希望听取客户的意见并发送一些回复。socketChannel注册到selector后,即使client(non NIO)发送了一些数据,Server也无法读取;但是,生成的密钥仍在迭代中。

详细视图:服务器端:

公共无效运行(){而(真){

注意:当在单线程中完成时,相同的程序可以工作,但是以上述方式实现时会导致它不听客户端。请帮我解决这个问题。

0 投票
5 回答
3835 浏览

java - 如何找到 TIBCO Rendezvous 消息的字节编码?

在我的 Java 应用程序中,我将 TIBCO RV 消息作为字节归档到文件中。

我正在编写一个可以回放消息的小型实用程序。这样我就可以从字节中创建一个 TibrvMsg 对象,而无需解析文件并手动构造对象。

我遇到的问题是我正在读取在 Linux 机器上创建的文件,并尝试在 Windows 机器上运行我的应用程序。由于文件写入的字符集不同,我收到错误消息。

所以现在,我想要做的是将每条消息记录在一个特定的字符集(UTF-8)中,这样我就不关心我在哪个平台上运行我的播放应用程序了。该应用程序应该只在事先知道的文件中读取写入文件的字符集。我计划为此使用 java.nio 包,将字节从一个字符集转换为另一个字符集。

我是否需要知道 TIBRV 消息字节编码的字符集以进行转换?如果是这样,我怎样才能找到这个?

0 投票
2 回答
2105 浏览

java - 如何定义我自己的 SelectableChannel?

我将如何定义一种新的类型java.nio.channels.SelectableChannel(比如串行端口)?

0 投票
2 回答
2023 浏览

java - SSLEngine 并关闭

我已经实现了一个帮助模块,它让我从与 SSL 一起使用的通道中获取干净的数据并将加密数据写入其中:这是相关的接口(我在该类中也有一些非抽象方法,所以没有说对我来说,“DataProvider 应该是一个接口”;)):

我有一个用于 SSL 的抽象基类的实现。在测试该实现时,我编写了两个函数:在一个函数中,我收到一条带有 SocketChannel 的消息,用于发送数据的 SSLSocket 关闭连接,在另一个中,我使用 SocketChannel 发送一条消息,以此启动关闭。现在,问题是用于接收数据的 SSLSocket 没有关闭,即使我已经发布了这些步骤:

  1. engine.closeOutbound()
  2. engine.wrap()
  3. channel.write(data) (是的,我确定我已经发送了使用 wrap() 获得的所有数据
  4. 选择用于读取入站 close_notify 的通道

问题是选择器卡在第 4 步。

在另一个测试中(SSLSocket 关闭连接)我没有问题。

请注意,我已将 shouldClose 实现为:

所以我需要一个传入的 close_notify 才能关闭,即使我已经初始化了关闭(我不知道这是否正确:最终我可以用 更改它return engine.isOutboundDone()

这是我的 SSLSocket 端代码:

最后一个断言被违反。

最初我认为这是因为没有与 toRead 关联的“后台”线程,所以我应该对其进行读/写以消耗传入的内容close_notify,然后最终关闭套接字,但即使这样也没有帮助。

任何想法?

0 投票
10 回答
26216 浏览

java - Java 大文件磁盘 IO 性能

我的硬盘上有两个(每个 2GB)文件,想将它们相互比较:

  • 使用 Windows 资源管理器复制原始文件大约需要。2-4 分钟(即在同一个物理和逻辑磁盘上读取和写入)。
  • 读取java.io.FileInputStream两次并逐字节比较字节数组需要 20 多分钟。
  • java.io.BufferedInputStream缓冲区为 64kb,文件以块的形式读取,然后进行比较。
  • 比较完成是一个紧密的循环,如

    /li>

我能做些什么来加快速度?NIO 应该比普通流更快吗?Java 是否无法使用 DMA/SATA 技术,而是执行一些缓慢的 OS-API 调用?

编辑:
感谢您的回答。我根据它们做了一些实验。正如安德烈亚斯所展示的

流或nio方法没有太大区别。
更重要的是正确的缓冲区大小。

我自己的实验证实了这一点。由于文件是大块读取的,因此即使是额外的缓冲区 ( BufferedInputStream) 也不会提供任何东西。优化比较是可能的,我通过 32 倍展开获得了最好的结果,但是与磁盘读取相比,比较花费的时间很小,因此加速很小。看起来我无能为力;-(

0 投票
5 回答
18291 浏览

java - 如何使用 Java 代码将图像权限模式更改为 777?

我想使用 Java 代码为图像文件赋予权限模式值“777”。我怎么能用Java给它呢?因为我无法删除默认权限模式“664”的图像。

0 投票
3 回答
5574 浏览

java - 是否可以将 Process stdout InputStream 读入 NIO ByteBuffer?

是否可以使用 NIO 处理来自 Process 的标准输出?我让它与 java.io 一起工作,但这是一个练习,可以更多地了解 NIO 并探索性能改进的可能性。

基本上,我想尽可能快地将大量文本从标准输出流式传输到缓冲区而不会阻塞,然后稍后处理该缓冲区的内容。问题是,我似乎无法找出正确的巫术来使它与 NIO 一起工作。这就是我现在的位置:

StreamConsumer 类如下所示:

0 投票
2 回答
979 浏览

java - java.nio 通道缓冲区流术语

有没有人有一个很好的类比(或者,一个很好的资源)来描述 java.io 和 java.nio 中的缓冲区、流、读取器、通道、选择器等之间的关系?

谢谢