1、File类在整个IO包中是唯一一个与文件本身有关的操作类,所谓的与文件本身有关指的是创建、删除文件等操作,
File类的构造
Public File(String pathname):在建立File对象的时候需要指定一个路径 |
2、创建、删除文件的操作
例:现在想创建一个文件
package com.itheima; import java.io.File; public class FileDemo1{ public static void main(String[]args){ try{ File file=new File(“c:\\temp.txt”);//指定要操作的文件路径 file.createNewFile();//创建一个文件 }catch(Exception e){ e.printStatckTrace(); } } } |
上面的例子验证了File类中的createNewFile()是创建一个新文件,如果我们想删除一个文件怎么办呢?
File类中提供了删除文件的方法delete(),不过,在删除文件之前,我们必须判断一下要操作的文件是否存在:exists()
例:如果文件存在,则删除,如果不存在,则创建新的
package com.itheima; import java.io.File; public class FileDemo2{ public static void main(String[]args)throws Exception{ File file=new File(“c:\\temp.txt”);//指定要操作的文件路径 //判断要操作的文件是否存在,存在则删除,不存在则创建 if(file.exists){ file.delete();//删除文件 }else{ File.createNewFile();//创建文件 } } } |
在创建和删除文件的时候发现会出现延迟的问题,因为java运行机制是运行在JVM上,在java中的最大特点就是可移植性,但是上面的程序有一点小小的问题,在不同的操作系统下,可能编译不通过。因为不同的操作系统中路径的分隔符不太一样
windows中使用“\” linux中使用“/” |
File类为了解决这个问题,定义了一个常量:public static final String separator.所以上面的代码修改如下:
File file=new File(“c:”+File.separator+”temp.txt”);//指定要操作的文件路径 |
3、文件和文件的判断
在给定文件的路径上有可能给出的是一个文件,也可能给出的是一个文件夹,怎么判断呢?
public boolean isFile():判断是否是文件 public boolean isDirectory():判断是否是文件夹 |
例:判断类型
package com.itheima; import java.io.File; public class FileDemo3{ public static void main(String[]args)throws Exception{ File file1=new File(“c:”+File.separator+”temp.txt”);//指定要操作的文件路径 File file2=new File(“c:”+File.separator+”testjava”);//指定要操作的文件路径 System.out.println(file1.isFile());//如果是文件则打印true,否则false System.out.println(file2.isDirectory());//如果是文件夹则打印true,否则false } } |
4、列出文件夹中的所有内容
列出内容:public String[]list(); 列出内容:public File[]listFiles() |
例:使用list()方法
package com.heima.io; import java.io.File; public class FileDemo4 { public static void main(String[] args) { //指定要操作的文件路径 File file =new File("d:"+File.separator+"aa ");if(file.isDirectory()){//如果是文件夹,则列出内容 String[]list=file.list();//列出全部的内容 for(int i=0;i<list.length;i++){//把所有的内容都打印出来 System.out.println(list[i]); } } } } |
运行结果:
例:使用listFiles()完成列表
package com.heima.io; import java.io.File; public class FileDemo5 { public static void main(String[] args) { File file =new File("d:"+File.separator+"aa");//指定要操作的文件路径 if(file.isDirectory()){//如果是文件夹,则列出内容 File[]list=file.listFiles();//列出全部的内容 for(int i=0;i<list.length;i++){//把所有的内容都打印出来 System.out.println(list[i]); } } } } |
运行结果:
从上面的两个事例中可以发现两个方法的区别。
思考:现在要求输出一个给定目录中的全部文件的路径。
上面的两个事例只能输出一级文件目录的所有文件或文件夹的路径,对于更深层的文件或文件夹则无法输出,要实现这个问题需要用到递归了。
package com.heima.io; import java.io.File; public class FileDemo4 { public static void main(String[] args) { File file =new File("d:"+File.separator+"aa");//指定要操作的文件路径 list(file);//调用list()方法列出所有文件的路径 } public static void list(File file){ if(file!=null){//判断对象是否为空 if(file.isDirectory()){//如果是文件夹,则继续输出 File f[]=file.listFiles(); if(f!=null){//文件夹的内容已经列出 for(int i=0;i<f.length;i++){ list(f[i]);//通过递归继续列出每一个内容。 } } } }else{//如果是文件,则直接输出 System.out.println(file); } } } |
问题:怎样删除带内容的目录
原理:在window中删除目录从里面往外删除,需要用到递归了
package com.itheima.file; import java.io.File; public class FileDemo2 { public static void main(String[] args)throws Exception { //创建一个File对象 File file=new File("d:"+File.separator+"aaa"); remove(file);//调用remove方法删除指定的内容 } public static void remove(File file){ //列出aa中的所有内容 try{ //列出目录中的所有内容 File[]files=file.listFiles(); //遍历目录中的所有内容 for(File file1:files){ //判断是否是目录,如果是,利用递归继续查找 if(file1.isDirectory()){ remove(file1); }else{ //如果是文件直接删除 System.out.println(file1+"::被删除"+file1.delete()); } } //然后删除空目录 System.out.println(file+"::被删除"+file.delete()); }catch(Exception e){ System.out.println("此文件夹不存在"); } } } |