在Java.io包之中,File类是唯一一个与文件本身操作(创建、删除、取得信息…)有关的程序类。
File类的基本使用
File类的构造方法:
public File(String pathname) ;//设置文件的路径
public File(String parent, String child);//设置父路径和子路径
创建一个新文件:
public boolean createNewFile() throws IOException//受查异常,同一个目录下一个文件不能被创建两次
判断文件(夹)是否存在:
public boolean exists();
删除文件:
public boolean delete();
范例:文件的基本操作
public class Test {
public static void main(String[] args) {
//定义要操作的文件路径
File file = new File("C:\\Users\\Administrator\\Desktop\\IOjava.java");
//如果文件不存在,就创建一个新文件
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}else {
//文件存在就删除当前文件
System.out.println("file exists");
file.delete();
}
}
}
以上实现了最简化的文件处理操作,但是代码存在两个问题:
如果我们使用的环境不同,路径的问题就很麻烦了。windows下使用的是"//",而Unix系统下使用的是"/"。
解决方法:在使用路径分隔符时采用File类的一个常量"public static finalString separator "来描述,他会根据环境的不同来变换路径分隔符。
范例:
import java.io.*;
import java.io.File;
public class Test {
public static void main(String[] args) {
//定义要操作的文件路径
File file = new File("C:Users"+File.separator+"Administrator"+File.separator+"Desktop"+File.separator+"IOjava.java");
System.out.println(file);
//如果文件不存在,就创建一个新文件
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}else {
//文件存在就删除当前文件
System.out.println("file exists");
file.delete();
}
}
}
运行结果:自动替换了分隔符
目录操作
取得父路径或父File对象:
public String getParent();
public File getParentFile();
创建目录(无论有多少级父目录,都会创建):
public boolean mkdirs();
范例:
import java.io.*;
import java.io.File;
public class Test {
public static void main(String[] args) {
//定义要操作的文件路径
File file = new File("C:Users"+File.separator+"Administrator"
+File.separator+"Desktop"+File.separator+"www"+File.separator+"HE"+File.separator+"IO"+File.separator+"IOjava.java");
File parentfile=file.getParentFile();//获得父目录文件
//如果父目录不存在,创建父目录
if(!parentfile.exists()){
parentfile.mkdirs();
}
//如果文件不存在,就创建一个新文件
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}else {
//文件存在就删除当前文件
System.out.println("file exists");
file.delete();
}
}
}
文件信息操作
在File类里面提供有一系列取得文件信息的操作:
- 判断路径是否是文件: public boolean isFile();
- 判断路径是否是目录: public boolean isDirectory();
- 取得文件大小(字节): public long length();
- 最后一次修改日期 : public long lastModified();//返回:表示文件最后一次被修改的时间的 long 值,用该时间与历元(1970 年 1 月 1 日,00:00:00 GMT)的时间差来计算此值(以毫秒为单位)。如果该文件不存在,或是发生 I/O 错误,则返回 0L,抛出异常。所以我们一般使用一个日期类将这个值转换为时间格式。
范例:
import java.io.File;
import java.util.Date;
public class Test {
public static void main(String[] args) {
//定义要操作的文件路径
File file = new File("C:Users" + File.separator + "Administrator"
+ File.separator + "Desktop" + File.separator + "peter.jpg");
if (file.exists() && file.isFile()) {
System.out.println(file.length()/1024);//取得文件大小(KB)
System.out.println(new Date(file.lastModified()));//获取文件最后一次修改的时间
}
}
}
应用:列出目录中的全部组成
public File[] listFiles();
import java.io.File;
import java.util.Date;
public class Test {
public static void main(String[] args) {
//定义要操作的文件路径
File file = new File("C:Users" + File.separator + "Administrator"
+ File.separator + "Desktop");
System.out.println("开始遍历文件.....");
long start=System.currentTimeMillis();
if(file.exists()&&file.isDirectory()) {
F(file);//递归实现目录中目录的展开
}
System.out.println("结束遍历文件.....");
long end=System.currentTimeMillis();
System.out.println("耗时->"+(end-start));
}
public static void F(File f){
if(f.exists()&&f.isFile()){
System.out.println(f);
return ;
}
File[] files = f.listFiles();
if(files!=null){
for (File ff : files) {
F(ff);
}
}
}
}
线程阻塞问题:
现在所有代码都是在main线程下完成的,如果F()方法没有完成,那么对于main后续的执行将无法完成。这种耗时的操作让主线程出现了阻塞,而导致后续代码无法正常执行完毕。如果不想让阻塞产生,最好再产生一个新的线程进行处理。
import java.io.File;
import java.util.Date;
public class Test {
public static void main(String[] args) {
System.out.println("main begin.....");
new Thread(()-> {
File file = new File("C:Users" + File.separator + "Administrator"
+ File.separator + "Desktop");
long start = System.currentTimeMillis();
if (file.exists() && file.isDirectory()) {
F(file);//递归实现目录中目录的展开
}
}).start();
System.out.println("main end.....");
}
public static void F(File f){
if(f.exists()&&f.isFile()){
System.out.println(f);
return ;
}
File[] files = f.listFiles();
for (File ff : files) {
F(ff);
}
}
}
但是,以上操作如果将输出变为删除就可以成为一个恶意程序了~~~所以操作需谨慎呀~