IO这一部分内容还是比较多的,对于基础的枯燥但是又重要的内容还是将它记下来比较好。
关于File类
Ø File类直接继承与Object类,File类描述了文件本身的一些属性,File类用来获取或者处理与磁盘上的文件相关的信息,例如文件权限、文件创建时间、文件路径等等,File类还可以用来浏览目录的层次结构。
Ø 一个File类对象表示磁盘上的文件或目录(目录也是一种特殊的文件)
Ø File类提供了一个与平台无关的方法,只可直接对磁盘上的文件或者目录进行操作,屏蔽了底层的相关技术。
Ø File类可以直接处理文件或者文件系统。
Ø File类并没有指定是从文件中读出信息还是将信息写入到文件中。
常用的构造方法:
File(String str) str表示文件的路径,在Java中对于Windows系统而言,比如这个路径: “D:Javajdk6”在windows系统中,路径的分隔符都使用‘’这个和java中的转义字符一样了,因此要写成“\”才能恢复本身的字符‘’的功能。对于Linux的系统而言,文件路径之间的分隔符采用的是“/”左斜杠,这就不存在使用转移字符的问题了。对于从windows系统变到Linux系统上的Java程序,文件路径一定要对应地进行调整。
File(File parent,String str)这个表示在父目录parent下(parent在这里是一个目录文件),创建一个名为str的文件。只要是前后两部分拼接起来构成一个完整的文件路径就OK了。
File类一些常用的函数的示例:
package com.file.fileMethod; import java.io.File; import java.io.FilenameFilter; public class methodTest { public static void main(String[]args){ File file=new File("F:\filetest1\filetest2\filetest3"); System.out.println(file.isDirectory()); System.out.println(file.isFile()); //要是父目录没有生成的话 就会报错 System.out.println(file.mkdir()); //即使父目录没有 也会与多级目录一起 一并生成 System.out.println(file.mkdirs()); //List方法 列出当前目录下所有的子文件 以及子目录 String[]names=file.list(); for(String name:names){ System.out.println(name); } //listFile方法 返回一个File数组 数组中的每个元素都是一个File对象 这样操作起来更容易 File[]files=file.listFiles(); for(File everyfile:files){ System.out.println(everyfile.getName()); } //getparent返回父类的File对象(String) System.out.println(file.getParent()); //获取固定类型的文件 比如固定的后缀的 //法一:使用list方法获取文件名数组 利用endwith判断结尾 String[]names2=file.list(); for(String name:names2){ if(name.endsWith(".java")){ System.out.println(name); } } //法二:有点类似于策略模式 主要是实现accept方法 需要先定义一下 FilenameFilter类 这里通过内部类的方式来实现 //在方法的参数声明的地方 直接传入一个类的实例 String[]names3=file.list(new FilenameFilter(){ public boolean accept(File dir,String name){ if(name.endsWith(".java")) return true; else return false; } }); //delete方法 用于删除目录 如果目录中包含文件则没法删除 //要是目录中还设有目录 只能通过递归的方式删除(文件操作中常用的技巧) System.out.println(file.delete()); //自定义deleteall方法 通过递归的方式删除 执行此方法之后filetest2之下 为空 deleteAll(new File("F:\filetest1\filetest2")); } // 删除目录以及其中的文件 (这个是文件操作中比较固定的模式) public static void deleteAll(File file){ //如果是文件 或者为一个空目录 则删除 这个是递归的出口 if(file.isFile()||file.list().length==0){ file.delete(); return; } //往下递归 else{ File[]files=file.listFiles(); for(File f:files){ //递归删除 deleteAll(f); } } return; } }
一个比较典型的题目,有的时候面试也会考到的:创建一个当前目录下的目录树,要求每一层目录都有缩进,并且使得目录排在文件的前面
实现如下:
package com.file.filetree; import java.io.File; import java.util.ArrayList; public class fileTree { public static void main(String[]args){ File directory=new File("F:\test"); traverse(directory,0); } //n表示空格的个数 public static void Print(String str,int n){ //先打印换行符 System.out.print(' '); int i; for(i=0;i<n;i++) {System.out.print(" ");} System.out.print(str); return; } //最简单的排序思路 遍历两次 第一次把目录文件放入 第二次把文件放入 public static File[] sort(File[] files){ ArrayList<File>sorted=new ArrayList<File>(); for(File f:files){ if(f.isDirectory()){ sorted.add(f); } } //再遍历一次 把文件放入 for(File f:files){ if(f.isFile()){ sorted.add(f); } } //将一个Arraylist转化为一个File数组 //方法是先声明一个对应长度的File类型的数组空间 再将这个Arraylist中的内容由toArray方法赋给数组 File[]newfiles=new File[sorted.size()]; sorted.toArray(newfiles); return newfiles; } //递归遍历目录 public static void traverse(File file,int n){ File[]files =file.listFiles(); //当前为文件 或者为空目录 打印 这个判断条件基本上是类似的问题中常常遇到的 if(file.isFile()||files.length==0) { Print(file.getName(),n); return; } else { //先对当前的File对象排一下序 目录放前面 文件放后面 files=sort(files); //如果当前是一个非空的目录 先把当前目录打印了 再递归 Print(file.getName(),n); for(File f:files){ traverse(f,n+20); } } } }
缩进的实现主要是通过对前面输出的空格数目进行控制,对于每一层来说,在输出文件名之前都要输出对应数目的空格。先文件夹,后文件的输出方式也是通过对每一层的非空目录进行简单的排序来实现的。