2013-07-23 3 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

(일부 의견이 독일어로 작성되어 있습니다).

열려있는 모든 리소스가 올바르게 닫혀 있는지 확인해야합니다. 현재 코드에서 예외가 발생하면 어떤 리소스도 종료되지 않습니다. 당신이 방법 내에서 예외 처리에 관심이 아니더라도

, 당신은 여전히 ​​당신은 단지 BufferedReader을 닫아야합니다 것을 알 수 있습니다

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) { 
    } 
} 

try-finally 블록 내에서 파일 액세스 코드를 포장한다 그리고 그것에 close 아이 Reader의 호출되어야하지만 나는 모든 것이 깨끗 보장에 대한 편집증 해요

당신이 자바 7을 사용하는 경우, 당신은 The try-with-resources Statement

을 살펴하실 수 있습니다

코드가 맞는지 잘 모르겠습니다. 기본적으로, 당신이해야 할 일은 전체 소스 파일을 읽고 임시 위치를 쓰는 것입니다 (키를 업데이트해야하는지 미리 알지 못하기 때문에 어쨌든 소스 파일을 읽어야합니다. 아웃).

이 작업이 완료되면 임시 파일을 변경 한 경우 원본 파일을 삭제하고 임시 파일의 이름을 해당 위치로 바꿉니다.

당신의 코드가 OKAI ...

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; 
} 
관련 문제