java的File类的 delete方法删不掉文件的原因分析
先举几个可以删除掉文件和删除不掉文件的例子(先在F盘创建test1.txt文件,然后可以直接拷贝代码到IDE执行),最后总结下原因:
例子一:下面的例子毫无疑问是能够删除掉文件的
import java.io.File;
import java.io.IOException; public class Test {
public static void main(String[] args) throws IOException {
File file = new File("F:/test1.txt");
file.delete();
}
}
原因:一个进程内(或者线程)单个线程执行,不存在资源共享的问题,所以可以删除。
例子二:下面的例子会删除成功,但是后面会报找不到文件的异常
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream; public class Test {
public static void main(String[] args) throws IOException {
FileOutputStream fos = null;
File file = new File("F:/test1.txt");
if (!file.exists()) {
file.createNewFile();
// 构造写入文件内容
fos = new FileOutputStream(file);
fos.write("Hello Wolrd".getBytes());
}
file.delete();
InputStream inputStream = new FileInputStream(file);
}
}
原因:即使后面的InputStream使用到file,但是红线处的delete方法已经把文件删除了,所以会报找不到系统文件的异常。接着看下面的例子。
例子三:下面的例子会删除失败,原因是InputStream正在使用file,IO流还没有关闭
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream; public class Test {
public static void main(String[] args) throws IOException {
FileOutputStream fos = null;
File file = new File("F:/test1.txt");
if (!file.exists()) {
file.createNewFile();
// 构造写入文件内容
fos = new FileOutputStream(file);
fos.write("Hello Wolrd".getBytes());
}
InputStream inputStream = new FileInputStream(file);
file.delete();
}
}
删除失败,原因是后面的InputStream使用到file,而且InputStream没有关闭流,所以导致删除失败。
例子四:下面的例子会删除成功,原因是后面的InputStream先关闭IO流了再删除
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream; public class Test {
public static void main(String[] args) throws IOException {
FileOutputStream fos = null;
File file = new File("F:/test1.txt");
if (!file.exists()) {
file.createNewFile();
// 构造写入文件内容
fos = new FileOutputStream(file);
fos.write("Hello Wolrd".getBytes());
}
InputStream inputStream = new FileInputStream(file);
// 关闭流
if (inputStream != null) {
inputStream.close();
}
file.delete();
}
}
原因:删除成功,原因是后面的InputStream先关闭IO流了再调用delete方法删除文件,可以和例子三对比下不同之处就明白了。
接下来总结File的delete方法需要注意的一些地方:
1. 如果要删除的文件正在被占用,文件会删不掉,例如别的程序还在对文件进行读取操作,没来得及释放文件,后边的程序就试图删除该文件,会导致删除失败。
2. 使用IO操作文件的过程中要记得关闭流,这是做程序员的最基本素质。
java的File类的 delete方法删不掉文件的原因分析的更多相关文章
- java 之 file类的一些方法
File类: File类是java.io包下代表与平台无关的文件和目录,也就是说,如果希望在程序中操作文件和目录,都可以通过File类来完成.但是File不能访问文件内容本身. 访问文件和目录: 1. ...
- java之io之File类的list()方法过滤目录的使用
java的io的知识中,File类必须掌握.File类是对文件或者文件夹的封装.它本身并不能对所封装的文件进行读写,它封装的只是文件或文件夹的周边知识,比如 大小啦,创建日期啦,路径啦等等. 如果Fi ...
- Java 中File类的createNewFile()与createTempFile(), delete和deleteOnExit区别
1. Java 中File类的createNewFile()与createTempFile()的区别 最近,在看代码时看到了一个方法, File.createTempFile() ,由此联想到File ...
- Java学习笔记-File类的基本方法
要渐渐养成写博客的习惯-----> 前段时间看Mars的java中的I/O流没怎么懂,发现I/O流好难啊.今天重新看一遍其他教学,还有书籍,做些笔记,记录下每天的学习生活. File类的一些方法 ...
- java.io.File类操作
一.java.io.File类 String path="E:/222/aaa";//路径 String path1="aaa.txt"; File file= ...
- java中File类的使用
public class FileLei { public static void main(String[] args) throws IOException { //..表示上 ...
- java.io.File类
java.io.File类 1.凡是与输入.输出相关的类.接口等都定义在java.io包下 2.File是一个类.能够有构造器创建其对象.此对象相应着一个文件(.txt .avi .doc .ppt ...
- Java之File类
一.初见File类 java.io.File类代表系统中的文件(文件或目录) 常用构造方法 File(String pathname) File(String parent, String child ...
- JAVA基础-File类
一.File类概述 File类是文件和目录路径名的抽象表示形式.File类可以理解为一个文件路径或者文件夹路径的JAVA表现形式,而路径又可以分为绝对路径(是一个固定路径,从盘符开始),相对路径(相对 ...
随机推荐
- Verilog-1995 VS Verilog-2001
http://www.cnblogs.com/tshell/p/3236476.html 2001年3月IEEE正式批准了Verilog‐2001标准(IEEE1364‐2001),与Verilog‐ ...
- hdu 1587 Flowers
Flowers Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- SSIS结合BCP及SQL Server作业实现定时将数据导出打包实现数据同步
首先这个流程要实现的功能大致是: 有两台服务器,一台是对外网开发的,一台是内网的.那么很明显数据交互都是外网服务器在做,而这个流程要做的就是要将外网上面的数据定时同步到内网中. 我们依对其中某张表的操 ...
- js生成动态日历
效果图: 看代码: <html> <head> <title>动态日历</title> <style type="text/css& ...
- 14_Xml继承
[工程截图] [Person.java] package com.HigginCui; public class Person { private String name; public String ...
- 在Windows下用gSoap实现简单加法实例
实现一个简单的a+b程序,在服务器端写一个程序,里面包含了a+b的函数,然后通过客户端代码向其发送两个数字,在服务器运算得到结果返回给客户端显示出来. 1.在gSoap的官网上下载文件夹,本人的版本是 ...
- 安装交叉编译arm-linux-gcc环境
设置好交叉编译的执行文件路径贴加到环境变量PATH 设置如下 export PATH=$PATH:/XXX/XXX/bin /etc/profile /~/.bashrc source /etc/p ...
- Traveller数据访问路径
2015年10月数据访问路径
- 简单Linq笔记
Linq是.net 3.5才引入的 要引入命名空间System.Linq. Linq to XML要引入System.Xml.Linq Linq to ADO.NET要引入System.Data.L ...
- JS如果阻止事件冒泡和浏览器默认事件
原地址:http://missra.com/article/web-57.html 嵌套的标签元素,如果父元素和子元素都绑定了一些事件,那么在点击最内层子元素时可能会触发父级元素的事件,下面介绍一下J ...