【问题标题】:How to get the number of lines from a text file in java?如何从java中的文本文件中获取行数?
【发布时间】:2016-12-28 16:38:49
【问题描述】:

我是 Java 新手。我想查找测试文件中的行数,以便可以将其用于数组大小。 我最初的想法是创建一个循环并更新一个 int 变量。像这样:

Scanner file  = new Scanner(new File("data.text"));
int n = 0;
while(file.hasNextLine()) {
    file.nextLine();
    n++;
 }
int[] array = new int[n];

这对我不起作用,因为扫描仪文件位于文本文件的末尾。 除非我关闭原始文件并创建一个新的扫描仪对象,否则我将无法读取文本文件。有没有更好的方法来执行此操作?

【问题讨论】:

  • 使用 List<String> 而不是数组。或者从一个固定的数组大小开始,并在需要时“调整”数组的大小(创建一个大小为两倍的数组,将旧内容复制到新数组)。这些是我脑海中浮现的想法。不可能“倒带”Scanner
  • 您不想读取文件两次,所以不要使用数组,而且您几乎肯定不想一开始就将整个文件读入内存。实际上,任何文本文件都可以一次处理一行,或者一次处理一个字符。

标签: java arrays file java.util.scanner


【解决方案1】:

如果你使用的是1.7+,你可以像这样直接存储到数组中。

import java.io.File;

import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;

import java.util.List;

// more code

Path filePath = new File("fileName").toPath();
Charset charset = Charset.defaultCharset();        
List<String> stringList = Files.readAllLines(filePath, charset);
String[] stringArray = stringList.toArray(new String[]{});

【讨论】:

    【解决方案2】:

    根据您具体需要做什么,您可能希望将整个文件保存在内存中。

    List<String> lines = Files.readAllLines(Paths.get("data.text"));
    // Here you can easily obtain the list size
    lines.size()
    

    如果你不需要实际的行或者不是所有行,你可以这样做

    long lineCount = Files.lines(Paths.get("data.text")).count();
    

    由于它是 Java 8 Stream,因此您可以对这些行进行过滤、解析或做任何您想做的事情。

    【讨论】:

      【解决方案3】:

      您可以使用BufferedReaderFileReader

      FileReader in = new FileReader("data.txt");
      BufferedReader br = new BufferedReader(in);// use this only if you have large files, meaning that each line is very long.
      int n = 0;
      while (br.readLine() != null) {
          n++;
      
      }
      System.out.println(n);
      in.close();
      int[] array = new int[n];
      

      此外,您可以使用 ArrayList 代替数组,但这取决于您希望如何使用行数。

      如果您的文件不是很大,您可以这样做:

      FileReader in = new FileReader("data.txt");
      int n = 0;
      while ((in.readLine() != null)) {
          n++;
      
      }
      System.out.println(n);
      in.close();
      int[] array = new int[n];
      

      【讨论】:

      • 您对BufferedReader 的建议让我想知道您是否理解 OP 的意图,即不阅读整个文件只是为了获取行数。
      • @Tom 我没想到。但如果文件有非常 长的行,那么您需要BufferedReader。尽管如此,我还是相应地更新了我的答案。
      • 不管你使用BufferedReaderFileReader还是Scanner,整个思路都是读取完整文件获取数组的行数,然后再读取文件后面就是废话了。这就是为什么 OP 要求一种更好的方法,而 Collections 就是其中之一。
      • @Tom 哦。我的错。我误解了这个问题:P
      • 无论如何我都会等待答案。为了正确回答这个问题,应该知道 OP 的目标是什么。为什么他需要一个数组以及他试图对文件及其内容做什么。所以 OP 应该先回答这个问题,然后可以写一些方法来实现他的目标。
      【解决方案4】:

      好的。这是您问题的简单答案。 您想使用相同的 Scanner 对象从头开始再次读取文件而不关闭它。
      这是不可能的。


      原因:它支持的各种输入类型。这些不存储传递后的结果,所以不支持重置。
      所以优雅的解决方案是创建一个新的 Scanner Object。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-15
        • 1970-01-01
        • 1970-01-01
        • 2017-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多