2017-03-06 80 views
1

我的應用程序拋出異常 - java.io.FileNotFoundException:無效的文件路徑。不知道爲什麼。我已閱讀關於主題的問題和答案,但沒有人能幫助我。無效的文件路徑異常

下面是代碼:

String userhome = System.getProperty("user.home"); 
    String filename = null; 
    File rdp = null; 
    for (int item = 0; item < darab; item++) { 
     filename = toValidFileName(ProgramList.get(item).getP_name()); 
     filename += ".rdp"; 
     rdp = new File(userhome, filename); 
     try { 
      JFrame panel; 
      panel = new JFrame(); 
      panel.setSize(400, 10); 
      panel.setLocation(300, 400); 
      panel.setTitle("Saving " + rdp.getAbsolutePath()); 

      try (FileOutputStream fstr = new FileOutputStream(rdp)) { 
       panel.setVisible(true); 
       char c; 
       for (int j = 0; j < 2336; j++) { 
        c = ProgramList.get(item).p_body.charAt(j); 
        fstr.write(c); 
       } 
       fstr.flush(); 
       fstr.close(); 
       panel.setVisible(false); 
      } 

     } catch (IOException ioe) { 
      JOptionPane.showMessageDialog(this, 
        ioe.getMessage(), "Save rdp file", JOptionPane.ERROR_MESSAGE); 
      System.err.println(ioe.getMessage() + " : "+ rdp.getAbsoluteFile()); 
     } 
    } 

而結果: 無效的文件路徑:C:\用戶\梨皮\ CosmicLd.rdp

toValidFilename()從取出禁止字符( KORG RADIAS)程序名稱來創建一個有效的文件名。

我還沒有發現我的錯:( 目標目錄不是隻讀,用戶有必要privilegs當我查看file.canWrite()的行之後: RDP =新的文件(USERHOME,文件名); 它總是假 我做了什麼錯 感謝

+0

如果我選擇了一個由filechooser寫入的文件,那就行了。 –

+1

你會發布堆棧跟蹤和toValidFileName代碼嗎? – efekctive

+0

請使用文件選擇器選擇相同的文件並打印文件名。將名稱與失敗的名稱進行比較。留意空白。 – Arkadiy

回答

0

嘗試使用FileWriter的,而不是你的嘗試看起來就像這樣:

try { 
    File dir = new File("C:/Users//" + userhome + "/Documents"); //customize this however 
    FileWriter fstr = new FileWriter(new File(dir, rdp)); 
      for (int j = 0; j < 2336; j++) { 
       c = ProgramList.get(item).p_body.charAt(j); 
       fstr.write(c); 
         } 
      fw.close(); 
     } 

另外,儘量堅持到Java變量的命名。?!慣例。userhome應該是userHome等ST了次要的東西:)

+0

爲什麼你認爲這會有助於這種情況? – matt

+0

Filewriter向我證明了自己的邏輯和直接。我希望簡化的輸入能夠解決問題,因爲我最好的選擇是他們的代碼不會產生/讀取正確的路徑。 – Jerevand

0

在該行中產生的問題:

filename = toValidFileName(ProgramList.get(item).getP_name()); 

與getP_name()的結果,becouse它也有(炭)0字...

代碼被重寫 - >(char)0字符在對象中被改變爲(char)20個字符並且以這種方式一切正在工作。

的toValidFileName代碼反正這:

public static String toValidFileName(String input) { 
    return input.replaceAll("[:\\\\/*\"?|<>']", "_"); 
} 

謝謝大家的幫助!有一些有用的建議,尤其是Arkady和VGR的建議!