Java程序在写完后不能使用文件写入

时间:2017-09-29 12:05:31

标签: java file synchronization writing

事情就是这样,我正在创建一个XML资源使用的文件。程序执行完毕后,应删除该文件。这就是:

我运行程序,文件尚不存在... 应使用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中读取该文件。

当程序结束时,它会删除给定路径上的文件,以便下次运行时相应地创建给程序的参数。

现在发生这种情况...... 我第一次运行程序时遇到错误,说文件没有写入。

  

线程中的异常" main" java.lang.IllegalArgumentException:scoreDrl(org / avalin / optaplanner / solver / employeeShiftsScoreRules.drl)不作为classLoader中的类路径资源存在

我可以在文件编写之后立即进行打印,这样就可以看到第一次运行HAS的方法,但由于某种原因,文件没有被创建"无论如何,在程序结束第一次执行之前......

第二次,程序运行正常,因为文件是在它到达异常之前创建的?

有没有办法确保文件是"完全写入"在程序的下一部分执行之前?该文件每次都有不同的长度,因为它是根据用户输入的内容动态创建的,因此我无法对其进行检查。我会假设它会完全写入,因为它执行了我在fileWriter.close()之后创建的打印,但显然不是这样。

1 个答案:

答案 0 :(得分:1)

看起来您正在将文件写入src / main / resources文件夹,该文件夹是资源源的标准位置 - 也就是说,构建系统从哪里读取文件,而不是从哪里读取文件你正在运行的程序。

虽然可以将源文件夹添加到正在运行的问题的类路径中,但这是不好的做法 - 尝试找出构建系统将其输出写入的位置(可能是类文件和复制资源的单独文件夹)并在那里写你的文件。