有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我是NIO的新手,希望用它实现一些特性,而不是典型的流(它可以做各种事情)

我不确定我能得到的是将文件读入缓冲区并限制我将传输的内容。假设从位置100到200(即使文件长度为1000)。在网络socket上也可以这样做

我知道NIO保留了一些基本的东西来利用操作系统的功能,这就是为什么我不确定它是否可以做到的原因

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

(1)到目前为止

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

}


共 (1) 个答案

  1. # 1 楼答案

    我发现缓冲区允许要求当前限制或设置新限制。因此,包装器通道(限制有效读取字节数的通道)可以修改缓冲区限制以避免读取更多

    比如:

    // 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;
    }
    

    无论如何,我不确定这是否已经存在。很难找到关于这个用例的文档