缓冲 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);
}
}
}
我正在创建一个使用 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);
}
}
}