Java LineNumberReader 重置为开头

标签 java inputstream reset

我想阅读 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/

相关文章:

java - 自定义 Spring Roo 生成的 GWT 用户界面

java - 运行appium时启动chrome的问题

java - findfragmentbyid 在 vi​​ewpager 下托管 3 个 fragment 的 mainActivity 中返回 null

android - 如何将两个 mp3 文件合并为一个(合并/加入)

javascript - 如何创建通用的 jquery 验证和重置函数调用

java - 可以循环扫描仪输入吗?

java - 原始文件的 FileInputStream

java - 杰西 : Command Output unavailable

php - 使用 Web 表单 (PHP) 重置 Linux 密码

CakePHP:保存后更新 session 变量