使用 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()
你会在跳转后得到下一行。然后按照上面的方法转换数字。
我在 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()
你会在跳转后得到下一行。然后按照上面的方法转换数字。