Java 缓冲读取器和file.delete

Java 缓冲读取器和file.delete,java,exception,bufferedreader,Java,Exception,Bufferedreader,我正在创建一个使用File.delete()方法删除文件的小程序,但是我有一点问题,如果我在删除.txt文件之前使用缓冲读取器读取该文件,它不会删除该文件。我确实想出了一个解决方案:我只是在删除文件之前关闭缓冲读取器。然而,这对我来说毫无意义,为什么会发生这种情况,有人能解释一下吗 import java.io.*; import java.nio.file.Files; public class Purge { public static void main(String[] ar

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

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();
    }

当对流对象进行垃圾收集时,其终结器将关闭底层文件描述符。因此,只有在添加了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);
            }
        }
    }
公共流读线(路径存档){
试一试{
BufferedReader BufferedReader=新的BufferedReader(新的InputStreamReader(
(新文件输入流(archive.toFile());
返回bufferedReader.lines();
}捕获(IOE异常){
抛出新的未选中异常(e);
}最后{
试一试{
文件。删除(存档);
System.out.println(“删除:“+存档”);
}捕获(IOE异常){
System.out.println(“无法删除:+存档”);
}
}
}

您可以在
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);
            }
        }
    }
公共流读线(路径存档){
试一试{
BufferedReader BufferedReader=新的BufferedReader(新的InputStreamReader(
(新文件输入流(archive.toFile());
返回bufferedReader.lines();
}捕获(IOE异常){
抛出新的未选中异常(e);
}最后{
试一试{
文件。删除(存档);
System.out.println(“删除:“+存档”);
}捕获(IOE异常){
System.out.println(“无法删除:+存档”);
}
}
}

我不确定java(或windows)的文件锁定行为,但删除由
BufferedReader打开(可能仍在使用)的文件并被另一个
文件
对象删除不是错误的吗?通常情况下,在尝试删除文件之前,应该先关闭所有文件。这里没有意义的是,尝试删除一个仍然打开供阅读的文件。决定是读取还是删除该文件。您不能同时执行这两项操作。我不确定java(或windows)的文件锁定行为,但删除一个由
BufferedReader
打开(可能仍在使用)并由另一个
文件
对象删除的文件并没有错?通常情况下,在尝试删除文件之前,应该先关闭所有文件。这里没有意义的是,尝试删除一个仍然打开供阅读的文件。决定是读取还是删除该文件。你不能同时做这两件事。