【问题标题】:mark() method of StringReaderStringReader 的 mark() 方法
【发布时间】:2014-12-09 15:26:49
【问题描述】:

我的问题与 Java 的 StringReader 的 mark() 方法有关。这是我的场景:

StringReader reader = new StringReader("Test123");

reader.mark(0);
boolean bool = doSomething(reader)//reads from reader with calls to mark() inside
if (bool == false) {
    reader.reset();
}

doSomethingElse(reader);

如果 doSomething() 返回 false,我想将我的阅读器恢复到其原始状态。因为 reset() 只会将阅读器重置回之前调用的标记,并且在 doSomething() 方法中调用了标记,所以它不引用在进入 doSomething() 方法之前调用的标记。有没有可能的解决方法?感谢您的帮助!

【问题讨论】:

    标签: java stringreader


    【解决方案1】:
    1. 既然你知道doSomething()调用mark(),那么在此之前调用mark()是没有意义的。

    2. 无需重置StringReader,您只需从同一字符串创建一个新的StringReader

    【讨论】:

    • 问题在于 StringReader 正在从更高级别的函数传递给此函数,并且需要始终保持对它的引用。
    • 好的,你没有提到。你能控制这个更高的功能吗?如果是这样,您可以编写一个类似于 StringReader 的自定义类,但允许随机访问。
    【解决方案2】:

    简单的解决方法是在重置之前标记它:

    StringReader reader = new StringReader("Test123");
    
    boolean bool = doSomething(reader)//reads from reader with calls to mark() inside
    if (bool == false) {
        reader.mark(0);
        reader.reset();
    }
    
    doSomethingElse(reader);
    

    如果你不能这样做,你可以将初始标记位置和阅读器包装在一个自定义对象中:

    class MyReader {
       private int mark = 0;
       private StringReader reader;
    
       MyReader( StringReader reader, int mark ) {
          this.reader = reader;
          this.mark = mark;
       }
    
       public StringReader getReader() { return reader; }
    
       public void hardReset() {
          reader.mark(mark);
          reader.reset();
       }
    }
    

    你会这样使用它:

    StringReader reader = new StringReader("Test123");
    MyReader mr = new MyReader( reader, 0 );
    boolean bool = doSomething(mr); // mr.getReader().mark(i); 
    if (bool == false) {
         mr.hardReset();
    }
    
    doSomethingElse(mr);
    

    【讨论】:

    • 在我重置之前立即标记会破坏目的。它将重置回之前标记的一行,这不是调用 doSomething() 之前的内容。
    • 我明白你的困惑在哪里。 mark(0) 并不总是意味着最初在构造函数中输入的字符串的 0 索引。这意味着与指针当前所在位置相关的 0 索引......因此,如果您两次调用 read(),mark(0) 现在将引用索引 2。
    • 啊。那么这将无法按预期工作。复制是更好的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多