无法删除文件Java

时间:2012-02-29 16:34:29

标签: java file delete-file

我有这个方法获取.txt文件的最后一行并创建一个没有该行的新临时文件。但是当我尝试删除具有我想要删除的行的.txt时(因此我可以重命名临时文件)由于某些原因我不能。这是代码:

void removeFromLocal() throws IOException {
    String lineToRemove = getLastLine();
    File inputFile = new File("nexLog.txt");
    File tempFile = new File("TempnexLog.txt");
    BufferedReader reader = null;
    BufferedWriter writer = null;
    try {

        reader = new BufferedReader(new FileReader(inputFile));
        writer = new BufferedWriter(new FileWriter(tempFile));

        String currentLine;
        int i = 0;
        while ((currentLine = reader.readLine()) != null) {
            i++;                
            String trimmedLine = currentLine.trim();
            if (!trimmedLine.equals(lineToRemove)) {
                if (i != 1) {
                    writer.newLine();
                }
                writer.write(currentLine);
            }
        }
            reader.close();
            reader = null;
            writer.flush();
            writer.close();
            writer = null;
            System.gc();

            inputFile.setWritable(true);

            if (!inputFile.delete()) {
                System.out.println("Could not delete file");
                return;
            }


            if (!tempFile.renameTo(inputFile)) {
                System.out.println("Could not rename file");
            }
        //boolean successful = tempFile.renameTo(inputFile);
    } catch (IOException ex) {
        Logger.getLogger(dropLog.class.getName()).log(Level.SEVERE, null, ex);
    }
}

有趣的是,当我按下调用方法一次的按钮时,没有任何反应(“无法删除文件”),第二次工作正常,第三次我得到“无法重命名文件”。

2 个答案:

答案 0 :(得分:3)

当其他进程打开文件时,无法删除该文件。例如。在记事本中左右,或者甚至是代码中其他位置的文件上的另一个FileReader / FileWriter。此外,当您在IDE中执行此操作时,您将冒险在后台扫描期间IDE将触摸该文件,以便在项目文件夹中进行修改。而是将文件存储在IDE项目之外的绝对路径中。

此外,必须修改打开和关闭文件的代码流,以便在finally块中执行关闭。这个成语是这样的:

Reader reader = null;

try {
    reader = new SomeReader(file);
    // ...
} finally {
    if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {}
}

或者,如果您已经使用Java 7,请改用automatic resource management

try (Reader reader = new SomeReader(file)) {
    // ...
}

此外,我建议使用File#createTempFile()来创建临时文件。这样就会生成一个唯一的临时文件名,因此可以防止多个进程写入和重命名的临时文件。

File tempFile = File.createTempFile("nexLog", ".txt");

答案 1 :(得分:1)

BufferedReader关闭嵌套阅读器(文档中没有提到)吗?您必须通过检查setWritable是否成功来确定。否则您也需要关闭FileReader,我建议因为如果您关闭它两次就没有任何伤害......顺便说一下GC调用比有用更有害。