Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 多标记()缓冲读取器_Java - Fatal编程技术网

Java 多标记()缓冲读取器

Java 多标记()缓冲读取器,java,Java,是否可以为缓冲区读取器设置多个标记,以便我可以提前读取多次 因此,我的代码相当长,但基本思想是在设置了一个标记之后,我将返回,我会提前阅读。我的代码检查这一“前进”行是否满足某些条件,如果满足,则在返回到初始行之前先读取4行或1行 String line = in.readLine(); //reading first line in.mark(1000); while(nextLine != null){ String nextLine = in.readLine();

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

因此,我的代码相当长,但基本思想是在设置了一个标记之后,我将返回,我会提前阅读。我的代码检查这一“前进”行是否满足某些条件,如果满足,则在返回到初始行之前先读取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()
    }
}
你怎么能避开这件事呢


谢谢

没有现成的方法可以做到这一点。你可以写一个装饰师来做,也许有一堆标记。然而,如果您所关心的只是逐行阅读和倒带,那么我认为一个更简单的实现是使用列表来维护“历史”和“后推”

我认为描述它需要比Codez更多的行数,因此这里是实现的第一步(这不是生产质量代码;首先,它不限制历史记录列表,因此很容易耗尽内存):


BufferedReader
可能并不是真的要处理这种情况。将解析后的数据保存在内存中,可能是在一个
行列表中。
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());
}