初次接触Java IO的时候,我有一种措手不及的感觉,因为这个类库中的类实在是太多了!并且如果我们想要使用一个类对象进行输入输出,可能还需要创建其它几个类的对象,实在是很麻烦。在这篇文章中我试图对Java IO类库进行一个梳理,总结一下几种常用的IO类组合。文章分为三个部分:1.Java操作目录的File类;2.Java经典的输入输出流;3.java的标准输入输出;4.”特立独行”的RandomAccessFile类。
一.Java操作文件/目录的File类
File(文件)这个类名有一定的误导性,我们有可能会觉得它代表的是文件,但实际上File类代表的是与平台无关的目录和文件。也就是说,如果希望在程序中操作文件和目录都可以通过File类来完成。值注意的是:File类能够新建,删除,重命名文件和目录,也可以判断所给的路径是文件还是目录,但是,File类是不能访问文件内容本身的;也就是说如果我们要向文件中写入内容或则读取文件中的内容,都必须使用输入/输出流。
我们可以使用文件路径字符串来创建File类对象,这个路径可以是绝对路径,也可以是相对路径;所谓的相对路径,指的是相对于当前java虚拟机运行时所在的路径。File类对应的操作不是很多,下面这份演示代码展示了大多数的用法(我是在Ubuntu下进行的测试,所以使用的路径与windows是不一样的):
package lkl;
import java.io.*;
public class FileTest {
public static void main(String[] args) throws IOException{
File path = new File("/Test");
///取得文件名
System.out.println(path.getName());
///返回该File对象所对应的目录的父目录
System.out.println(path.getParent());
//获取绝对路径
System.out.println(path.getAbsolutePath());
//在当前路径下创建一个临时文件
File tmpFile = File.createTempFile("aaa", ".txt",path);
///指定退出JVM时,删除该文件
tmpFile.deleteOnExit();
///以当前系统时间作为新文件名来创建新文件
File newFile = new File(System.currentTimeMillis()+"");
System.out.println("newFile对象是否存在:"+newFile.exists());
//以指定的newFile对象创建一个文件
newFile.createNewFile();
//以newFile对象来创建一个目录,因为newFile已经存在
//所以下面的方法返回false
newFile.mkdir();
//使用list()列出当前路径下的所有文件和路径
System.out.println("====当前路径下的所有文件和路径如下====");
String[] list=path.list();
for(String fileName : list){
System.out.println(fileName);
}
//listRoots()静态方法可以列出所有的磁盘根路径
///返回的是File对象而不是String对象
System.out.println("===系统的所有根路径如下===");
File[] roots = File.listRoots();
for(File fi : roots){
System.out.println(fi);
}
}
}/*
Test
/
/Test
newFile对象是否存在:false
====当前路径下的所有文件和路径如下====
test.txt~
test.txt
a.java
ss.zip.info
a.class
aaa9141834113211816485.txt
lkl
ss.zip
java
obj.txt
===系统的所有根路径如下===
/
*/
我们注意到上面的代码中存在一个list()方法,这个方法用来列出当前路径下的所有文件和目录,但是有时候我可能需要只列出满足某些条件的文件和目录而不是所有,这时候我们就需要用到Java的”文件过滤器”的功能了。具体的来讲就是可以向list()中传入一个FilenameFilter的参数,通过该参数就可以只列出符合要求的文件。FilenameFilter是一个接口,我们要实现它的话,就要实现它的accept(File dir,String name)方法;list()会为此目录对象下的每个文件名调用accept(),来判断该文件是否包含在内,判断结果由accept()返回的布尔值表示。另外,accept()中使用的正则表达式就是我们自己传进去的规则。如下面这份代码:
package lkl;
import java.io.*;
import java.util.*;
import java.util.regex.Pattern;
//这次用内部类的形式实现FilenameFilter接口
public class DirList1 {
///传给匿名内部类的参数应该是final类型的
private static FilenameFilter filter(final String regex){