【问题标题】:Having problems with resetting Buffered Reader重置缓冲阅读器时遇到问题
【发布时间】:2020-09-07 04:14:48
【问题描述】:

这是我的代码:

int lines = 0;
  br.mark(0);
  while (br.readLine() != null) lines++;
  System.out.print(lines);
  br.reset();

我试图找出输入文件中的行数,然后将其重置回顶部,这样我以后就不会在代码中遇到错误。我认为可以使用标记和重置方法。另外,我的文件相对较小,从其他答案中我了解到,如果文件太大,可能会出现问题。我对这些的使用不正确吗?这是我得到的错误:

Exception in thread "main" java.io.IOException: Mark invalid
    at java.io.BufferedReader.reset(BufferedReader.java:512)
    at Main.main(Main.java:12)

【问题讨论】:

  • 认为您对mark(0) 的使用是问题所在——请查看the documentation。换句话说,如果我正确理解了文档,那么只要您阅读 anything 标记就会失效,因为您将 0 作为参数传递。
  • 哦,那我如何确定它可以读取的字符数同时仍然保留标记?
  • 我想您可以尝试Integer.MAX_VALUE 并忘记它,但取决于该功能的实现方式,这可能会导致问题。但无论如何,你为什么要使用这样的BufferedReader?似乎您正在尝试计算行数,倒带,然后处理文本。如果这是正确的,那么考虑将所有文本读入List<String>,其中每个元素都是一行(让您查询size() 的行数)并丢弃BufferedReader。无论如何,这两种方法都会导致整个文本被读入内存。

标签: java file io bufferedreader ioexception


【解决方案1】:

试试这个:

   String fileName="put file path here";
   int lines= (int) Files.lines(Paths.get(fileName)).count();

        try (BufferedReader br = Files.newBufferedReader(Paths.get(fileName))) {

            //br returns as stream and convert it into a List
            lines = (int) br.lines().count()

        } catch (IOException e) {
            e.printStackTrace();
        }
        SpringApplication.run(QuicksilverApplication.class, args);
    }

【讨论】:

  • 我是 java 新手,当我尝试使用您的第一种方法时,我收到一条错误消息,提示找不到变量路径和文件的符号。我应该用一些东西替换它还是导入一些东西?
  • 是的,您需要使用文件路径设置 fileName 变量
  • 我当前工作目录中文件的路径是什么?
  • 试试这样的./filename 或者你可以使用完整路径?你能分享一下你的项目是如何构建的吗?你是怎么运行的?
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多