2013-07-23 46 views
0

請參閱我的代碼如下: 我可以在文件的一行中寫入一個鍵和一個字符串。如果密鑰已經存在,我想通過創建一個新文件來覆蓋它,並將其填入我的源文件的內容中。最後,我將刪除舊文件並重命名我的臨時文件。但它不起作用。正如你可以看到我打印布爾值刪除和renameTo方法。兩者都返回爲「假」。Java文件無法刪除或重命名

我在其他一些線程中閱讀過,我必須關閉與我的文件保持聯繫的所有讀者和作者,以便能夠重命名或刪除它。

你看我的錯嗎?

(請注意,一些意見都寫在德國)

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

回答

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

更新

我不確定你的代碼是否合理。基本上,你應該做的是讀取整個源文件並將其寫入臨時位置(因爲您事先並不知道密鑰是否需要更新,並且您可能需要閱讀源文件才能找到出)。

完成此操作後,如果更改了臨時文件,請刪除源文件並將臨時文件重命名爲它的位置。

你的代碼看起來威猛低效的,我...

0

岡井,我想給你的代碼的最新簡報。

我改變了這種方式,現在它正在工作,因爲它應該。

你有更多的事情可以改變來優化代碼嗎?

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