File类:
- 用来将文件或者文件夹封装成对象
- 方便对文件与文件夹的属性等信息进行操作(因为流只能操作文件中的数据)
- File对象可以作为参考传递给流的构造函数
上下级文件夹之间使用分隔符分开:
在Windows中分隔符为‘’ ,在Unix/Linux中分隔符为‘/’
跨平台分隔符:专业的做法是使用File.separatorChar,这个值会根据系统得到的相应的分隔符。
例:new File("c:"+File.separatorChar+"a.txt");
注意,如果是使用“” ,则需要进行转义,写为“\”才可以
绝对路径与相对路径:
绝对路径:c:htmldemo.txt
相对路径:demo.txt
对于UNIX平台,绝对路径名的前缀是"/"。相对路径名没有前缀。
对于Windows平台,绝对路径名的前缀由驱动器号和一个":"组成,例"c:\..."。相对路径没有盘符前缀。
相对路径:
相对路径是指相对于某位置的路径,是指相对于当前目录。
在执行Java程序时,相对路径为执行java命令时当前所在的目录。
1.构造方法
【代码演示】
1 import java.io.File; 2 public class FileDemo { 3 public static void main(String[] args) { 4 //构造函数File(String pathname) 5 File f1=new File("a.txt"); 6 //将a.txt封装成对象。(注意:既可以封装已存在的对象,也可以封装不存在的对象 7 System.out.println(f1);//(注意上面对象封装的是什么就打印什么) 8 9 //构造函数File(String parent,String child) 10 String parent="C:\html\test"; 11 String child="demo.txt"; 12 File f2=new File(parent,child); 13 System.out.println(f2); 14 15 //构造函数File(File parent,String child) 16 File parent1=new File("c:\html\test"); 17 String child1="java"; 18 File f3=new File(parent1,child1); 19 System.out.println(f3); 20 21 File f4=new File("c:\html\test\demo.txt"); 22 //由于"c:\html\test\demo.txt"代码不跨平台,在Windows中支持,在linux中却不支持 23 //所以建议用separator代替\ 24 File f5=new File("c:"+File.separator+"html"+File.separator+"test"+File.separator+"demo.txt"); 25 System.out.println(f5); 26 System.out.println(f4); 27 } 28 }
2.File对象的常见方法
创建:boolean createNewFile():在指定位置创建文件,如果是第一次创建,返回ture,如果是第二次创建文件,由于该文件已存在,则不创建文件并返回false。
注意这与流对象是不同的,在流对象中创建的文件已存在时,会覆盖已存在的文件。
static File createTempFile(String prefix,String suffix):在默认临时文件目录中创建一个空文件。运行时创建,运行完即删除。
static File createTempFile(String prefix,String suffix,File directory):重载,在指定目录创建临时文件。
boolean mkdir():在指定位置创建一级目录(文件夹)。
boolean mkdirs():在指定位置创建多级目录。
删除:boolean delete():删除文件或目录,删除成功返回true,删除失败返回false。
boolean deleteOnExit():该方法实在程序运行完时,删除指定文件。
判断:
boolean exists():判断该文件或目录是否存在,若存在则返回true,不存在则返回false。
bollean isFile():判断是否为文件。
boolean isDirectory():判断是否为目录。
boolean isHidden():判断是否为隐藏文件。
boolean canExecute():测试该文件是否可执行。
boolean canRead():测试该文件是否可读。
获取:getName():获取名字
length():获取文件的长度
lastModified():获取文件最后一次修改时间
getPath():获取对象封装时的路径
getParent():获取父目录的路径
getAbsoluteFile():获取绝对路径(以File的形式返回)
getAbsolutePath():获取绝对路径(以String的形式返回)
boolean renameTo(File dest):重新命名。
eg: File f1=new File("c:\test.java");
File f2=new File("c:\haha.java");
f1.renameTo(f2);
//将test文件从f1的位置(c盘中)的移到f2的位置(c盘),并改名为f2的名(haha.txt)
eg: File f1=new File("c:\test.java");
File f2=new File("d:\haha.java");
f1.renameTo(f2);
//将test文件从f1的位置(c盘中)的移到f2的位置(D盘),并改名为f2的名(haha.txt)
【代码演示】File对象的常用方法。
1 import java.io.File; 2 import java.io.IOException; 3 4 public class FileFuntionDemo { 5 public static void main(String[] args) throws IOException { 6 String parent="C:\html\test"; 7 String child="funtion.txt"; 8 File f=new File(parent,child); 9 System.out.println(f); 10 11 System.out.println("第一次创建文件:"+f.createNewFile()); 12 //此次为第一次创建文件,则返回true 13 System.out.println("第二次创建文件:"+f.createNewFile()); 14 //此次为第二次创建文件,由于该文件已存在,则不创建文件并返回false。 15 // 注意这与流对象是不同的,在流对象中创建的文件已存在时,会覆盖已存在的文件。(覆盖的原理是删除已有的,创建新的) 16 /** 17 * f.mkdir();//创建目录 18 * f.mkdirs();//创建多级目录 19 * 要注意:创建的是文件还是目录是由创建方法决定的。 20 * 即使封装的对象是"funtion.txt",但只要使用的是mkdir()方法,创建出来的就是目录。 21 * 22 */ 23 24 //System.out.println("删除文件:"+f.delete()); 25 /** 26 * 这个删除是有缺陷的,当前面代码出现异常时,执行不到这句时,就会造成文件删除失败 27 * 即使放在try语句的finally中,也是无法执行成功的,因为文件在运行过程中是不允许删除的 28 * 所以就出现了:deleteOnExit(),该方法是在程序运行完时,删除指定文件。 29 */ 30 System.out.println("获取名字:"+f.getName()); 31 System.out.println("获取文件长度:"+f.length()); 32 System.out.println("获取文件最后一次修改的时间:"+f.lastModified()); 33 System.out.println("获取文件对象路径:"+f.getPath());//传进来什么打印什么 34 System.out.println("获取父目录的路径:"+f.getParent());//该方法返回的是绝对路径中的父目录,如果获取的是相对路径,则返回null 35 System.out.println("获取目录的绝对路径:"+f.getAbsolutePath());//绝对路径,即使文件不存在 36 System.out.println("判断文件是否存在:"+f.exists());//注意在判断该文件对象是文件还是目录时,要先判断其是否存在。 37 System.out.println("判断文件是否为文件:"+f.isFile()); 38 System.out.println("判断文件是否为目录:"+f.isDirectory()); 39 System.out.println("判断文件是否为隐藏文件:"+f.isHidden()); 40 System.out.println("判断文件是否可执行:"+f.canExecute()); 41 System.out.println("判断文件是否可读:"+f.canRead()); 42 43 } 44 }
运行结果:
【代码演示】list()方法,listFiles()方法和list(FilenameFilter filter)方法的区别。
1 import java.io.File; 2 import java.io.FilenameFilter; 3 public class FileDemo2 { 4 public static void main(String[] args) { 5 File f=new File("c:\html\test"); 6 //调用list()方法的File对象必须是封装了一个目录,且该目录还必须存在。否则会报空指针异常。 7 String[] names=f.list();//返回的是指定目录下的所有文件或目录(以相对路径的形式) 8 for (String name:names) { 9 System.out.println(name); 10 } 11 File[] fname=f.listFiles();//返回的是指定目录下的所有文件或目录(以File对象的形式:绝对路径) 12 for(File name:fname){
System.out.println(name);
} 13 FilenameFilter filter=new FilenameFilter() { 14 @Override 15 public boolean accept(File dir, String name) { 16 /** 17 * dir指的是该File对象封装的目录,name指的是遍历的File对象封装的目录下的各个子目录(可能是文件,也可能是目录) 18 */ 19 return name.contains("n.txt");//返回文件中包含“n.txt”字段的文件 20 } 21 }; 22 String[] spname=f.list(filter); //该方法具有过滤功能,返回的是符合accept方法中的条件的文件。 23 for (String name:spname) { 24 System.out.println(name); 25 } 26 } 27 }
运行结果:
【代码演示】打印出指定目录下的所有文件,包括所有子目录。
1 import java.io.File; 2 import java.util.Scanner; 3 4 public class digun { 5 public static void main(String[] args) { 6 Scanner in=new Scanner(System.in); 7 System.out.println("请指定目录:"); 8 String name=in.nextLine(); 9 File file=new File(name); 10 showAllDir(file); 11 } 12 public static void showAllDir(File file){ 13 System.out.println(file); 14 File[] filesname=file.listFiles(); 15 for (File name:filesname) { 16 if (name.isDirectory()){ 17 showAllDir(name); 18 }else { 19 System.out.println(name); 20 } 21 } 22 return; 23 } 24 }
运行结果:
【代码演示】打印出指定目录下的所有符合条件的文件或目录,包括所有子目录中的。
1 import java.io.File; 2 import java.util.ArrayList; 3 import java.util.Scanner; 4 5 public class digun { 6 static ArrayList arrayList=new ArrayList(); 7 static String ff; 8 public static void main(String[] args) { 9 Scanner in=new Scanner(System.in); 10 System.out.println("请指定目录:"); 11 String name=in.nextLine(); 12 System.out.println("过滤条件:"); 13 ff=in.nextLine(); 14 File file=new File(name); 15 showAllDir(file); 16 for (int i = 0; i <arrayList.size() ; i++) { 17 System.out.println(arrayList.get(i)); 18 } 19 } 20 public static void showAllDir(File file){ 21 File[] filesname=file.listFiles(); 22 for (File name:filesname) { 23 if(name.getName().contains(ff)){ 24 arrayList.add(name); 25 } 26 if (name.isDirectory()){ 27 showAllDir(name); 28 } 29 } 30 return; 31 } 32 }
运行结果:
【代码演示】以树状的形式打印出指定目录下的文件。
1 import java.io.File; 2 import java.util.Scanner; 3 4 public class TreeDirectory { 5 public static void main(String[] args) { 6 Scanner in=new Scanner(System.in); 7 System.out.println("请输入指定的目录:"); 8 String filename=in.nextLine(); 9 File file=new File(filename); 10 showTreeDir(0,file); 11 } 12 13 public static String level(int level){ //根据层级数,打印该层的前缀 14 StringBuilder sb=new StringBuilder(); 15 for (int i=0;i<level;i++){ 16 sb.append(" "); 17 } 18 sb.append("|---"); 19 return sb.toString(); 20 } 21 public static void showTreeDir(int level,File file){ 22 level++; //先将上级目录的层级数加一,变成此目录的层级数 23 System.out.println(level(level)+file.getName());//然后将调用该方法的层目录打印出来 24 File[] names=file.listFiles();//将该层目录下的子目录或文件返回来,存储到names数组中 25 for (int i = 0; i <names.length ; i++) { //对各个子目录进行遍历 26 if (names[i].isDirectory()){ //如果是目录,则继续调用showTreeDir方法,并将此层目录的层级数传递给子目录 27 showTreeDir(level,names[i]); 28 }else {//如果是文件,则将文件名打印出来 29 System.out.println(level(level+1)+names[i].getName()); 30 } 31 } 32 } 33 } 34
运行结果:
【代码演示】如何删除一个带内容的目录。
1 import java.io.File; 2 import java.util.Scanner; 3 4 public class FileDelete { 5 public static void main(String[] args) { 6 Scanner in=new Scanner(System.in); 7 System.out.println("请输入所要删除的目录:"); 8 String filename=in.nextLine(); 9 File file=new File(filename); 10 removeDir(file); 11 } 12 public static void removeDir(File file){ 13 File[] subfiles=file.listFiles(); 14 //此方法返回的是该层目录的子目录,如果存在子目录,则将子目录存放在一个数组中,然后返回数组的引用,如果不存在子目录,则返回null 15 if (subfiles==null){ //当数组为空时,说明不存在子目录,则直接删除此目录。 16 //所以此处判断数组是否为空时,应用subfiles==null来判断,如果用subfiles.length==0判断会报空指针异常 17 System.out.println(file.delete()); 18 }else { //当数组不为空时,说明存在子目录,则应该先删除子目录。 19 for (int i = 0; i <subfiles.length ; i++) { 20 removeDir(subfiles[i]); 21 } 22 System.out.println(file.delete());//所有子目录删除后,再将此目录删除 23 } 24 } 25 }
注意:Java删除不经过回收站。