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

没有办法开箱即用。你可以写一个装饰器来做这件事,也许有一堆标记。但是,如果您只关心逐行阅读和倒带,我认为更简单的实现是使用列表来维护“历史”和“回退”。

我认为描述它会比 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());
}
于 2013-03-15T22:16:54.423 回答