javanio中的缓冲区标记

javanio中的缓冲区标记,java,buffer,nio,bytebuffer,markers,Java,Buffer,Nio,Bytebuffer,Markers,我有一个关于JavaNIOAPI中缓冲区类的标记函数的问题。 我尝试使用ByteBuffer运行一些示例,它继承了Buffer父类的标记功能 我想要实现的示例是使用标记功能将“AwesomeSauce”作为输出,然后是“Sauce”。 代码如下: public class MarkingNIO { public static void main(String[] args) { ByteBuffer buffer = ByteBuffer.allocate(20); byte

我有一个关于JavaNIOAPI中缓冲区类的标记函数的问题。 我尝试使用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()的实现:

公共最终缓冲区重置(){
int m=标记;
if(m<0)
抛出新的InvalidMarkException();
位置=m;
归还这个;
}
重置将在mark=-1时引发InvalidMarkException


您可以删除:
buffer.position(7.mark().position(prevPos))
,并更改
缓冲区.reset()进入
缓冲区位置(7)

您不需要这么复杂。直接使用
get(int index)
。我这样做是为了学习。我这样做是为了测试标记和重置功能。无论哪种方式,您的评论都对我有所帮助,因为我没有注意到flip方法的标记=-1。非常感谢。依赖于实现不是一个好主意,因为代码会随着时间的推移而改变。但是,对于未来的每个Java版本来说,保持稳定的是标记,它表示:“如果定义了标记,那么它将被丢弃。”
public final Buffer reset() {
    int m = mark;
    if (m < 0)
        throw new InvalidMarkException();
    position = m;
    return this;
}