2013-03-14 3 views
2

Возможно ли установить несколько меток для буферизатора, чтобы я мог читать несколько раз?Multiple Mark() BufferReader

Так что мой код довольно длинный, но основная идея заключается в том, что после установки знака, на который я вернусь, я буду читать дальше. Мой код проверяет, соответствует ли эта строка «впереди» определенному условию, если он это делает, он читает вперед 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() 
    } 
} 

Как можно обойти это?

Thanks

+0

'BufferedReader', вероятно, на самом деле не имел в виду, чтобы справиться с этим сценарием. Храните анализируемые данные в памяти самостоятельно, возможно, в строке «». – millimoose

ответ

2

Невозможно сделать это из коробки. Вы можете написать декоратор, который делает это, возможно, со стопкой меток. Однако, если все, о чем вы заботитесь, это чтение и перемотка по линиям, я считаю, что гораздо проще реализовать списки, чтобы поддерживать «историю» и «pushback».

Я думаю, что для описания этого потребуется больше строк, чем Tez 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()); 
}