Java 如何将文本动态附加到文本文件中
我想更新Java 如何将文本动态附加到文本文件中,java,file-io,Java,File Io,我想更新key5=val5where[13] [12] key1=val1 key2=val2 key3=val3 key4=val4 key5=val5 [13] key1=val1 key2=val2 key3=val3 key4=val4 key5=xyz [14] key1=val1 key2=val2 key3=val3 key4=val4 key5=val5 这部分看起来不对: try { br = new BufferedReader(new FileRead
key5=val5
where[13]
[12]
key1=val1
key2=val2
key3=val3
key4=val4
key5=val5
[13]
key1=val1
key2=val2
key3=val3
key4=val4
key5=xyz
[14]
key1=val1
key2=val2
key3=val3
key4=val4
key5=val5
这部分看起来不对:
try {
br = new BufferedReader(new FileReader(oldFileName));
bw = new BufferedWriter(new FileWriter(tmpFileName));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
if (line.contains("[13]"))
{
while (line.contains("key5")) {
if (line.contains("key5"))
{
line = line.replace("key5", "key5= Val5");
bw.write(line+"\n");
}
}
}
}
} catch (Exception e) {
return;
} finally {
try {
if(br != null)
br.close();
} catch (IOException e) {
//
}
try {
if(bw != null)
bw.close();
} catch (IOException e) {
//
}
}
我假设NOT运算符在循环条件中丢失您确实需要在头脑中逐步了解您的逻辑;在代码中:
while (line.contains("key5")) {
if (line.contains("key5"))
试着把它写在一张纸或什么东西上,然后跟着写。例如,查看while(line.contains(“key5”)
循环。如果该行包含“[13]”,则它不包含“key5”,并且循环甚至不会运行一次。还有许多其他问题(例如,正如其他人在评论中提到的,您只尝试写回一行,或者您没有在循环中阅读更多行,等等)。对于这些类型的事情,精确地计算出您想要做什么,然后编写匹配的代码。看起来您要执行以下操作:
if (line.contains("[13]"))
{
while (line.contains("key5")) {
//etc....
顺便说一下,也许考虑使用一个INI文件处理库,例如,您可以在其中直接加载文件并替换密钥。参见./P> < P>此代码块是有问题的:
if (line.contains("[13]")) {
while (line.contains("key5")) {
if (line.contains("key5")) {
line = line.replace("key5", "key5= Val5");
bw.write(line+"\n");
}
}
}
因为没有同时包含[13]和键5的行(它们在单独的行上),所以永远不会进入while循环
相反,当遇到第[13]行时,需要记住它并将标志存储在布尔值中,如下所示:
if (line.contains("[13]"))
{
while (line.contains("key5")) {
//etc....
问题是什么?你看到了什么样的输出,它与你期望的有什么不同?我已经更新了我的帖子。顺便说一下,你可能想看看这样的东西,尽管一般来说,先温习一下你的逻辑技能会有帮助(我仍然建议你修改代码,如果只是为了学习经验的话)。您不必将状态存储在标志中,您可以像OP尝试的那样使用嵌套或连续循环来实现。但是,标志将导致更清晰、更灵活的代码。顺便说一句,您需要
.equals(“[13]”)和.startsWith(“key5=”)
(在这两种情况下都不区分大小写和空格,INI解析器实现在这些细节上有所不同)。不,我实际上是指line.startsWith(“[”),以便在遇到[14]等时清除标志。不使用标志的问题是当第[13]行遇到时,它将输入if块,但不会输入while块,因为key5位于单独的行上。当它到达key5时,if块将被跳过,因为该行上不会有[13]。[13]和key5位于两个单独的行上。我不清楚;这不是我指出的行。目前,您的代码将看到例如。“key=[13]”作为本节的开头,而“key1=somekey5”或“key50=which”作为替换行。我的意思是:您的.contains(“[13]”)应该是.equals(“[13]”)而.contains(“key5”)
应该是.startsWith(“key5=”
。您的.startsWith([”)
是正确的。对此表示抱歉。是的,这是公平的。我将进行相应的编辑。感谢Jason C和NickJ,您的评论帮助了我。如果条件相同,那么等待一段时间是没有意义的。此外,如果有一行同时包含[13]和键5(没有),while循环将永远不会退出。我当然同意。我发布的代码是OP代码的一个片段,未经编辑,旨在引起人们对我所说的内容的注意。这不是我自己的更改建议。我误解了,对此表示抱歉。删除了否决票。+1