第15章-输入/输出 --- File类
(一) Java的IO通过java.io包下的类和接口来支持,在java.io包下主要包括输入、输出两种IO流。
每种输入、输出流又分为字节流和字符流两大类:
(1)字节流以字节为单位来处理输入、输出操作
(2)字符流则以字符来处理输入、输出操作
除此之外,Java的IO流使用了一种装饰器设计模式,它将IO流分成底层节点流和上层处理流,其中节点流用于和底层的物理存储节点之间关联---不同的物理节点获取节点流的方式可能存在一定的差异,但程序可以把不同的物理节点流包装成统一的处理流,从而允许程序使用统一的输入、输出代码来读取不同的物理存储节点的资源。
(二)File类
File类是java.io包下代表与平台无关的文件和目录,如果系统程序操作文件和目录都可以通过File类来完成。但是File不能访问文件内容本身,如果需要访问文件内容本身,则需要使用输入/输出流。
(三)访问文件和目录
File类提供了很多方法来操作文件和目录:
1.访问文件名相关的方法:
a. String getName():返回此File对象所表示的文件名或路径名
b. String getPath():返回此File对象所对应的路径名
c. File getAbsoluteFile(): 返回此File对象所对应的绝对路径所对应的File对象
d. String getParent():返回此File对象所对应目录的父目录名
e. boolean rename(File newName):重命名此File对象所对应的文件或目录,如果重命名成功,则返回true,否则返回false
2. 文件检测相关的方法
a. boolean exists():判断File对象所对应的文件或目录是否存在
b. boolean canWrite():判断File对象所对应的文件盒目录是否可写
c. boolean canRead():判断File对象所对应的文件盒目录是否可读
d. boolean isFile():判断File对象所对应的是否是文件,而不是目录
e. boolean isDirectory():判断File对象所对应的是否是目录,而不是文件
f. boolean isAbsolete():判断File对象所对应的文件或目录是否是绝对路径。
3. 获取常规文件信息
a. long lastModified():返回文件的最后修改时间
b. long length():返回文件内容的长度
4. 文件操作相关的方法
a. boolean createNewFile(): 当此File对象所对应的文件不存在时,该方法将新建一个该File对象所指定的新文件,如果创建成功则返回true;否则返回false.
b. boolean delete():删除File对象所对应的文件或路径
5. 目录操作相关的方法
a. boolean mkdir():试图创建一个File对象所对应的目录,如果创建成功,则返回true;否则返回false。调用该方法时File对象必须对应一个路径,而不是一个文件。
b. String[] list():列出File对象的所有子文件名和路径名,返回String数组。
c. File[] listFiles():列出File对象的所有子文件和路径,返回File数组。
d. static File[] listRoots(): 列出系统所有的根路径。
下面举例说明下:
import java.io.File; import java.io.IOException; public class FileTest { public static void main(String[] args) throws IOException { //以当前路径来创建一个File对象 File file = new File("."); //直接获取文件名,输出一点 System.out.println(file.getName()); //获取相对路径的父路径可能出错,下面代码输出null System.out.println(file.getParent()); //获取绝对路径 System.out.println(file.getAbsoluteFile()); //获取上一级路径 System.out.println(file.getAbsoluteFile().getParent()); //在当前路径下创建一个临时文件 File tmpFile = File.createTempFile("aaa", ".txt",file); //指定当JVM退出时删除该文件 tmpFile.deleteOnExit(); //以系统当前时间作为新文件名来创建新文件 File newFile = new File(System.currentTimeMillis() + ""); System.out.println("newFile对象是否存在 : " + newFile.exists()); //以指定newFile对象来创建一个文件 newFile.createNewFile(); //使用list()方法列出当前路径下的所有文件和路径 String[] fileList = file.list(); System.out.println("=====当前路径下所有文件和路径如下====="); for(String fileName : fileList) { System.out.println(fileName); } //listRoots()静态方法列出所有的磁盘根路径 File[] roots = file.listRoots(); System.out.println("=======系统所有根路径如下======="); for(File root : roots) { System.out.println(root); } } }
运行结果:
. null H:\OhMyGod\Test\. H:\OhMyGod\Test newFile对象是否存在 : false =====当前路径下所有文件和路径如下===== .classpath .project .settings 1390727504600 aaa1644796813208724263.txt aaa6169179965396772881.txt bin out.txt props.txt src text.txt =======系统所有根路径如下======= C:\ D:\ E:\ G:\ H:\ I:\ J:\ K:\ L:\ M:\
(四)文件过滤器
在File类的list()方法中可以接收一个FilenameFilter参数,通过该参数可以只列出符合条件的文件。
FilenameFilter接口里包含了一个accept(File dir,String name)方法,该方法将依次对指定File的所有子目录或者文件进行迭代,如果该方法返回true,则list()方法会列出该子目录或者文件。
举例:
import java.io.File; import java.io.FilenameFilter; public class FilenameFilterTest { public static void main(String[] args) { File file = new File("."); String[] nameList = file.list(new MyFilenameFilter()); for(String name : nameList) { System.out.println(name); } } } //实现自己的FilenameFilter实现类 class MyFilenameFilter implements FilenameFilter { @Override public boolean accept(File dir, String name) { return name.endsWith(".java") || new File(name).isDirectory(); } }