簡體   English   中英

(Java NIO) 在通道之間復制時,我應該檢查讀取的字節和緩沖區 position 嗎?

[英](Java NIO) Should I check both bytes read and buffer position in copying between channels?

此代碼類似於 ByteBuffer.compact() 的 JavaDoc 中的示例代碼

package com.study.nio;

import java.io.*;
import java.nio.*;
import java.nio.channels.*;

public class BufferCopy {

    public static void main(String[] args) {
        var from = "Hello World".getBytes();

        var buf = ByteBuffer.allocate(5);
        buf.clear();
        try (var outputStream = new ByteArrayOutputStream();
             var inChannel = Channels.newChannel(new ByteArrayInputStream(from));
             var outChannel = Channels.newChannel(outputStream);) {
            while (inChannel.read(buf) >= 0 || buf.position() != 0) {
                buf.flip();
                outChannel.write(buf);
                buf.compact();
            }
            System.out.println(outputStream.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

我的問題是我們是否需要在 while 條件檢查中使用“|| buf.position() !=0”

僅供參考, Buffer.compact()文檔中提供的代碼示例如下:

   buf.clear();          // Prepare buffer for use
   while (in.read(buf) >= 0 || buf.position != 0) {
       buf.flip();
       out.write(buf);
       buf.compact();    // In case of partial write
   }

場景 1:條件終於滿足

  • 現在,想象一下通道in達到其 EOF 並將其最后 100 個字節添加到緩沖區buff的時刻。
  • 代碼進入 while 循環,因為in.read(buff) >= 0 ,甚至沒有評估第二個條件。
  • 現在在寫out.write(buff)時,僅發送緩沖區中 100 個字節中的 50 個(可能 output 通道的帶寬非常低或者其緩沖區太小)。
  • 緩沖區被壓縮(pos=50,limit=100,cap=100)。
  • 現在,再次評估 while 條件,這次in.read(buff) >= 0為假,因為in通道處於其 EOF,因此它評估buf.position != 0並且我們發現緩沖區中仍有字節.
  • 因此,它返回到 while 循環並將更多字節寫入 output 通道。

場景 2:緩慢 Output 建立

了解這種情況如何逐漸建立的另一種方法是通過想象 output 通道比輸入通道慢的場景,例如低帶寬和/或較小的 output 緩沖區。

  • 代碼進入 while 循環,因為in.read(buff) >= 0 ,甚至沒有評估第二個條件。 它讀取 100 個字節。
  • 現在在寫out.write(buff)時,緩沖區中的 100 個字節中只有 50 個被發送。
  • 緩沖區被壓縮(pos=50,limit=100,cap=100)。
  • 現在,再次評估 while 條件,這一次in.read(buff) >= 0將 50 個字節添加到緩沖區中,我們再次達到總共 100 個字節。
  • while 以這種方式重復,直到再次達到場景 1 buf.position != 0最終被評估。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM