是否可以为缓冲读取器设置多个标记,以便我可以多次提前读取?
所以我的代码相当长,但基本的想法是在设置了一个我将要回归的标记后,我提前阅读。我的代码检查这个“前方”行是否符合某些条件,如果是,它会在返回到初始行之前读取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()
}
}
怎么会绕过这个?
由于
答案 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());
}