包含了以下类和接口:

File类

FileFilter接口

RandomAccessFile类


一、File类


java.io.File用于表示文件(目录),也就是说程序员可以通过File类在程序中操作硬盘上的文件和目录。


File类只用于表示文件或目录的信息(名称,大小等),不能对文件的内容进行访问。


构造方法摘要:


File(File parent, String child)

根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。

File(String pathname)

通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。

File(String parent, String child)

根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。

File(URI uri)

通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例。

/**
* "."代表当前目录,当前类所属项目的根目录
*
* File.separator是一个常量,用于描述不同文件系统中目录层级分割符的。 *Linux 是 / windows 是 \
*
*/
File file = newFile("."+File.separator+"file.txt");//不推荐使用"./file.txt"由于跨平台的关系
/**
* 查看文件或目录相关的内容
*/
//判断文件或者目录是否存在
System.out.println(file.exists());
if(!file.exists()){
    //文件不存在创建
    file.createNewFile();
}
/** 获取文件名*/
System.out.println("文件名:"+file.getName());
/** 获取文件大小*/
System.out.println("文件大小:"+file.length());
/** 文件相对路径*/
System.out.println("文件路径:"+file.getPath());
//文件路径:./file.txt
/** 文件绝对路径*/
System.out.println("文件绝对路径:"+file.getAbsolutePath());
//文件绝对路径:/home/soft01/workSpace/JSD1305_JavaSE/./file.txt
/** 文件系统中描述的路径 去除了有相对路径的 ./ 这样的字符*/
System.out.println("文件系统中描述的路径:"+file.getCanonicalPath());
/** 是文件还是目录*/
System.out.println("是否是文件:"+file.isFile());
System.out.println("是否是目录:"+file.isDirectory());
/** 查看当前文件最后修改日期 */
longtime = file.lastModified();
Date date = newDate(time);
SimpleDateFormat format = newSimpleDateFormat("yy-MM-dd hh:mm:ss");
System.out.println("文件最后修改日期:"+format.format(date));
/** 是否可读可写 可执行文件*/
System.out.println(file.canRead());
System.out.println(file.canWrite());
System.out.println(file.canExecute());
/**
* 创建/删除 文件或目录
* createNewFile() 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件。
* mkdir() 创建此抽象路径名指定的目录。
* mkdirs() 创建此抽象路径名指定的目录,包括所有必需但不存在的父目录。
* delete() 删除此抽象路径名表示的文件或目录。
* deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。
*/
File dir = newFile("demo/demo1");//在根目录下不用 "."
if(!dir.exists()) {
    dir.mkdirs();
}
System.out.println(dir.getCanonicalPath());
// /home/soft01/workSpace/JSD1305_JavaSE/demo/demo1
if(dir.exists()){
dir.delete();//确保目录是空的
}
/**
* 查看目录内容
* String[] list() 返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。
* String[] list(FilenameFilter filter) 返回一个字符串数组,这些字符串指定此抽象路径名
* 表示的目录中满足指定过滤器的文件和目录。
* File[] listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
* File[] listFiles(FileFilter filter) 返回抽象路径名数组,这些路径名表示此抽象路径名表示
* 的目录中满足指定过滤器的文件和目录。
* File[] listFiles(FilenameFilter filter)返回抽象路径名数组,这些路径名表示此抽象路径名表示
* 的目录中满足指定过滤器的文件和目录。
* static File[] listRoots() 列出可用的文件系统根。
*/
/** 列出当前根目录下的目录或文件*/
File f = newFile(".");
String[] dirs = f.list();
for(inti = 0; i < dirs.length; i++)
System.out.println(dirs[i]);


二、FileFilter接口


是一个接口,里面必须实现一个抽象方法accept用来定义过滤文件的规则。


此接口的实例可以传递给File类的listFilter(FileFilter)方法。


File[] listFiles(FileFilter filter) 返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。


FileFilter filter = newFileFilter() {
    @Override
    publicbooleanaccept(File file) {
        //过滤器之获取文件 是文件,并且是以txt结尾的文件
        booleanbf = file.isFile()&&file.getName().lastIndexOf(".txt")!=-1;
        returnbf;
    }
};
File file = newFile("./");
File[] subs = file.listFiles(filter);
for(File sub : subs) {
    System.out.println(sub.getName());
}


这种通过调用某个方法并传入一个实例,在该方法中又调用我们传入的实例的某个方法的模式称为[回掉模式]。


swing中使用的监听器 也是典型的回掉模式。


三、RandomAccessFile类

文件在硬盘上都是以byte by byte 存储的。是数据的集合。

打开文件:

有两种模式:“rw(读写)”和“r(只读)”

RandomAccessFile raf = new RandomAccessFile();

打开文件时候默认文件指针在开头pointer=0

写入方法:

raf.write(int) 可以将整数的“低八位”写入到文件中,同时指针自动移动到下一个位置,准备再次写入。

读取文件:

