2

バッファリーダーに複数のマークを設定して、複数回先読みできるようにすることはできますか?

したがって、私のコードはかなり長いですが、基本的な考え方は、戻るマークを設定した後、先読みすることです。私のコードは、この「先行」行が何らかの条件を満たすかどうかをチェックします。満たす場合は、最初の行に戻る前に4行または1行先読みします。

String line = in.readLine(); //reading first line
in.mark(1000);  

while(nextLine != null){
    String nextLine = in.readLine();  
    //NEED TO SET MARK HERE TO RETURN TO
    if(!nextLineType.equals("something")){
        if(nextLine meets some condition){
           //read next four lines
        }else{
           //read next line
        }
    }else{
        in.reset()
    }
}

これをどのように回避しますか?

ありがとう

4

1 に答える 1

2

箱から出してこれを行う方法はありません。おそらくマークのスタックを使用して、それを行うデコレータを作成できます。ただし、行ごとの読み取りと巻き戻しだけが気になる場合は、リストを使用して「履歴」と「プッシュバック」を維持する方がはるかに簡単な実装だと思います。

説明にはTehCodezよりも多くの行が必要になると思うので、実装の最初のカットを示します(これは本番品質のコードではありません。たとえば、履歴リストを制限しないため、メモリが不足する可能性があります。 )::

import java.io.BufferedReader;
import java.io.IOException;
import java.util.LinkedList;

public class ReaderBuffer
{
    private BufferedReader reader;

    private LinkedList<String> history = new LinkedList<String>();
    private LinkedList<String> future = new LinkedList<String>();

    public ReaderBuffer(BufferedReader reader) 
    {
        this.reader = reader;
    }

    public String readLine()
    throws IOException
    {
        String line = null;

        if (future.size() > 0)
            line = future.removeFirst();

        if (line == null)
            line = reader.readLine();

        if (line != null)
            history.add(line);

        return line;
    }

    public void rewind(int numLines) 
    {
        for (int ii = 0 ; ii < numLines ; ii++) 
            future.addFirst(history.removeLast());
    }
}

そして、これがその使用方法の例です:

@Test
public void testRewind() throws Exception 
{
    BufferedReader rdr = new BufferedReader(new StringReader("foo\nbar\nbaz\n"));
    ReaderBuffer buf = new ReaderBuffer(rdr);

    assertEquals("foo", buf.readLine());
    assertEquals("bar", buf.readLine());
    assertEquals("baz", buf.readLine());
    assertEquals(null,  buf.readLine());

    buf.rewind(2);

    assertEquals("bar", buf.readLine());
    assertEquals("baz", buf.readLine());
    assertEquals(null,  buf.readLine());
}
于 2013-03-15T22:16:54.423 に答える