从 bufferedReader 获取当前行号
Get current line number from bufferedReader
我想阅读不同的文本文件,我正在使用 BufferedReader
来阅读它:
int theMax = 0;
int theTypes = 0;
int []theSlices = {};
/*
INPUT1:
17 4
2 5 6 8
INPUT2:
100 10
4 14 15 18 29 32 36 82 95 95
*/
try {
FileReader reader = new FileReader("INPUT1.in");
BufferedReader bufferedReader = new BufferedReader(reader);
String line;
while ((line = bufferedReader.readLine()) != null) {
String[] numbers = line.split(" ");
System.out.println(numbers[0]);
System.out.println(line);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
;
我的问题是我想设置 theMax
、theTypes
和 theSlices
的值,但为此我需要获取当前行号,但我不知道怎么做。读取文件有效,println(numbers[0]
打印 17 和 2。我有点被困在这里,所以我很高兴得到每一个帮助。
INPUT1 示例:
theMax
= 17
theTypes
= 4
theSlices
= 2 5 6 8
很简单:你自己跟踪。
String line;
int currentLine = 0;
while ((line = bufferedReader.readLine()) != null) {
String[] numbers = line.split(" ");
System.out.println("Linenumber " + currentLine);
System.out.println(numbers[0]);
System.out.println(line);
currentLine ++;
}
reader.close();
不确定我是否完全理解您的需求,但为了跟踪行号,创建一个变量,您可以在 while 循环中递增
即
try {
FileReader reader = new FileReader("INPUT1.in");
BufferedReader bufferedReader = new BufferedReader(reader);
String line;
long currentLineNr = 0;
while ((line = bufferedReader.readLine()) != null) {
currentLineNr++;
String[] numbers = line.split(" ");
System.out.println(numbers[0]);
System.out.println(line);
//Use the currentLineNr how you like
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
首先,据我所知(并且在此处阅读了官方 Java 文档 - https://docs.oracle.com/javase/8/docs/api/java/io/BufferedReader.html),BufferedReader class 本身并没有给你确定当前行的机制(例如 getCurrentLine() 方法)。
但是,绝对没有什么可以阻止您自己通过计数器变量来跟踪当前行号。
因此,您代码的相关部分如下所示:
int currentLine = 0;
while ((line = bufferedReader.readLine()) != null) {
currentLine++;
String[] numbers = line.split(" ");
/* NOTE: this can be numbers.length >= 2 if you don't care to enforce
having exactly 2 numbers as the first line
*/
if(currentLine == 1 && numbers.length == 2) {
theMax = Integer.valueOf(numbers[0]);
theTypes = Integer.valueOf(numbers[1]);
} else {
for(int index = 0; index < numbers.length; index++) {
theSlices[index] = Integer.valueOf(numbers[index]);
}
}
}
// do something with read values
我还想提一下,您的代码可以在某些地方进行改进,例如:
- 您可以将 try 替换为 try-with-resources,这样即使发生异常,您的读者也会 managed/closed 自动。
- 如果您决定不使用 try-with-resources,那么您需要将 reader.close() 方法调用移动到 finally 块中,因为如果确实发生异常,您永远不会关闭您的资源。
- 这两行
FileReader reader = ;
BufferedReader bufferedReader = new BufferedReader(reader);
可以简化为:
BufferedReader bufferedReader = new BufferedReader(new FileReader("INPUT1.in"));
然后如果坚持使用 try 而不是 try-with-resources,则只需要管理 bufferedReader 实例。
希望对您有所帮助。
PS: 不是说我上面的代码片段是完美的,我相信它可以写得更干净
使用java.io.LineNumberReader
.
LineNumberReader
是 BufferedReader
的子类,用于跟踪行号。它提供了一个getLineNumber()
方法来获取当前行号。
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/LineNumberReader.html
示例:
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
public class Example {
public static void main(String[] args) throws IOException {
try (FileReader fr = new FileReader("input.txt");
LineNumberReader r = new LineNumberReader(fr)) {
String next;
while ((next = r.readLine()) != null) {
System.out.println("line number " + r.getLineNumber() + " = " + next);
}
}
}
}
我想阅读不同的文本文件,我正在使用 BufferedReader
来阅读它:
int theMax = 0;
int theTypes = 0;
int []theSlices = {};
/*
INPUT1:
17 4
2 5 6 8
INPUT2:
100 10
4 14 15 18 29 32 36 82 95 95
*/
try {
FileReader reader = new FileReader("INPUT1.in");
BufferedReader bufferedReader = new BufferedReader(reader);
String line;
while ((line = bufferedReader.readLine()) != null) {
String[] numbers = line.split(" ");
System.out.println(numbers[0]);
System.out.println(line);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
;
我的问题是我想设置 theMax
、theTypes
和 theSlices
的值,但为此我需要获取当前行号,但我不知道怎么做。读取文件有效,println(numbers[0]
打印 17 和 2。我有点被困在这里,所以我很高兴得到每一个帮助。
INPUT1 示例:
theMax
= 17
theTypes
= 4
theSlices
= 2 5 6 8
很简单:你自己跟踪。
String line;
int currentLine = 0;
while ((line = bufferedReader.readLine()) != null) {
String[] numbers = line.split(" ");
System.out.println("Linenumber " + currentLine);
System.out.println(numbers[0]);
System.out.println(line);
currentLine ++;
}
reader.close();
不确定我是否完全理解您的需求,但为了跟踪行号,创建一个变量,您可以在 while 循环中递增
即
try {
FileReader reader = new FileReader("INPUT1.in");
BufferedReader bufferedReader = new BufferedReader(reader);
String line;
long currentLineNr = 0;
while ((line = bufferedReader.readLine()) != null) {
currentLineNr++;
String[] numbers = line.split(" ");
System.out.println(numbers[0]);
System.out.println(line);
//Use the currentLineNr how you like
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
首先,据我所知(并且在此处阅读了官方 Java 文档 - https://docs.oracle.com/javase/8/docs/api/java/io/BufferedReader.html),BufferedReader class 本身并没有给你确定当前行的机制(例如 getCurrentLine() 方法)。
但是,绝对没有什么可以阻止您自己通过计数器变量来跟踪当前行号。
因此,您代码的相关部分如下所示:
int currentLine = 0;
while ((line = bufferedReader.readLine()) != null) {
currentLine++;
String[] numbers = line.split(" ");
/* NOTE: this can be numbers.length >= 2 if you don't care to enforce
having exactly 2 numbers as the first line
*/
if(currentLine == 1 && numbers.length == 2) {
theMax = Integer.valueOf(numbers[0]);
theTypes = Integer.valueOf(numbers[1]);
} else {
for(int index = 0; index < numbers.length; index++) {
theSlices[index] = Integer.valueOf(numbers[index]);
}
}
}
// do something with read values
我还想提一下,您的代码可以在某些地方进行改进,例如:
- 您可以将 try 替换为 try-with-resources,这样即使发生异常,您的读者也会 managed/closed 自动。
- 如果您决定不使用 try-with-resources,那么您需要将 reader.close() 方法调用移动到 finally 块中,因为如果确实发生异常,您永远不会关闭您的资源。
- 这两行
FileReader reader = ;
BufferedReader bufferedReader = new BufferedReader(reader);
可以简化为:
BufferedReader bufferedReader = new BufferedReader(new FileReader("INPUT1.in"));
然后如果坚持使用 try 而不是 try-with-resources,则只需要管理 bufferedReader 实例。
希望对您有所帮助。
PS: 不是说我上面的代码片段是完美的,我相信它可以写得更干净
使用java.io.LineNumberReader
.
LineNumberReader
是 BufferedReader
的子类,用于跟踪行号。它提供了一个getLineNumber()
方法来获取当前行号。
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/io/LineNumberReader.html
示例:
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
public class Example {
public static void main(String[] args) throws IOException {
try (FileReader fr = new FileReader("input.txt");
LineNumberReader r = new LineNumberReader(fr)) {
String next;
while ((next = r.readLine()) != null) {
System.out.println("line number " + r.getLineNumber() + " = " + next);
}
}
}
}