Reader中有多个标记

时间:2012-12-18 20:01:20

标签: java groovy bufferedreader

我找不到用Java(或Groovy)编写以下代码的功能

reader.mark();   //(1)
reader.read();   //reads 'a'
reader.mark();   //(2)
reader.read();   //reads 'b'
reader.reset();  //back to (2)
reader.read();   //reads 'b'
reader.reset();  //back to (1)
reader.read();   //reads 'a'
reader.read();   //reads 'b'

Reader.mark(int)是一个不错的方法,但它不会叠加标记,它只保留最新的标记..

来自Java库的任何支持还是我自己的支持?

2 个答案:

答案 0 :(得分:8)

所以我自己写了 - .-

class CharReader {
    private Stack marks;
    private RandomAccessFile reader;

    CharReader(File file) {
        this.marks = new Stack();
        this.reader = new RandomAccessFile(file, 'r');
    }

    void mark() {
        long mark = reader.getFilePointer();
        marks.push(mark);
    }

    void reset() {
        if (marks.size() <= 0)
            return

        long mark = marks.pop();
        reader.seek(mark);
    }

    char peek() {
        mark();
        char nextChar = next();
        reset();
        return nextChar;
    }


    char next() {
        int nextChar;
        if ((nextChar = nextInt()) >= 0) {
            return (char) nextChar;
        }
        throw new IllegalStateException("Reader empty");
    }

    private int nextInt() {
        return reader.read();
    }
}

这足以满足我的需求。仅支持单字节char s; - )

答案 1 :(得分:0)

您可以尝试在PushBackReader周围实现某些功能,该功能具有unread方法,允许您将不需要的字符推送到回送缓冲区。

char a, b;         // reader holds "ab"
a = reader.read(); // reader holds "b"
b = reader.read(); // reader holds ""
reader.unread(b);  // reader holds "b"
b = reader.read(); // reader holds ""
reader.unread(b);  // reader holds "b"
reader.unread(a);  // reader holds "ab"
a = reader.read(); // reader holds "b"
b = reader.read(); // reader holds ""

对于解析应用程序而言,这种设施足以满足您的需求。

另一个选项是每个嵌套图层需要标记以在它们传递的顶部之上构建新的Reader,并标记该标记。