int b=raf.read()从文件中读取一个byte(8位)填充到int的低八位,高24位为0,返回值范围正数0~255,如果返回-1表示读取到了文件末尾,每此读取后自动移动文件指针,准备下一次读取。


读写文件完毕后一定要关闭文件。


RandomAccessFile 当文件不存在时候,会自动创建文件。


File file = newFile("file.txt");
    if(!file.exists()){
    file.createNewFile();
}
/** 以读写的形式打开文件 */
RandomAccessFile raf = newRandomAccessFile(file,"rw");
/**向文件中写数据
* 调用 write(int d)方法
* 只写一个字节 低8位
*/
raf.write('A');
raf.write('B');
intmax = 0x7fffff;
/**
* 因为write(int b)方法只能一次写入一个字节
* 所以要将一个int值写入文件,需要连续写4次。
*
* int 最大的二进制
* 01111111 11111111 11111111 11111111
*
* 要把高八位移到低八位来存储,用移位操作,移动24位
* int>>>24
* 00000000 00000000 00000000 01111111 第一次
* int>>>16
* 00000000 00000000 01111111 11111111 第二次
* int>>>8
* 00000000 01111111 11111111 11111111 三次
* 最后一次移动0位就相当于不移动
*/
raf.write(max>>>24);//00 00 00 7f
raf.write(max>>>16);//00 00 7f ff
raf.write(max>>>8); //00 7f ff ff
raf.write(max); //7f ff ff ff
/** JDK提供了基于基本类型的写入方法,其内部也是通过移位来实现的。
* 如:writeInt(int v) writeLong(long v)
*/
raf.writeInt(max);
/** write(byte[] data) */
String info = "你好Java!";
raf.write(info.getBytes("gbk"));
System.out.println(raf.length());//输出有多少字节
raf.close();

1、基于缓存的写方法


write(byte[] b) 将 b.length 个字节从指定 byte 数组写入到此文件,并从当前文件指针开始。

write(byte[] b, int off, int len) 将 len 个字节从指定 byte 数组写入到此文件,并从偏移量 off 处开始。


2、基于缓存读取方法


int read():一次读取一个字节,返回存放的是读取到一个字节,若到了文件末尾返回为-1。


EOF:end of file


int read(byte[] b)将最多 b.length 个数据字节从此文件读入 byte 数组。

int read(byte[] b, int off, int len)将最多 len 个数据字节从此文件读入 byte 数组。


File file = newFile("file.txt");
/** 以读写的形式打开文件 */
RandomAccessFile raf = newRandomAccessFile(file,"rw");
inta = raf.read();
System.out.println(a);//读取的是-1,说明到文件末尾。说明文件中没有内容
/** 指针位置*/
System.out.println("指针位置:"+raf.getFilePointer());
/**
* 原因:
* RandomAccessFile是根据游标进行读写操作的。
* 要将游标移动到文件开始位置,才能重新开始读取文件内容。
*
* 移动游标的方法:seek(int index)
* 移动到指定位置,0代表文件开始的第一个字节。
*/
raf.seek(0);
System.out.println("指针位置:"+raf.getFilePointer());
a = raf.read();
System.out.println((char)a);
raf.close();


3、随机读写方法


seek(long pos) 设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。

int skipBytes(int n) 尝试跳过输入的 n 个字节以丢弃跳过的字节。


File file = newFile("f.txt");
if(!file.exists()){
    file.createNewFile();
}
/** 以读写的形式打开文件 */
RandomAccessFile raf = newRandomAccessFile(file,"rw");
raf.write("我爱Java,I Love Java,路慢慢。".getBytes("GBK"));
//读取
byte[] s = newbyte[31];
/** int read(byte[] array)
* 将最多 array.length 个数据字节从此文件读入 byte 数组。
* 返回是实际读取到的字节数,
*/
raf.seek(0);
//raf.skipBytes(4);//试跳过输入的 n 个字节以丢弃跳过的字节。
inta = raf.read(s);
System.out.println("读取到的字节是:"+a);
System.out.println(newString(s,"GBK"));//我爱Java,I Love Java,路慢慢。
raf.close();

4、字符串的读写


String readUTF() 从此文件读取一个字符串。

void writeUTF(String str) 使用 UTF-8编码以与机器无关的方式将一个字符串写入该文件。

File file = newFile("file.txt");
if(file.exists()){
    file.delete();
}
file.createNewFile();
RandomAccessFile raf = newRandomAccessFile(file, "rw");
/**
* 写 char 值 应该写2个字节
*/
chara = '中';
raf.writeChar(a);
//raf.writeChars("国人");//还可以直接些字符串
//这里不推荐这样,因为和编码有关系,我们应该同一编码。
/**
* 因为UTF-8是世界通用的编码格式
* RandomAccessFile提供了使用该编码格式读写字符串的方法。
* void writeUTF(String str)
* String readUTF()
*/
raf.writeUTF("国人,呵呵呵呵!!!!");
raf.seek(2);//把指针放到起始位置
System.out.println(raf.readUTF());
//国人,呵呵呵呵!!!!
raf.close();