当前位置: 首页 > 知识库问答 >
问题:

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

娄德运
2023-03-14

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

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

  • 第一个描述了一个名为“total”的浮点值
  • 第二个描述了一个名为“fail”的浮点值
  • 第三个描述了一个称为“rate”的双值

在程序执行期间,我希望读取文档的3行并将其分配给变量;按下按钮后,相应的变量必须覆盖文档中的值。

为了实现这一点,我的理由如下:

我声明了3个私有变量(总数、失败和速率),将它们初始化为零,然后从文件中读取我分配给它们的正确值。

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();}

在按钮中,我增加了变量,一个错误已经出现在这里:

变量“total”是从内部类访问的,需要是final或有效final

如果我将变量设置为最终变量,我无法更改它们,因此这不是正确的方法。

我尝试过将变量公开,但在这样做时,我注意到变量在内部发生了变化,但在文件中没有更新。

因此,我们来到了关键点:

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();}

既然变量是私有的,它也会给出一个错误,但是当它们是公共的时候,它仍然不起作用。

我还意识到,读取整个文件以仅覆盖某些值是错误的,但目前我不知道其他方法。

我做错了什么?

共有1个答案

袁康裕
2023-03-14

变量“total”是从内部类访问的,需要是final或有效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();
            }
});

这是允许的,因为没有更改值。它总是引用相同的数组。更改的只是数组内容。

 类似资料:
  • 问题内容: 目前,我正在使用此: 但是问题在于旧文件大于新文件。因此,我最终得到了一个新文件,该文件的末尾有旧文件的一部分。 问题答案: 如果您不想关闭并重新打开文件,为避免出现竞争情况,可以这样做: 该功能将很可能也更清洁和更安全的使用作为一个上下文管理器,这将关闭该文件处理程序,即使出现错误!

  • 我仍然是python的新手,我已经尝试过这种方式覆盖txt文件上的一行 ''' 答案 =输入(“俄/秒/升/米:”) ''' 它会替换txt文件上的所有文本行,无论我想做什么,当我选择R时,它会写入txt文件的第一行,当我选择S时,它会写入txt文件的第三行 我现在已经尝试过了 ''' ''' 有人能告诉我正确的方向吗

  • 问题内容: 有什么方法可以从文本文件中读取特定行?在API或Apache Commons中。就像是 : 我同意实现起来很简单,但是特别是当文件很大时,效率不是很高。 问题答案: 可以,但是仍然存在效率问题。 或者,您可以使用: 由于有缓冲,这将稍微更有效。 看一下并尝试跳过整行(使用正则表达式)。我无法确定它是否会更有效- 对其进行基准测试。 PS 代表 效率, 我的意思是 记忆效率

  • 问题内容: 我有一个文本文件,其中包含一个由数字组成的表格,例如: 5 10 6 6 20 1 7 30 4 8 40 3 9 23 1 4 13 6 例如,如果我想要仅包含在第二列中的数字,我该如何将该列提取到列表中? 问题答案: 您可以使用列表理解来做同样的事情 Docs 返回字符串的单词列表。如果不存在可选的第二个参数sep或“无”,则单词将由任意的空白字符字符串(空格,制表符,换行符,返回

  • 问题内容: 我正在尝试从文本文件中删除一行文本,而不将其复制到临时文件中。我正在尝试通过使用Printwriter和Scanner并让它们同时遍历文件来实现此目的,writer写Scanner读取的内容并用相同的东西覆盖每一行,直到到达我希望的行为止删除。然后,我前进扫描仪而不是写程序,然后像以前一样继续。这是代码: 但首先要使用参数:我的文件名是数字,因此它将显示为1.txt或2.txt等,因此

  • 问题内容: 我不是在谈论特定的行号,因为我正在读取具有相同格式但长度不同的多个文件。 说我有这个文本文件: 我希望你知道我的意思。我正在考虑遍历文件,然后使用正则表达式搜索以找到“开始”和“结束”的行号,然后使用线缓存从开始行读取到结束行。但是如何获得行号?我可以使用什么功能? 问题答案: 如果您只想要和之间的文本块,则可以执行以下操作: 实际上,您不需要操纵行号即可读取开始和结束标记之间的数据。