Java nio 读取数据代码_Java的; NIO - 从SocketChannel读取大量数据

我正在编写一个非常简单的网络库,以便将来可以用于其他项目。现在,我无法处理阅读操作。我有一个负责处理来自SocketChannels的事件的类,它还包含输入和输出缓冲区。要初始化缓冲区,您需要定义它的大小。所以默认情况下,所有缓冲区的大小都是1024字节。

我遇到的问题是,如果我读取的数据包大于1024字节,我会得到一个异常。这可以通过默认分配更大的缓冲区来解决(例如2048字节,而不是1024),但这似乎是简单的方法,我特别不喜欢该解决方案。

我想出的解决方案是创建一个非常大的直接静态缓冲区(它的大小是Short.MAX_VALUE)。所有来自SocketChannels的数据将被读入大缓冲区,然后复制到较小的缓冲区中(如果缓冲区不适合数据,缓冲区将被扩展)。

我只是担心,不断清理数据并将数据放入大量的“结转”缓冲区可能会有很大的代价。如果有类似SocketChannel.available()的东西,我会喜欢它,但唯一最接近的替代方法是Socket.getInputStream()。available(),但该方法会阻塞。这样我会扩大输入缓冲区(而不是大的),如果有更多的可用数据比缓冲区可以适应。不幸的是,我不能 - 所以我能想到的唯一解决方案就是我上面提到的那个。

我来这里要问......你们中的任何一位明智的人有没有更好的解决方案?另外,我不想使用外部库 - 这只是个人偏好。

提前感谢!

我的道歉。在与一位密友交谈后,我意识到从一开始就没有问题。这是一个很长的解释,所以我不会解释它。我道歉。 h2>

海报注意:请不要删除问题文本。它为其他人提供指导。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值