【问题标题】:Multiple marks in ReaderReader 中的多个标记
【发布时间】:2012-12-06 02:36:11
【问题描述】:

我找不到用 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 库的任何支持还是我一个人?

【问题讨论】:

  • 我相信mark 开始在内部缓存数据,并在调用 reset 时重放它。这就是为什么你必须在标记被丢弃之前设置缓冲区大小
  • 我需要任何支持这种简单操作的方法或Reader 实现。 C语言有ftellfseek
  • 你是一个人,但我喜欢这个主意。听起来类似于 Stack

标签: java groovy bufferedreader


【解决方案1】:

所以我自己写的-.-

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

这足以满足我的需要。仅支持单字节 chars ;-)

【讨论】:

    【解决方案2】:

    您可以尝试围绕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,并改为标记那个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      • 2018-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多