读取和覆盖文本文件中的特定行

Read and overwrite specific lines in a text file

我正在 Java 中编写一个程序来更新文本文档中的数据。更新由按钮 (JButton) 触发。

特别需要区分文档中的3行:

在程序执行过程中,我想读取文件的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

您需要一个“包装器”。我会将 totalfail 的类型更改为 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 没有被更改。它总是引用同一个数组。只是更改了数组内容。