使用 Scanner 从文本文件中读取特定行

Reading a certain line from a text file using Scanner

我在 Java 中一个一个地读取文本文件中的值,没有任何问题。该文件具有如下所示的整数值:

2 3
5 6 7 8 9
12 13 15 18 21 26 55
16 24 45 58 97

我只需要读取单行值而不是读取所有值,How to get line number using scanner 上有一个示例,但我正在寻找不使用 LineNumberReader 并通过循环使用计数器的解决方案所有线路。相反,最好通过我已经用来读取值的扫描仪方法获取行号。可能吗?

这是我尝试创建的方法:

public static List<Integer> getInput(int lineIndex) throws FileNotFoundException{   
    List list = new ArrayList<Integer>();
    Scanner scan = new Scanner(new File(INPUT_FILE_NAME));
    int lineNum=0;
    //s = new Scanner(new BufferedReader(new FileReader("input.txt")));

    while(scan.hasNextLine()) {         
        if(lineNum == lineIndex) {
               list.add(scan.nextInt()); //but in this case I also loop all values in this line
        }
        lineNum++;      
    }
    scan.close();
    return list;
}

在读取所需行的数字时不要迭代,也许你可以用scanner.nextLine()读取行,然后你可以使用split("\s")将整数的起始值放入数组中,然后你可以简单地将它们添加到你的列表中:

public static void main(String[] args) throws FileNotFoundException {
    Scanner scan = new Scanner(new File("input.txt"));
    List<Integer> list = new ArrayList<>();
    int lineNum = 0;
    int lineIndex = 2;

    while(scan.hasNextLine()) {
        if(lineNum == lineIndex) {
            String[] nums = scan.nextLine().split("\s");
            for (String s : nums){
                list.add(Integer.parseInt(s));
            }
            break;
        }
        lineNum++;
        scan.nextLine();
    }

    System.out.println(list); // [12, 13, 15, 18, 21, 26, 55]
}

如果您有一个小文件,可以将整个内容加载到内存中:

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;

....

public static List<Integer> getInput(int lineIndex) {
    List<Integer> list = new ArrayList<>();
    try {
        String line = Files.readAllLines(Paths.get("path to your file")).get(lineIndex);
        list = Pattern.compile("\s+")
                .splitAsStream(line)
                .map(Integer::parseInt)
                .collect(Collectors.toList());
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    return list;
}

方法Files.readAllLines returns 文件所有行的列表作为字符串,其中每个字符串对应一行。使用 get(lineIndex) 你会得到所需的第 n 行,只需要将字符串解析为整数。

第二种方法:

如果您有一个大文件,请使用流的惰性评估:

public static List<Integer> getInputLargeFile(int lineIndex) {
    List<Integer> list = new ArrayList<>();
    try (Stream<String> lines = Files.lines(Paths.get("path to your file"))) {
        String line = lines.skip(lineIndex).findFirst().get();
        list = Pattern.compile("\s+")
                .splitAsStream(line)
                .map(Integer::parseInt)
                .collect(Collectors.toList());
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    return list;
}

通过这种方法,您可以使用 lines.skip 方法从文件开头跳转 n 行。使用 findFirst().get() 你会在跳转后得到下一行。然后按照上面的方法转换数字。