解决file.delete()无法删除部分文件的问题

写了一个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

每读取写入完后流都被关闭了,所以文件可以被删除。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值