簡體   English   中英

Java NIO中的緩沖區標記

[英]Buffer Marking in Java NIO

我在Java NIO API中遇到有關Buffer類的標記功能的問題。 我正在嘗試使用ByteBuffer運行一些示例,它從Buffer父類繼承了標記功能。

我要實現的示例是首先使用標記功能將“ AwesomeSauce”作為輸出,然后是“ Sauce”。 代碼如下:

public class MarkingNIO {

public static void main(String[] args) {
    ByteBuffer buffer = ByteBuffer.allocate(20);
    byte byteArray[];

    buffer.put("AwesomeSauce".getBytes());

    int prevPos = buffer.position();
    buffer.position(7).mark().position(prevPos); //Mark position 7 and revert back so that we can flip
    buffer.flip();

    byteArray = new byte[buffer.limit() - buffer.position()];

    for (int i = 0; buffer.hasRemaining(); i++) {
        byteArray[i] = buffer.get();
    }

    System.out.println("Whole string: " + new String(byteArray));

    buffer.reset();

    byteArray = new byte[buffer.limit() - buffer.position()];

    for (int i = 0; buffer.hasRemaining(); i++) {
        byteArray[i] = buffer.get();
    }

    System.out.println("Partial String" + new String(byteArray));
}
}

對我來說輸出如下:

AwesomeSauce
Exception in thread "main" java.nio.InvalidMarkException
    at java.nio.Buffer.reset(Buffer.java:306)
    at markingnio.MarkingNIO.main(MarkingNIO.java:37)
Java Result: 1

錯誤指向重置方法。

編輯:我這樣做是為了學習目的測試出mark()和reset()方法。 無論哪種方式,問題都是flip()方法的語句為“ mark = -1”,而position(int)的語句為“ if(mark> position)mark = -1;”。

看這行:

buffer.flip();
public final Buffer flip() {
    limit = position;
    position = 0;
    mark = -1;
    return this;
}

該調用將設置mark = -1,並參見reset()方法的實現:

public final Buffer reset() {
    int m = mark;
    if (m < 0)
        throw new InvalidMarkException();
    position = m;
    return this;
}

當mark = -1時,重置將引發InvalidMarkException;

您可以刪除以下內容: buffer.position(7).mark().position(prevPos); ,然后更改buffer.reset(); 放入buffer.position(7);

暫無
暫無

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

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