我正在Java写一个程序来更新文本文档上的数据。更新由按钮(JButton)触发。
特别是,我需要区分文档中的3行:
在程序执行期间,我希望读取文档的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();}
既然变量是私有的,它也会给出一个错误,但是当它们是公共的时候,它仍然不起作用。
我还意识到,读取整个文件以仅覆盖某些值是错误的,但目前我不知道其他方法。
我做错了什么?
变量“total”是从内部类访问的,需要是final或有效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();
}
});
这是允许的,因为没有更改值。它总是引用相同的数组。更改的只是数组内容。
问题内容: 目前,我正在使用此: 但是问题在于旧文件大于新文件。因此,我最终得到了一个新文件,该文件的末尾有旧文件的一部分。 问题答案: 如果您不想关闭并重新打开文件,为避免出现竞争情况,可以这样做: 该功能将很可能也更清洁和更安全的使用作为一个上下文管理器,这将关闭该文件处理程序,即使出现错误!
我仍然是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等,因此
问题内容: 我不是在谈论特定的行号,因为我正在读取具有相同格式但长度不同的多个文件。 说我有这个文本文件: 我希望你知道我的意思。我正在考虑遍历文件,然后使用正则表达式搜索以找到“开始”和“结束”的行号,然后使用线缓存从开始行读取到结束行。但是如何获得行号?我可以使用什么功能? 问题答案: 如果您只想要和之间的文本块,则可以执行以下操作: 实际上,您不需要操纵行号即可读取开始和结束标记之间的数据。