簡體   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