gpt4 book ai didi

Java LineNumberReader 重置为开头

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

我想阅读 InputStream分两遍,逐行进行。我在第一遍中使用以下代码:

LineNumberReader reader = new LineNumberReader(new InputStreamReader(inputStream));

String line;
String eventId = null;
Set<Integer> artistIds = new HashSet<Integer>();
while((line = reader.readLine())!=null) {
// process first pass
}

// how do I reset reader so that I can read from the beginning again?

有一个reset()方法可用,但它重置为最后一个 mark在文件中。我不太明白这意味着什么。我可以使用 markreset实现reset to beginning行为?类似的东西

LineNumberReader reader = new LineNumberReader(new InputStreamReader(inputStream));
reader.mark(0); // mark at the 0th position
// process first pass: repeated calls to readline() until EOF

reader.reset(); // reset to 0th position??
// process second pass

在我的本地计算机上进行测试时,我是 reader.close() - 在第二遍之前进行,它起作用了。但是,当我在 HDFS 中执行此操作时,reader.close()可能也关闭了 HDFS InputStream,我得到 java.io.IOException: Stream closed异常。

最佳答案

标记和重置工作,但不要调用将预读限制设置为 0 的 .mark(0),这意味着 .reset() 将不起作用如果读取超过 0 个字节,则可靠。

编辑: .mark() 标记流中的当前位置。与 C++ 不同,您可以 .seek() 文件的开头或结尾以及偏移量,Java 流只允许您标记当前位置,然后使用 .reset() 返回到该位置。这可以“回到开头”,但前提是在处理开始之前已对其进行了标记。

试试这个:

import java.io.*;

public class StreamTwice
{
public static void printLines(LineNumberReader r) throws IOException
{
String line;
while( (line = r.readLine()) != null )
System.out.println(line);
System.out.println();
}

public static void main(String []args) throws Exception
{
ByteArrayInputStream s = new ByteArrayInputStream(
"one\ntwo\nthree".getBytes()
);
LineNumberReader r = new LineNumberReader(new InputStreamReader(s));

r.mark(5000); // more than the number of bytes being read.
// this is the read ahead limit.
printLines(r);

r.reset(); // go back to where mark was called.
printLines(r);
}
}

在调用 .reset() 之前,请尝试确保读取的字节数不会超过在 .mark() 中设置的预读限制。

附注- 并非所有流(或读取器)都支持 .mark(),您可以使用 .markSupported() 检查。

关于Java LineNumberReader 重置为开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39711369/

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