2017-09-29 120 views
0

事情是這樣的,我創建一個文件,XML資源在創建後使用。程序執行完畢後,該文件應該被刪除。這是發生了什麼:Java程序在寫入後不能使用文件寫入

我運行的程序,文件不存在... 文件應該使用FileWriter的創建:

File file = new File("src/main/resources/org/avalin/optaplanner/solver/employeeShiftsScoreRules.drl"); 
try (FileWriter fileWriter = new FileWriter(file)) 
{ 
    fileWriter.write("Content..."); 
    fileWriter.flush(); 
    fileWriter.close(); 
} 
catch(IOException e) 
{ 
     e.printStackTrace(); 
} 

然後,我有這樣的代碼:

private static synchronized Solver buildSolver() 
{ 
    SolverFactory solverFactory = 
    SolverFactory.createFromXmlResource(SOLVER_CONFIG_XML); 
    return solverFactory.buildSolver(); 
} 

文件寫入也包含在一個同步方法中,但我認爲,因爲它們不直接訪問同一個變量,所以它們沒有任何影響。該文件正在從上面看到的SOLVER_CONFIG_XML中讀取。

當程序結束時,它會刪除指定路徑上的文件,以便下次運行時根據提供給程序的參數創建該文件。


現在,這是發生了什麼...... 我第一次運行該程序,我得到一個錯誤,說文件不被寫入。

異常在線程 「主」 java.lang.IllegalArgumentException異常:該scoreDrl(ORG/avalin/optaplanner /求解器/ employeeShiftsScoreRules.drl)不存在在類加載器

我一個classpath資源可以在文件寫入之後立即打印,這就結束了HAS第一次運行的方法,但由於某種原因,在程序第一次執行前,該文件不是「創建」的...

The第二次,程序運行良好,因爲該文件是在它發生異常之前創建的?

在我的程序的下一部分執行之前,有沒有辦法確保文件「完全寫入」?每次文件的長度都不相同,因爲它是根據用戶輸入的內容動態創建的,所以我無法檢查。我會認爲它會被完全寫入,因爲它執行我在fileWriter.close()後創建的打印,但顯然不是這樣。

+0

看起來類加載器在啓動時緩存可用文件。您需要使該緩存無效,或者可能使用自定義類加載器。 – daniu

回答

1

它看起來像你寫你的文件到src /主/資源文件夾,這是資源來源標準的位置 - 那就是,在構建系統的讀取文件,而不是在您正在運行的程序呢。

儘管可以將源文件夾添加到正在運行的問題的類路徑中,但這是不好的做法 - 嘗試找出構建系統將其輸出寫入到的位置(可能是單獨的文件夾,用於類文件和複製的資源)並寫入你的文件在那裏。

+0

你會建議我把它寫到java文件夾,然後將它複製到資源然後呢?這會有所作爲嗎? – Avalin

+0

你*可以*做到這一點(但將其移動到資源文件夾而不是在那裏複製),但這仍然是源文件夾的不當使用 - 在某些情況下,如果這些文件夾受到保護,這可能會成爲問題。如何將輸出文件夾作爲系統屬性/環境變量傳遞,以便您可以從外部控制它? – Kunda