读取和覆盖文本文件中的特定行
Read and overwrite specific lines in a text file
我正在 Java 中编写一个程序来更新文本文档中的数据。更新由按钮 (JButton) 触发。
特别需要区分文档中的3行:
- 第一个描述了一个名为 'total' 的浮点值。
- 第二个描述了一个名为 'fail' 的浮点值。
- 第三个描述了一个名为 'rate' 的双精度值。
在程序执行过程中,我想读取文件的3行并赋值给变量;按下按钮后,相应的变量将不得不覆盖文档中的值。
为了实现这一点,我的推理如下:
我声明了 3 个私有变量(total、fail 和 rate),将它们初始化为零,然后从文件中读取并为它们分配了正确的值。
float total = 0.0f, fail = 0.0f;
double rate = 0d;
try {
total = Float.parseFloat(Files.readAllLines(Paths.get("failRate.txt")).get(0));
fail = Float.parseFloat(Files.readAllLines(Paths.get("failRate.txt")).get(1));
rate = Double.parseDouble(Files.readAllLines(Paths.get("failRate.txt")).get(2));
} catch (Exception e){e.printStackTrace();}
在按钮中,我增加了变量,这里已经出现错误:
Variable 'total' is accessed from within inner class, needs to be final or effectively final
如果我要使变量成为最终变量,我将无法更改它们,所以这不是正确的方法。
我试过制作变量 public 但在这样做时,我注意到变量在内部发生了变化,但没有在文件中更新。
那么我们来到了关键点:
try {
Files.readAllLines(Paths.get("failRate.txt")).set(1, Float.toString(fail));
Files.readAllLines(Paths.get("failRate.txt")).set(2, Double.toString(rate));
} catch (Exception exception){exception.printStackTrace();}
既然变量是私有的,它也报错,但是当它们是public时仍然不起作用。
我也意识到读取整个文件只覆盖某些值是错误的,但目前我不知道任何其他方法。
我做错了什么?
Variable 'total' is accessed from within inner class, needs to be final or effectively final
您需要一个“包装器”。我会将 total
和 fail
的类型更改为 double
并使用数组。
double[] values = new double[3];
button.addActionListener(e -> {
Path path = Paths.get("failRate.txt");
try {
List<String> lines = Files.readAllLines(path);
values[0] = Double.parseDouble(lines.get(0));
values[1] = Double.parseDouble(lines.get(1));
values[2] = Double.parseDouble(lines.get(2));
BufferedWriter bw = Files.newBufferedWriter(path,
StandardOpenOption.CREATE,
StandardOpenOption.TRUNCATE_EXISTING,
StandardOpenOption.WRITE);
for (double d : values) {
bw.write(Double.toString(d));
}
}
catch (IOException xIo) {
xIo.printStackTrace();
}
});
这是允许的,因为 values
没有被更改。它总是引用同一个数组。只是更改了数组内容。
我正在 Java 中编写一个程序来更新文本文档中的数据。更新由按钮 (JButton) 触发。
特别需要区分文档中的3行:
- 第一个描述了一个名为 'total' 的浮点值。
- 第二个描述了一个名为 'fail' 的浮点值。
- 第三个描述了一个名为 'rate' 的双精度值。
在程序执行过程中,我想读取文件的3行并赋值给变量;按下按钮后,相应的变量将不得不覆盖文档中的值。
为了实现这一点,我的推理如下:
我声明了 3 个私有变量(total、fail 和 rate),将它们初始化为零,然后从文件中读取并为它们分配了正确的值。
float total = 0.0f, fail = 0.0f;
double rate = 0d;
try {
total = Float.parseFloat(Files.readAllLines(Paths.get("failRate.txt")).get(0));
fail = Float.parseFloat(Files.readAllLines(Paths.get("failRate.txt")).get(1));
rate = Double.parseDouble(Files.readAllLines(Paths.get("failRate.txt")).get(2));
} catch (Exception e){e.printStackTrace();}
在按钮中,我增加了变量,这里已经出现错误:
Variable 'total' is accessed from within inner class, needs to be final or effectively final
如果我要使变量成为最终变量,我将无法更改它们,所以这不是正确的方法。
我试过制作变量 public 但在这样做时,我注意到变量在内部发生了变化,但没有在文件中更新。
那么我们来到了关键点:
try {
Files.readAllLines(Paths.get("failRate.txt")).set(1, Float.toString(fail));
Files.readAllLines(Paths.get("failRate.txt")).set(2, Double.toString(rate));
} catch (Exception exception){exception.printStackTrace();}
既然变量是私有的,它也报错,但是当它们是public时仍然不起作用。
我也意识到读取整个文件只覆盖某些值是错误的,但目前我不知道任何其他方法。
我做错了什么?
Variable 'total' is accessed from within inner class, needs to be final or effectively final
您需要一个“包装器”。我会将 total
和 fail
的类型更改为 double
并使用数组。
double[] values = new double[3];
button.addActionListener(e -> {
Path path = Paths.get("failRate.txt");
try {
List<String> lines = Files.readAllLines(path);
values[0] = Double.parseDouble(lines.get(0));
values[1] = Double.parseDouble(lines.get(1));
values[2] = Double.parseDouble(lines.get(2));
BufferedWriter bw = Files.newBufferedWriter(path,
StandardOpenOption.CREATE,
StandardOpenOption.TRUNCATE_EXISTING,
StandardOpenOption.WRITE);
for (double d : values) {
bw.write(Double.toString(d));
}
}
catch (IOException xIo) {
xIo.printStackTrace();
}
});
这是允许的,因为 values
没有被更改。它总是引用同一个数组。只是更改了数组内容。