一.File 类简介:
File 类是java.io 包下代表与平台无关的文件和目录,也就是说希望在程序中操作文件和目录都可以通过File 类来完成。但是File 不能访问文件内容本身,如果需要访问文件内容本身,则需要使用
输入\输出流。
作用:
1、用来将文件或者文件夹封装成对象。
2、方便对文件与文件夹进行操作。
3、File 对象可以作为参数传递给流的构造函数。
二.File 类常见方法:
1、创建:
> boolean createNewFile() : 在指定位置创建文件,如果文件已经存在,则不创建,返回false和输出流不一样,输出流对象一创建文件,而且文件已经存在,会覆盖原来的文件。
> boolean mkdir() : 创建此抽象路径名指定的目录,如果成功则返回true。只能创建一级目录。
> boolean mkdirs() : 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录,如果成功则返回true。 创建多级文件。
1 import java.io.*; 2 public class FileDemo { 3 public static void main(String[] args) throws IOException { 4 CreateMethod() ; 5 } 6 public static void CreateMethod() throws IOException { 7 // 在D盘下创建一个 a.txt, 如果 a.txt 存在,则返回false , 否则返回true 。 8 File f = new File("D:\\a.txt") ; 9 System.out.println(f.createNewFile()); 10 // 在D盘下创建目录 11 File f1 = new File("D:\\abc") ; 12 System.out.println(f1.mkdir()); 13 // 在D盘下创建多级目录 14 File f2 = new File("D:\\jfe\\adf\\afe\\afe") ; 15 System.out.println(f2.mkdirs()); 16 } 17 18 // 创建File 对象 19 public static void ConsMethod() { 20 // 将a.txt封装成File对象。 21 File f1 = new File("D:\\abc\\a.txt") ; 22 23 // File(String parent, String child) 24 // 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 25 File f2 = new File("D:\\abc" , "a.txt" ) ; 26 27 // File(File parent, String child) 28 // 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 29 File f3 = new File(new File("D:\\abc") , "a.txt") ; 30 31 // static String separator 32 // 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。 33 File f4 = new File("D:"+File.separator+"abc"+File.separator+"a.txt") ; 34 35 System.out.println("f1:" + f1); 36 System.out.println("f2:" + f2); 37 System.out.println("f3:" + f3); 38 System.out.println("f4:" + f4); 39 } 40 }
2、删除:
> boolean delete() : 删除指定文件。删除成功则返回true,否则返回false。
> void deletOnExit() : 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录 。
注意:如果有些文件在使用完后,便要被删除,但是为了防止运行过程中出现了异常,则可以使用 deletOnExit() 方法进行删除。
1 public class FileDemo { 2 public static void main(String[] args) throws IOException { 3 DelMethod() ; 4 } 5 // 删除操作: 6 public static void DelMethod() throws IOException { 7 File f = new File("D:\\a.txt") ; 8 9 f.createNewFile() ; 10 f.deleteOnExit() ; 11 } 12 }
注意:而 deleteOnExit() 方法则应该在文件被创建完后调用。
3、获取信息:
> String getName() : 返回由此抽象路径名表示的文件或目录的名称。
> String getPath() : 返回此File 对象对应的路径名。
> String getParent() : 返回次File 对象对应(最后一级子目录)的父目录名。
> String getAbsolutePath() :返回此抽象路径名的绝对路径名字符串。
> File getAbsolutePath() : 返回File 对象所对应的绝对路径所对应的File 对象。
> long length() : 返回文件类容的长度。
> long lastModified() : 返回文件的最后修改时间。
> boolean renameTo(File newName) : 重新命名此File 对象对应的文件或目录,如果重命名成功则返回true,否则返回false。
1 public class FileDemo { 2 public static void main(String[] args) throws IOException { 3 GetMessage() ; 4 } 5 // 获取操作: 6 public static void GetMessage() throws IOException { 7 File f1 = new File("D:\\a.txt") ; 8 f1.createNewFile() ; 9 10 File f2 = new File("D:\\adf\\daf\\dwq") ; 11 f2.mkdirs() ; 12 // 返回文件名或目录名 13 System.out.println("f1 = " + f1.getName() + " f2 = " + f2.getName()); 14 // 打印结果: f1 = a.txt f2 = dwq 15 16 System.out.println("f1 = " + f1.getPath() + " f2 = " + f2.getPath()); 17 // 打印结果: f1 = D:\a.txt f2 = D:\adf\daf\dwq 18 19 System.out.println("f1 = " + f1.getParent() + " f2 = " + f2.getParent()); 20 // 打印结果: f1 = D:\ f2 = D:\adf\daf 21 22 System.out.println("f1 = " + f1.getAbsolutePath() + " f2 = " + f2.getAbsolutePath()); 23 // 打印结果: f1 = D:\a.txt f2 = D:\adf\daf\dwq 24 25 System.out.println("f1 = " + f1.length() + " f2 = " + f2.length()); 26 } 27 }
4、判断:
> boolean exists() : 判断 File 对象对应的文件或目录是否存在。
> boolean canWrite() : 判断File 对象对应的文件或目录是否可写。
> boolean canRead() : 判断File 对象对应的文件或目录是否可读。
> boolean isFile() : 判断File 对象对应的是否是文件,不是目录。
> boolean isDirectory() : 判断File 对象对应的是否是目录,不是文件。
> boolean isAbsolute() : 判断File 对象对应的文件或目录是否是绝对路径。
三.文件列表:
练习:列出指定目录下文件或者文件夹,包含子目录中的内容。即列出指定目录下所有内容。
> static File[] listRoots() : 列出可用的文件系统根。列出电脑的有效盘符。
> String[] list() : 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
注意: 调用list() 方法的File 对象必须是封装了一个目录,该目录还必须存在。
> File[] listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
注意:抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件和目录。如果目录为空,那么数组也将为空。如果抽象路径名不表示一个目录,或者发生 I/O 错误,则返回 null
。
1 public class FileDemo2 { 2 public static void main(String[] args) { 3 ListFileDemo( new File("D:\\workspace\\heima") , 0 ) ; 4 } 5 // 增加层次感 6 public static String getLevel(int level) { 7 StringBuilder sb = new StringBuilder() ; 8 sb.append("|--") ; 9 for (int i = 0 ; i < level ; ++i) { 10 sb.insert(0,"| ") ; 11 } 12 return sb.toString() ; 13 } 14 public static void ListFileDemo (File f ,int level) { 15 System.out.println(getLevel(level) + f); 16 // File 目录下的所有文件或文件夹 17 File[] arrFile = f.listFiles() ; 18 // 遍历arr[]数组: 19 for(File name : arrFile) { 20 // 如果 是文件夹,则继续递归 21 if ( name.isDirectory()) { 22 ListFileDemo(name , level++) ; 23 } 24 else 25 System.out.println( getLevel(level)+ name); 26 } 27 } 28 }
步骤:
1、打印出当前文件路径。
2、列出File对象下是否有文件,没有则返回null , 有则遍历。
3、判断arrFile[] 中元素是否是文件夹,是则调用ListFileDemo 方法,进行递归。
4、否则打印出绝对路径加文件名。
练习:删除一个带内容的目录。
原理:先把最里面的文件删了,再一层一层往外删。
1 public class FileDemo2 { 2 public static void main(String[] args) { 3 DelFileDemo(new File("D:\\heima")) ; 4 } 5 public static void DelFileDemo(File f) { 6 // File 目录下的所有文件或文件夹 7 File[] arrFile = f.listFiles() ; 8 // 遍历arr[]数组: 9 for(File name : arrFile) { 10 // 如果 是文件夹,则继续递归 11 if ( name.isDirectory()) { 12 DelFileDemo(name) ; 13 } 14 else 15 name.delete() ; 16 } 17 f.delete() ; 18 }
删除和打印文件类似。如果是文件,则删除;否则,递归至最深处,一层一层的往外删除。
练习:将一个指定目录下的Java文件的绝对路径,存储到一个文本文件中。建立一个Java文件列表文件。
思路:
1、对指定的目录进行递归。
2、获取递归过程所有的Java文件的路径。
3、将这些路径存储到集合中。
4、将集合中的文件路径写到文件中。
1 public class FileDemo2 { 2 public static void main(String[] args) { 3 List<File> list = new ArrayList<File>() ; 4 File f = new File("D:\\workspace\\heima") ; 5 FileToList(f,list) ; 6 7 WriteToFile(list,"D:\\java.txt") ; 8 } 9 // 筛选函数。 10 public static void FileToList(File f , List<File> list) { 11 12 File[] arrFiles = f.listFiles() ; 13 for(File file : arrFiles ){ 14 if(file.isDirectory()) { 15 FileToList(file,list) ; 16 } 17 else { 18 if (file.getName().endsWith(".java")) 19 list.add(file) ; 20 } 21 } 22 } 23 // 将列表中的Java文件路径写如到指定文件中。 24 public static void WriteToFile(List<File> list , String file) { 25 BufferedWriter bw = null ; 26 try { 27 bw = new BufferedWriter(new FileWriter(file)) ; 28 29 for (File fileList : list ) { 30 bw.write(fileList.getAbsolutePath()) ; 31 bw.newLine() ; 32 bw.flush() ; 33 } 34 } 35 catch(Exception e) { 36 } 37 finally { 38 try { 39 if (bw != null) 40 bw.close() ; 41 } 42 catch(Exception e) { 43 } 44 } 45 } 46 }
对于筛选有下面一个方法:
> String[] list(FilenameFilter filter) 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。
FilenameFilter 实现此接口的类实例可用于过滤器文件名。即充当一个过滤器,筛选出满足条件的文件。需要复写 boolean accept(File dir , String name) ; 方法。
1 import java.io.*; 2 public class ListFile { 3 public static void main(String[] args ) { 4 File f = new File ("D:\\workspace\\heima\\src\\jihe") ; 5 6 String[] str = f.list(new FilenameFilter() { 7 public boolean accept(File dir , String name) { 8 File[] files = dir.listFiles() ; 9 for(File file : files){ 10 if (file.isFile()) { 11 if (file.getName().endsWith(".java")) ; 12 return true ; 13 } 14 return false ; 15 } 16 return false ; 17 } 18 }) ; 19 for (String name : str) { 20 System.out.println(name); 21 } 22 } 23 }