我正在使用Java中的BufferedReader,并且希望在读取整数时获得一些指导。
总而言之,输入文件的每一行将代表无向图中的一条边。它包含两个整数,即边缘的端点,后跟一个实数,即边缘的权重。最后一行将包含-1,以表示输入的结尾。
我创建了一个BufferedReader对象,并初始化了一个整数变量和
文件格式如下:
0 1 5.0
1 2 5.0
2 3 5.0
...
5 10 6.0
5 11 4.0
17 11 4.0
-1
public static void processFile(String inputFilePath) throws IOException {
//Check to see if file input is valid
if (inputFilePath == null || inputFilePath.trim().length() == 0) {
throw new IllegalArgumentException("Error reading file.");
}
//Initialize required variables for processing the file
int num = 0;
int count = 0;
try {
//We are reading from the file, so we can use FileReader and InputStreamReader.
BufferedReader fileReader = new BufferedReader(new FileReader(inputFilePath));
//Read numbers from the line
while ((num = fileReader.read()) != -1) { //Stop reading file when -1 is reached
//First input is the start
//Second input is the end
//Third input is the weight
}
} catch (IOException e) {
throw new IOException("Error processing the file.");
}
}
这是我到目前为止尝试过的,但是我想知道如何获取每一行代码,并让第一个数字为“ start”变量,第二个数字为“ end”变量,第三个数字是“重量”变量?我在网上看到一些创建数组的解决方案,但是由于文件格式的原因,我有些困惑。我可以帮助澄清有关的任何信息
答案 0 :(得分:1)
切换到readLine并使用扫描仪:
public static void processFile(String inputFilePath) throws IOException {
// Check to see if file input is valid
if (inputFilePath == null || inputFilePath.trim()
.length() == 0) {
throw new IllegalArgumentException("Error reading file.");
}
// Initialize required variables for processing the file
String line;
int count = 0;
// We are reading from the file, so we can use FileReader and InputStreamReader.
try (BufferedReader fileReader = new BufferedReader(new FileReader(inputFilePath))) {
// Read numbers from the line
while ((line = fileReader.readLine()) != null) { // Stop reading file when -1 is reached
Scanner scanner = new Scanner(line);
// First input is the start
int start = scanner.nextInt();
if (start == -1) {
break;
}
// Second input is the end
int end = scanner.nextInt();
// Third input is the weight
double weight = scanner.nextDouble();
// do stuff
}
} catch (IOException e) {
throw new IOException("Error processing the file.");
}
}
答案 1 :(得分:1)
我首先要检查我是否可以读取文件(您可以使用File.canRead()
来执行此操作)。接下来,我将通过三个分组操作来编译一个正则表达式。然后,我将使用BufferedReader.readLine()
来阅读文本行; read()
调用返回一个字符。然后只剩下解析匹配的行。而且我认为吞下原始异常只是为了重新抛出异常没有任何目的(实际上,您丢失了当前方式的所有堆栈跟踪信息)。放在一起,
public static void processFile(String inputFilePath) throws IOException {
File f = new File(inputFilePath);
if (!f.canRead()) {
throw new IllegalArgumentException("Error reading file.");
}
// Initialize required variables for processing the file
try (BufferedReader fileReader = new BufferedReader(new FileReader(inputFilePath))) {
Pattern p = Pattern.compile("^\\s*(\\d+)\\s+(\\d+)\\s+(\\d.+)$");
String line;
while ((line = fileReader.readLine()) != null) {
Matcher m = p.matcher(line);
if (m.matches()) {
int start = Integer.parseInt(m.group(1));
int end = Integer.parseInt(m.group(2));
double weight = Double.parseDouble(m.group(3));
System.out.printf("start=%d, end=%d, weight=%.2f%n", start, end, weight);
}
}
}
}
答案 2 :(得分:0)
除了使用read
之外,您还可以只使用readLine
然后使用split,而分隔符为三个空格?
try (BufferedReader fileReader = new BufferedReader(new FileReader(inputFilePath))) {
String line;
while(!(line = fileReader.readLine()).equals("-1")) {
String[] edge = line.split(" ");
int start = Integer.parseInt(edge[0]);
int end = Integer.parseInt(edge[1]);
double weight = Double.parseDouble(edge[2]);
}
} catch (IOException e) {
e.printStackTrace();
}