1

私の質問は、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() メソッドに入る前に 1 行呼び出されたマークを参照しません。これに対する回避策はありますか?助けてくれてありがとう!

4

2 に答える 2

1
  1. doSomething()が を呼び出すことがわかっているので、その前mark()に呼び出しても意味がありませんmark()

  2. をリセットする代わりに、同じ文字列からStringReader新しい を作成できます。StringReader

于 2014-12-09T15:38:31.127 に答える
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);
于 2014-12-09T15:42:16.927 に答える