写了一个3个文件读取并写入到一个文件的程序,但再将写入完成后的这三个文件删除的时候却出现了第一个无法删除,第二和第三个可以删除的问题,找了半天也没有找到,我的代码如下:
读取并写入的方法:
try {
if(!resultFile.exists()){
for (String file : fpaths) { //(将要读取的文件放入到集合中了,所以重新遍历)
filename=new File(file);
br=new BufferedReader(new InputStreamReader(new FileInputStream(filename)));
pw=new PrintWriter(new OutputStreamWriter(new FileOutputStream(resultFile,true)));
//听了大神的建议后打印这两个流的内存地址
log.info("br:"+br+" pw:"+pw);
String line=null;
while((line=br.readLine())!=null){
if(line.indexOf(",")!=-1){
pw.write(line);//写入数据
pw.write("\r\n");//换行
totalnum++;
}
}
pw.flush();//最后刷新到文件中
pw.write((""+totalnum));
pw.flush();//把行数最后刷新到文件最后一行
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}finally{
try {
if(br!=null){
br.close();
}
if(pw!=null){
pw.close();
}
//听了大神的建议后打印这两个流的内存地址
log.info("finally br:"+br+" pw:"+pw);
} catch (Exception e2) {
e2.printStackTrace();
}
}
通过大神的指点,知道了原因,关闭流的操作放在for循环外的写法只关闭了最后一次for循环的br和pw流,打印一下流的内存地址:
br:java.io.BufferedReader@1960f05 pw:java.io.PrintWriter@b42cbf
br:java.io.BufferedReader@76cbf7 pw:java.io.PrintWriter@148cc8c
br:java.io.BufferedReader@6d084b pw:java.io.PrintWriter@3bb2b8
finally br:java.io.BufferedReader@6d084b pw:java.io.PrintWriter@3bb2b8
只打印出了最后一次循环的流
删除文件的方法:
public static boolean deleteFile(List<String> UngzFileList){
boolean flag=false;
for (String deletefile : UngzFileList) {
File file=new File(deletefile);
if(file.exists()){
file.delete();
if(!file.exists()){
log.info("----------"+file+" had deleted");
flag=true;
}
}else{
log.info("----------"+file+"didn't exist ,can't deleted");
flag=false;
}
}
return flag;
}
通过查找此类错误,网上说要关闭流,可是我的流是关闭的,通过调试模式查看,第一个文件再被写入完成和写入过程中都无法删除,手动删除时一直被JVM占用,当程序停止后,手动可以删除,就是说明还是被程序占用导致无法删除,而第二和第三个文件在写入完成后却可以删除,我目前还不知道为什么。(??如果有码友知道什么原因,欢迎骚然留言哦!?? 后面问了大神,知道了原因?)
后面通过修改写入文件的代码后可以删除文件了
修改写入的代码如下:
if(!resultFile.exists()){
for (String file : fpaths) {
try {
filename=new File(file);
br=new BufferedReader(new InputStreamReader(new FileInputStream(filename)));
pw=new PrintWriter(new OutputStreamWriter(new FileOutputStream(resultFile,true)));
//听了大神的建议后打印这两个流的内存地址
log.info("br:"+br+" pw:"+pw);
String line=null;
while((line=br.readLine())!=null){
if(line.indexOf(",")!=-1){
pw.write(line);//写入数据
pw.write("\r\n");//换行
totalnum++;
}
}
pw.flush();//最后刷新到文件中
pw.write((""+totalnum));
pw.flush();//把行数最后刷新到文件最后一行
} catch (FileNotFoundException e) {
e.printStackTrace();
return false;
} catch (IOException e) {
e.printStackTrace();
return false;
}finally{
try {
if(br!=null){
br.close();
}
if(pw!=null){
pw.close();
}
//听了大神的建议后打印这两个流的内存地址
log.info("finally br:"+br+" pw:"+pw);
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
写入的时候由读取三个文件并且三个文件全部写入完成后才关闭流改为每读取一个文件并写入文件后就关闭流,一共关闭三次流。再次尝试就可以删除了。
这种方法打印出来的内存地址:
br:java.io.BufferedReader@29428e pw:java.io.PrintWriter@d0a5d9
finally br:java.io.BufferedReader@29428e pw:java.io.PrintWriter@d0a5d9
br:java.io.BufferedReader@388993 pw:java.io.PrintWriter@1d04653
finally br:java.io.BufferedReader@388993 pw:java.io.PrintWriter@1d04653
br:java.io.BufferedReader@b8f82d pw:java.io.PrintWriter@1ad77a7
finally br:java.io.BufferedReader@b8f82d pw:java.io.PrintWriter@1ad77a7
每读取写入完后流都被关闭了,所以文件可以被删除。