1.File文件操作
java.io.File用于表示文件(目录),也就是说程序员可以通过File类在程序中操作硬盘上的文件和目录。File类只用于表示文件(目录)的信息(名称、大小等),不能对文件的内容进行访问。
1)构造方法
- 构造方法一:File(String pathname)
- 通过将给定路径名字符串转换成抽象路径名来创建一个新File实例
- 抽象路径应尽量使用相对路径,并且目录的层级分隔符不要直接写“/”或“\”,因为不同的系统用的分隔符不一样,应该使用File.separator这个常量表示,以避免不同系统带来的差异。
import java.io.File; public class FileDemo { public static void main(String[] args) { File file = new File("D:"+File.separator+"Study"+File.separator+"Java"+File.separator+"Workspaces"+File.separator+"MyProject"+File.separator+"filedemo.txt"); System.out.println(file); } } /* 运行结果: D:\Study\Java\Workspaces\MyProject\filedemo.txt */
- 构造方法二:File(File parent,String child)
- 根据parent抽象路径名和child路径名字符串创建一个新File实例
import java.io.File; public class FileDemo { public static void main(String[] args) { File parent = new File("D:"+File.separator+"Study"+File.separator+"Java"+File.separator+"Workspaces"+File.separator+"MyProject"); File file = new File(parent,"filedemo.txt"); System.out.println(file); } } /* 运行结果: D:\Study\Java\Workspaces\MyProject\filedemo.txt */
2)isFile()方法
- 用于判断当前File对象所表示的是否为一个文件
- 返回值为boolean类型
- 返回值:true则表示是一个文件,false则不是文件
import java.io.File; public class FileDemo { public static void main(String[] args) { File file = new File("filedemo.txt"); boolean b = file.isFile(); if(b){ System.out.println(file+"是一个文件"); } } } /* 运行结果: filedemo.txt是一个文件 */
3)length()方法
用于返回由此抽象路径名表示的文件的长度(占用的字节量)。
- 返回值类型为long
- 返回值是当前File对象所表示的文件所占用的字节量
import java.io.File; public class FileDemo { public static void main(String[] args) { File file = new File("filedemo.txt"); long len = file.length(); System.out.println("该文件长度为:"+len+"字节"); } } /* 运行结果: 该文件长度为:11字节 */
4)exists()方法
用于测试此抽象路径名表示的文件或目录是否存在。
- 返回值类型是boolean
- 返回值:若该File表示的文件或目录存在则返回true,否则返回false
import java.io.File; public class FileDemo { public static void main(String[] args) { File file = new File("filedemo.txt"); boolean b = file.exists(); System.out.println("该文件是否存在的结果是:"+b); File file2 = new File("file.txt"); b = file2.exists(); System.out.println("该文件是否存在的结果是:"+b); } } /* 运行结果: 该文件是否存在的结果是:true 该文件是否存在的结果是:false */
5)creatNewFile()方法
该方法用于当且仅当不存在具有此抽象路径名指定的名称的文件时,创建由此抽象路径名指定的一个新的空文件。
- 返回值是boolean类型
- 如果知道文件不存在并成功创建则返回true,如果知道文件已经存在则返回false
import java.io.File; import java.io.IOException; public class FileDemo { public static void main(String[] args) throws IOException { File file = new File("filedemo.txt"); boolean b = file.createNewFile(); System.out.println(b); File file2 = new File("file.txt"); b = file2.createNewFile(); //成功创建不存在的该文件,如下图 System.out.println(b); } } /* 运行结果: false true */
6)delete()方法
该方法用于删除此抽象路径名表示的文件或目录。
- 返回值类型为boolean
- 当且仅当成功删除文件或目录时,返回true;否则返回false
- 注意:若此file对象所表示的是一个目录时,在删除时需要保证此目录为空才可以成功删除(目录中不能含有任何子项)
import java.io.File; public class FileDemo { public static void main(String[] args) { File file = new File("file.txt"); boolean b = file.delete(); System.out.println(b); File dir = new File("test"); //test文件夹下面建立了子文件夹和子文件 b = dir.delete(); System.out.println(b); } } /* 运行结果: true 成功删除 false 含有子文件不能删除,返回false */
7)isDirectory()方法
该方法用于判断当前File表示的是否为一个目录。
- 返回值类型为boolean类型
- 返回值:当File对象表示一个目录时返回true,否则返回false
import java.io.File; public class FileDemo { public static void main(String[] args) { File dir = new File("test"); boolean b = dir.isDirectory(); System.out.println(b); File file = new File("filedemo.txt"); b = file.isDirectory(); System.out.println(b); } } /* 运行结果: true false */
8)mkdir()方法
该方法用于创建此抽象路径名指定的目录。
- 返回值类型为boolean类型
- 当且仅当已创建目录时返回true,否则返回false
- 当创建的文件夹不存在父目录时无法创建(不能创建多级目录)
import java.io.File; public class FileDemo { public static void main(String[] args) { File dir = new File("dirdemo"); boolean b = dir.mkdir(); System.out.println(b); //dirdemo1这个文件夹是不存在的,看是否能够建立成功 File dir2 = new File("dirdemo1"+File.separator+"dirdemo2"+File.separator+"dirdemo3"); b = dir2.mkdir(); System.out.println(b); } } /* 运行结果: true false 说明mkdir()无法创建没有父目录的目录 */
9)mkdirs()方法
该方法用于创建此抽象路径名指定的目录,包括所有必须但不存在的父目录。注意:此操作失败时也可能已经成功地创建了一部分必须的父目录。
- 返回值为boolean类型
- 当且仅当创建目录以及所有必须的父目录时返回true,否则返回false
import java.io.File; public class FileDemo { public static void main(String[] args) { //dirdemo1这个文件夹是不存在的,看是否能够建立成功 File dir = new File("dirdemo1"+File.separator+"dirdemo2"+File.separator+"dirdemo3"); boolean b = dir.mkdirs(); System.out.println(b); } } //运行结果:true 检查文件夹发现创建成功
10)listFiles()方法
该方法用于返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的子项(文件或目录)。
- File[] listFiles()
- 返回值:抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件和目录,如果目录为空,数组也是空,如果抽象路径名不表示一个目录或者发生I/O错误,则返回null
import java.io.File; import java.util.Arrays; public class FileDemo { public static void main(String[] args) { File file = new File("dirdemo"); File[] list = file.listFiles(); System.out.println(Arrays.toString(list)); //变量该数组内容 for(File x:list){ System.out.println(x); } File file2 = new File("filedemo.txt"); File[] list2 = file2.listFiles(); System.out.println(Arrays.toString(list2)); } } /* 运行结果: [dirdemo\one, dirdemo\one.txt] dirdemo\one dirdemo\one.txt null filedemo.txt是文件不是目录,所以返回null */
11)FileFilter接口
- 用于抽象路径名的过滤器
- 此接口的实例可传递给File类的listFiles(FileFilter)方法,用于返回满足该过滤器要求的子项
通过listFiles方法可以获取一个目录下所有的子项,有时候只希望获取部分特定的子项,这时可以使用File的重载方法:
File[] listFiles(FileFilter filter)
该重载方法要求传入一个参数,类型是FileFilter,FileFilter是用于抽象路径名的过滤器,相当于定义一个规则来过滤文件。FileFilter是一个接口,所以定义规则时,可以定义一个类来实现这个接口,而此接口的实例可传递给File类的listFiles(FileFilter)方法,如案例1。
案例1:过滤所有以.txt结尾的文件
1 import java.io.File; 2 import java.io.FileFilter; 3 import java.util.Arrays; 4 5 public class FileDemo { 6 public static void main(String[] args) { 7 File dir = new File("."); //.表示当前目录 8 File[] subs = dir.listFiles(new FileFilter(){ 9 public boolean accept(File file){ 10 return file.getName().endsWith(".txt"); 11 } 12 }); 13 System.out.println(Arrays.toString(subs)); 14 //遍历 15 for(File sub:subs){ 16 System.out.println(sub); 17 } 18 } 19 }
该方法的参数FileFilter实例的accept方法进行过滤,listFiles方法会将所有accept方法返回true的子项保留并返回。
案例2:查看文件的相关信息
要求:查看文件名、大小、可读、可写、是否隐藏、最后修改时间
import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; public class FileInfoDemo { public static void main(String[] args) { File file = new File("filedemo.txt"); //获取文件名 String name = file.getName(); System.out.println("文件名:"+name); //获取文件大小,有多少字节 long len = file.length(); System.out.println("文件有"+len+"个字节"); //查看是否可读 boolean canRead = file.canRead(); System.out.println("可读:"+canRead); //查看文件是否可写 boolean canWrite = file.canWrite(); System.out.println("可写:"+canWrite); //查看文件是否隐藏 boolean isHidden = file.isFile(); System.out.println("是否隐藏:"+isHidden); //查看最后修改文件时间 long time = file.lastModified(); System.out.println("最后修改时间:"+time); //转换时间格式输出 SimpleDateFormat sdf = new SimpleDateFormat("yy-MM-dd HH:mm:ss"); Date date = new Date(time); System.out.println("最后修改时间:"+sdf.format(date)); } } /* 运行结果: 文件名:filedemo.txt 文件有11个字节 可读:true 可写:true 是否隐藏:true 最后修改时间:1496414987501 最后修改时间:17-06-02 22:49:47 */
案例3:删除目录
要求:判断目录是否存在,存在则删除
import java.io.File; public class FileDeleteDemo { public static void main(String[] args) { File file = new File("dira"); if(file.exists()){ file.delete(); //使用delete删除目录时,要求该目录必须是空目录才能删除 System.out.println("删除文件完毕"); }else{ System.out.println("文件不存在"); } } }
案例4:删除非空目录
import java.io.File; public class FileDeleteDemo { public static void main(String[] args) { File file = new File("dirdemo"); if(file.exists()){ file.delete(); System.out.println("删除文件完毕"); }else{ System.out.println("文件不存在"); } boolean b = file.exists(); //存在是true,不存在是false System.out.println("文件是否真的删除:"+!b); //文件还存在,并没有真被删除 } } /* 运行结果: 删除文件完毕 文件是否真的删除:false */
案例5:判断文件是否存在不存在就创建
import java.io.File; import java.io.IOException; public class File_createNewFile { public static void main(String[] args) throws IOException { File file = new File("a.txt"); if(!file.exists()){ file.createNewFile(); System.out.println("文件创建完毕"); }else{ System.out.println("文件已存在"); } } }
案例6:删除文件或非空目录方法
import java.io.File; /** * 思路: * 1.先获取该目录的子项 * 2.判断子项是文件还是目录 * 3.是文件就删除,是目录就继续获取子项 * 4.直到最后一个空目录为止 */ public interface FileDeleteDemo02 { public static void main(String[] args) { File file = new File("dirdemo"); fileDelete(file); } public static void fileDelete(File file){ //删除文件方法 if(file.isDirectory()){ //如果是目录就获取子项 File[] subs = file.listFiles(); for(File sub:subs){ fileDelete(sub); } } file.delete(); //如果是文件(不是目录)就删除 } } //这里用到了递归方法
案例7:获取当前目录的子项分别输出目录和文件
import java.io.File; public class File_listFiles { public static void main(String[] args) { File file = new File("."); //.代表当前路径 File[] subs = file.listFiles(); for(File sub:subs){ if(sub.isFile()){ System.out.print("文件:"); } if(sub.isDirectory()){ System.out.print("目录:"); } System.out.println(sub.getName()); } } } /* 运行结果: 文件:.classpath 文件:.project 目录:.settings 目录:bin 文件:demo.txt 目录:dirdemo1 文件:filedemo.txt 文件:fos.txt 文件:raf.txt 目录:src 目录:test */