2013-03-14 83 views
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() 
    } 
} 

如何解决这个问题?

谢谢

+0

'BufferedReader'可能是不是真的意味着处理这种情况。或许你自己将解析的数据保存在内存中,也可以放在'List '中。 – millimoose 2013-03-14 21:48:18

回答

2

有没有办法做到这一点开箱。你可以写一个装饰器来完成它,也许有一堆标记。但是,如果你关心的只是阅读和倒带,我认为一个更容易的实现是使用列表来维护“历史”和“推回”。

我认为这说明它会比德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()); 
}