多个Mark()BufferReader

时间:2013-03-14 21:46:07

标签: java

是否可以为缓冲读取器设置多个标记,以便我可以多次提前读取?

所以我的代码相当长,但基本的想法是在设置了一个我将要回归的标记后,我提前阅读。我的代码检查这个“前方”行是否符合某些条件,如果是,它会在返回到初始行之前读取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()
    }
}

怎么会绕过这个?

由于

1 个答案:

答案 0 :(得分:2)

没有办法开箱即用。你可以编写一个装饰器,它可能带有一叠标记。但是,如果你所关心的只是按行阅读和倒带,我认为更简单的实现是使用列表来维护“历史”和“推迟”。

我认为描述它会比Teh Codez更多,所以这是第一次实现(这是不是生产质量代码;一方面,它不限制历史列表,所以你可能很容易耗尽内存):

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