繁体   English   中英

限制Java NIO通道(文件或套接字)中可用的内容

[英]Limit the content available from a Java NIO Channel (File or Socket)

我对NIO还是很陌生,想用它实现一些功能,而不是典型的Streams(它可以完成所有事情)。

我不确定我能得到的是从文件读取到缓冲区中并限制要传输的内容。 假设从位置100到200(即使文件长度为1000)。 在网络套接字上做也很好。

我知道NIO保持基本功能来利用OS功能,这就是为什么我不确定可以做到这一点的原因。

我当时在想,一种棘手的方法是“ LimitedReadChannel”,当它返回的值小于可用的缓冲区大小时,它将使用另一个字节缓冲区,然后再传输到原始的字节缓冲区(1)。 但是似乎比需要的更棘手。 我也不想使用任何与流相关的东西,因为它会破坏使用NIO的目的。

(1)到目前为止...

LimitedChannel.read(buffer) {
  if (buffer.available?? > contentLeft) {
    delegateChannel.read(smallerBuffer);
    // transfer from smallerBuffer to buffer
  } else {
    delegateChannel.read(buffer);
  }

}

我发现Buffer承认要求当前限制或设置新限制。 这样包装器通道(用于限制读取的有效字节数的通道)可以修改缓冲区限制,以避免读取更多内容...

就像是:

// LimitedChannel.java
// private int bytesLeft; // remaining amount of bytes to read
public int read(ByteBuffer buffer) {
  if (bytesLeft <= 0) {
    return -1;
  }
  int oldLimit = buffer.limit();
  if (bytesLeft < buffer.remaining()) {
    // ensure I'm not reading more than allowed
    buffer.limit(buffer.position() + bytesLeft);
  }
  int bytesRead = delegateChannel.read(buffer);
  bytesLeft -= bytesRead;
  buffer.limit(oldLimit);
  return bytesRead;
}

无论如何,不​​确定此位置是否已经存在。 很难找到有关此用例的文档...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM