缓冲 reader 和 file.delete

buffered reader and file.delete

我正在创建一个使用 File.delete() 方法删除文件的小程序,但是如果我使用缓冲的 Reader 读取 . txt 文件,然后我删除它,它不会删除该文件。我确实想出了一个解决方案:我只是在删除文件之前关闭缓冲的 reader 。然而,这对我来说没有意义,为什么会发生这种情况,谁能解释一下。

import java.io.*;
import java.nio.file.Files;

public class Purge {

    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub

        String sample;
        boolean result = false;


        BufferedReader amg = new BufferedReader(new FileReader("C:/Users/Steven/Desktop/me.txt"));
        sample = amg.readLine();
        amg.close();// closes the buffered reader 
                System.out.println("Haha I'm stille here: "+sample);
        File anesu = new File("C:/Users/Steven/Desktop/me.txt");

        if (anesu.exists()){

        try{result = anesu.delete();

        }catch( Exception x){
            System.out.println("Problem Deleting File"+x);
        }
        catch( Throwable e){
            System.out.println("Problem Deleting File Throwable"+e);
        }

        }else{
            System.out.println("No File ");
        }
        System.out.println("File has been deleted: "+result);

    }

}

当流对象被垃圾回收时,它的终结器会关闭底层文件描述符。因此,删除仅在您添加 System.gc() 调用时有效这一事实有力地证明了您的代码无法关闭文件的某些流。它很可能是与您发布的代码中打开的流对象不同的流对象。

注:

正确编写的流处理代码使用 finally 块来确保无论如何关闭流。

如果您不想使用 System.gc(),请使用 FileInputStream

读取您的内容
    InputStream in = new FileInputStream(new File("C:/temp/test.txt"));
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    StringBuilder out = new StringBuilder();
    try {
        String line;
        while ((line = reader.readLine()) != null) {
            out.append(line);
         }
         System.out.println(out.toString());   //Prints the string content read from input stream
    }
    catch(Exception ex) {//TODO}
    finally {
         reader.close();
    }

您可以删除finally块中的文件。 这种方法的缺点是,如果抛出异常,文件仍将被删除。

public Stream<String> readLines(Path archive) {
        try {
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(
                    (new FileInputStream(archive.toFile()))));

            return bufferedReader.lines();
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        } finally {
            try {
                Files.delete(archive);
                System.out.println("Deleted: " + archive);
            } catch (IOException e) {
                System.out.println("Unable to delete: " + archive);
            }
        }
    }