Java 缓冲读取器和file.delete
我正在创建一个使用File.delete()方法删除文件的小程序,但是我有一点问题,如果我在删除.txt文件之前使用缓冲读取器读取该文件,它不会删除该文件。我确实想出了一个解决方案:我只是在删除文件之前关闭缓冲读取器。然而,这对我来说毫无意义,为什么会发生这种情况,有人能解释一下吗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
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
打开(可能仍在使用)并由另一个文件
对象删除的文件并没有错?通常情况下,在尝试删除文件之前,应该先关闭所有文件。这里没有意义的是,尝试删除一个仍然打开供阅读的文件。决定是读取还是删除该文件。你不能同时做这两件事。