写入一些数据后无法删除文件,哪里出错?

时间:2012-09-28 13:47:00

标签: java file file-io delete-file

我写了一些文本然后将其删除,但删除失败。

代码非常简单:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class TestFile {

    public static void main(String[] args) throws IOException {
        File file = new File("c:\\abc.txt");
        writeFile(file, "hello");

        // delete the file
        boolean deleted = file.delete();
        System.out.println("Deleted? " + deleted);

    }

    public static void writeFile(File file, String content) throws IOException {
        OutputStream out = null;
        try {
            out = new FileOutputStream(file);
            out.write(content.getBytes("UTF-8"));
        } catch (IOException e) {
            try {
                out.close();
            } catch (IOException e1) {
                // ignored
            }
        }
    }
}

输出结果为:

Deleted? false

abc.txt下还有一个文件hello包含c:

然后我使用FileUtils.writeStringToFile(...)中的commons-io.jar代替,该文件将被删除。

但我不知道我的代码出了什么问题,请帮我找出来。

5 个答案:

答案 0 :(得分:4)

如果收到IOException,则只关闭文件。

将其更改为finally块,您就可以关闭并删除该文件了。

public static void writeFile(File file, String content) throws IOException {
    OutputStream out = new FileOutputStream(file);
    try {
        out.write(content.getBytes("UTF-8"));
    } finally {
        try {
            out.close();
        } catch (IOException ignored) {
        }
    }
}

答案 1 :(得分:1)

完成文件编写后,您需要关闭OutputStream。

try {
        out = new FileOutputStream(file);
        out.write(content.getBytes("UTF-8"));
        out.close();
    } catch (IOException e) {
        try {
            out.close();
        } catch (IOException e1) {
            // ignored
        }
    }

答案 2 :(得分:1)

如果发生异常,您只需删除文件即可。打开文件后,每次都需要这样做。 你可能想要接近最后一个块。

如果您使用的是Java 7,我会考虑使用try-with-ressources块,它会为您关闭文件。

try (BufferedReader br = new BufferedReader(new FileReader(path))) 
{
    return br.readLine();
}

答案 3 :(得分:1)

在您的主要方法中,

 public static void main(String[] args) throws IOException {
        File file = new File("c:\\abc.txt");
        writeFile(file, "hello");

        // delete the file
        boolean deleted = file.delete();
        System.out.println("Deleted? " + deleted);

    }

您打开文件,写入文件然后不要关闭它。 Java会为您保留文件,因此如果您想为其添加更多信息,可以。但是,为了能够删除该文件,您需要确保没有其他引用打开。您可以使用file.close()来关闭文件句柄Java保留。

最好在完成后关闭流,尤其是在向其中添加数据时。否则,您可能会遇到意外打开保留文件的情况,或者在极端情况下,丢失您认为已保存的数据。

答案 4 :(得分:1)

看看你没有FileUtils.writeStringToFile()做什么。

public static void writeStringToFile(File file, String data, String encoding) throws IOException {
    OutputStream out = new java.io.FileOutputStream(file);
    try {
        out.write(data.getBytes(encoding));
    } finally {
        IOUtils.closeQuietly(out);
    }
}

您会注意到out总是关闭,在您的示例中,如果catch抛出write()块,它只会在{{1}}块中关闭异常。

在Windows上,无法删除任何程序打开的文件。