簡體   English   中英

Java NIO。 為什么flip()方法會破壞我的程序?

[英]Java NIO. Why flip() method breaks my program?

下面的Java代碼:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

public class Test {
    public static void main(String args[]) throws IOException {

        SocketChannel c = SocketChannel.open();
        c.connect(new InetSocketAddress("google.com", 80));

        ByteBuffer b = ByteBuffer.allocate(1024);
        b.put("Request".getBytes());

        System.out.println("Write: " + c.write(b));

        int i;
        while ((i = c.read(b)) != -1) {

            System.out.println("Read: " + i);
            b.clear();

        }
    }
}

實際結果:

寫:1017讀:0讀:1024讀:44

第一次,方法read()讀取0個字節。 這不酷。

我修改了代碼:

    b.put("Request".getBytes());

    System.out.println("Write: " + c.write(b));

    b.flip(); //I added this line
    int i;
    while ((i = c.read(b)) != -1) {

        System.out.println("Read: " + i);
        b.clear();

    }

實際結果:

寫:1017讀:1024讀:44

它看起來已經更好了。 感謝flip()

接下來,我將緩沖區字符串“ Request”放入緩沖區,該字符串的長度為7 ,但是方法write()返回1017

哪種信息方法寫給渠道?

我不確定,該方法寫了字符串“ Request”

好的,我再次修改了代碼:

    b.put("Request".getBytes());

    b.flip(); // I added this line
    System.out.println("Write: " + c.write(b));

    b.flip();
    int i;
    while ((i = c.read(b)) != -1) {

        System.out.println("Read: " + i);
        b.clear();

    }

實際結果:

寫:7

代碼崩潰了...

為什么? 我的錯誤在哪里?

謝謝。

從緩沖區讀取數據之前 ,需要調用flip方法。 flip()方法,將緩沖區的limit重置為當前位置,並將緩沖區的position重置為0。

因此,如果ByteBuffer有7個字節的數據,則您的位置(從0開始)為flip()將其設為limit = 7position = 0 現在,可以進行閱讀了。

這是一個關於如何最好地使用flip()的示例:

public static final void nioCopy(ReadableByteChannel input, WritableByteChannel output) throws IOException {
    ByteBuffer buffer = ByteBuffer.allocate(DEFAULT_BUFFER_SIZE);
    while (input.read(buffer) != -1) {
        //Flip buffer
        buffer.flip();
        //Write to destination
        output.write(buffer);
        //Compact
        buffer.compact();
    }

    //In case we have remainder
    buffer.flip();
    while (buffer.hasRemaining()) {
        //Write to output
        output.write(buffer);
    }
}

盡管其名稱(選擇不當), flip()還是不對稱的。 您必須在從緩沖區進行的任何操作(寫入或獲取)之前調用它,然后再調用compact()clear()將緩沖區放回可以讀取或放置的狀態。

暫無
暫無

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

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