请参阅下面的代码: 我可以在文件的一行中写一个键和一个字符串。如果密钥已经存在,我想通过创建一个新文件覆盖它,并用我的源文件的内容填充它。最后,我将删除旧文件并重命名我的临时文件。但它不起作用。正如您所看到的,我打印了用于删除和布局方法的布尔值。两者都返回为“false”。
我在其他一些主题中读到,我必须关闭所有与我的文件联系的读者和作者,以便能够重命名或删除它。
你看我的错?
(请注意,有些评论是用德语写的)
public static boolean dini_Set(String filepath, String key, String value) throws IOException
{
if(key.length() <= 0 || value.length() <= 0) return false;
String pfilepath = rootdirectory.concat(filepath);
File pfile = new File(pfilepath);
//dini_Remove(filepath.concat(".part"));
if(dini_Exists(filepath) == false) return false;
// Checkt ob der Key schon existiert
FileReader fr = new FileReader(pfilepath);
BufferedReader br = new BufferedReader(fr);
String ausw;
boolean foundkeybool = false;
while((ausw = br.readLine()) != null)
{
String foundkey = ausw.substring(0,ausw.indexOf("="));
//System.out.println(foundkey);
if(foundkey.equals(key))
{
foundkeybool = true;
System.out.println(foundkeybool);
// Key exists and content has to be overwritten
String newline = key.concat("=").concat(value);
String tmpdir = rootdirectory.concat("tmp.tmp");
File tmp = new File(tmpdir);
tmp.createNewFile();
String currentLine;
FileWriter fw = new FileWriter(tmpdir);
BufferedWriter bw = new BufferedWriter(fw);
br.close();
fr.close();
fr = new FileReader(pfilepath);
br = new BufferedReader(fr);
while((currentLine = br.readLine()) != null)
{
// trim newline when comparing with lineToRemove
String trimmedLine = currentLine.trim();
System.out.println(trimmedLine);
if(trimmedLine.equals(ausw))
{
System.out.println("Austauschen: "+newline);
bw.write(newline);
}
else
{
bw.write(currentLine);
System.out.println("Lassen: "+currentLine);
}
bw.newLine();
}
br.close();
fr.close();
bw.close();
fw.close();
tmp.setWritable(true);
pfile.setWritable(true);
// boolean removed = dini_Remove(filepath);
boolean removed = pfile.delete();
System.out.println("Datei wurde gelöscht: "+removed);
boolean renamed = tmp.renameTo(pfile);
System.out.println("Datei umbenannt: "+renamed);
break;
}
}
// if key does now exists we can create a new one
if(foundkeybool == false)
{
FileWriter fw = new FileWriter(pfilepath,true);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(key.concat("=").concat(value));
bw.newLine();
bw.close();
}
return true;
}
答案 0 :(得分:1)
这可能无法解决您的问题,但会让您更接近。
您必须确保您打开的所有资源都已正确关闭。目前在您的代码中,如果由于某种原因抛出异常,则不会关闭任何资源。
即使您对处理方法中的异常不感兴趣,仍应将文件访问代码包装在try-finally
块中
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader(pfilepath);
br = new BufferedReader(fr);
//...//
} finally {
try {
br.close();
} catch (Exception exp) {
}
try {
fr.close();
} catch (Exception exp) {
}
}
你可能会发现你只需要关闭BufferedReader
并且应该在它的孩子close
上调用Reader
,但我对确保一切都很干净感到妄想
如果您使用的是Java 7,您可能希望查看The try-with-resources Statement
<强>更新强>
我不确定你的代码是否合理。基本上,您应该做的是读取整个源文件并将其写入临时位置(如果密钥需要更新,您事先不知道,并且您可能需要先阅读源文件才能找到出)。
完成此操作后,如果您对临时文件进行了更改,请删除源文件并将临时文件重命名为该文件。
你的代码对我来说似乎效率低下......
答案 1 :(得分:0)
Okai,我想向您简要介绍一下代码。
我改变了这种方式,现在它正常运作。
为了优化代码,您还可以更改一些内容吗?
public static boolean dini_Set(String filepath, String key, String value) throws IOException
{
if(key.length() <= 0 || value.length() <= 0) return false;
String pfilepath = rootdirectory.concat(filepath);
File pfile = new File(pfilepath);
//dini_Remove(filepath.concat(".part"));
if(dini_Exists(filepath) == false) return false;
// Checkt ob der Key schon existiert
boolean foundkeybool = false;
File tmp = null;
try(BufferedReader br = new BufferedReader(new FileReader(pfilepath)))
{
String ausw;
while((ausw = br.readLine()) != null)
{
String foundkey = ausw.substring(0,ausw.indexOf("="));
System.out.println(foundkey);
if(foundkey.equals(key))
{
foundkeybool = true;
System.out.println(foundkeybool);
//Key exists and content has to be overwritten
String newline = key.concat("=").concat(value);
String tmpdir = rootdirectory.concat("tmp.tmp");
tmp = new File(tmpdir);
tmp.createNewFile();
String currentLine;
try(BufferedWriter bw = new BufferedWriter(new FileWriter(tmpdir)))
{
try(BufferedReader br2 = new BufferedReader(new FileReader(pfilepath)))
{
while((currentLine = br2.readLine()) != null)
{
//trim newline when comparing with lineToRemove
String trimmedLine = currentLine.trim();
System.out.println(trimmedLine);
if(trimmedLine.equals(ausw))
{
System.out.println("Austauschen: "+newline);
bw.write(newline);
}
else
{
bw.write(currentLine);
System.out.println("Lassen: "+currentLine);
}
bw.newLine();
}
}
}
break;
}
}
}
if(foundkeybool == true)
{
tmp.setWritable(true);
pfile.setWritable(true);
//boolean removed = dini_Remove(filepath);
boolean removed = pfile.delete();
System.out.println("Datei wurde gelöscht: "+removed);
boolean renamed = tmp.renameTo(pfile);
System.out.println("Datei umbenannt: "+renamed);
}
else //(foundkeybool == false) if key does now exists we can create a new one
{
try(BufferedWriter bw = new BufferedWriter(new FileWriter(pfilepath,true)))
{
bw.write(key.concat("=").concat(value));
bw.newLine();
bw.close();
}
}
return true;
}