gpt4 book ai didi

java - 多个 Mark() BufferReader

转载 作者:行者123 更新时间:2023-11-30 09:25:10 24 4
gpt4 key购买 nike

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

所以我的代码比较长,但基本思路是在设置一个我将要返回的标记之后,我提前阅读。我的代码检查此“前面”行是否满足某些条件,如果满足,它会在返回初始行之前提前读取 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()
}
}

如何解决这个问题?

谢谢

最佳答案

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

我认为描述它比 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());
}

关于java - 多个 Mark() BufferReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15420799/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com