Java NIO中的缓冲区标记

时间:2017-05-21 13:17:51

标签: java buffer nio bytebuffer markers

我在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;”

1 个答案:

答案 0 :(得分:0)

看看这一行:

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;
}

重置将抛出InvalidMarkException而mark = -1;

您可以删除:buffer.position(7).mark().position(prevPos);,并将buffer.reset();更改为buffer.position(7);