StringReader的mark()方法

时间:2014-12-09 15:26:49

标签: java stringreader

我的问题与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()方法之前它不会引用称为一行的标记。这有可能的解决方法吗?我很感激帮助!

2 个答案:

答案 0 :(得分:1)

  1. 由于您知道doSomething()来电mark(),因此在此之前调用mark()毫无意义。

  2. 您可以从同一个字符串中创建新的StringReader,而不是重置StringReader

答案 1 :(得分:0)

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

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