1、File类
File 类不能访问文件内容本身,如果需要访问文件内容本身,则需要使用输入/输出流。
File 类提供了如下三种形式构造方法。 File(String path):如果 path 是实际存在的路径,则该 File 对象表示的是目录;如果 path 是文件名,则该 File 对象表示的是文 件。 File(String path, String name):path 是路径名,name 是文件名。 File(File dir, String name):dir 是路径对象,name 是文件名。
使用任意一个构造方法都可以创建一个 File 对象,然后调用其提供的方法对文件进行操作。在下表中列出了 File 类的常用方法及说明。
File 类中有以下两个常用常量: public static final String pathSeparator:指的是分隔连续多个路径字符串的分隔符,Windows 下指;。例如 java -cp test.jar;abc.jar HelloWorld。 public static final String separator:用来分隔同一个路径字符串中的目录的,Windows 下指/。
注意:可以看到 File 类的常量定义的命名规则不符合标准命名规则,常量名没有全部大写,这是因为 Java 的发展经过了一段相当长的时间,而命名规范也是逐步形成的,File 类出现较早,所以当时并没有对命名规范有严格的要求,这些都属于 Java 的历史遗留问题。
2、获取文件属性
在 Java 中获取文件属性信息的第一步是先创建一个 File 类对象并指向一个已存在的文件, 然后调用表 1 中的方法进行操作。
3、创建和删除文件
File 类不仅可以获取已知文件的属性信息,还可以在指定路径创建文件,以及删除一个文件。创建文件需要调用 createNewFile() 方法,删除文件需要调用 delete() 方法。无论是创建还是删除文件通常都先调用 exists() 方法判断文件是否存在。
注意:在操作文件时一定要使用 File.separator 表示分隔符。在程序的开发中,往往会使用 Windows 开发环境,因为在 Windows 操作系统中支持的开发工具较多,使用方便,而在程序发布时往往是直接在 Linux 或其它操作系统上部署,所以这时如果不使用 File.separator,则程序运行就有可能存在问题。关于这一点我们在以后的开发中一定要有所警惕。
4、创建和删除目录
File 类除了对文件的创建和删除外,还可以创建和删除目录。创建目录需要调用 mkdir() 方法,删除目录需要调用 delete() 方法。无论是创建还是删除目录都可以调用 exists() 方法判断目录是否存在。
5、遍历目录
方法有如下两种重载形式:
1. String[] list()
该方法表示返回由 File 对象表示目录中所有文件和子目录名称组成的字符串数组,如果调用的 File 对象不是目录,则返回 null。
提示:list() 方法返回的数组中仅包含文件名称,而不包含路径。但不保证所得数组中的相同字符串将以特定顺序出现,特别是不保证它们按字母顺序出现。
2. String[] list(FilenameFilter filter)
该方法的作用与 list() 方法相同,不同的是返回数组中仅包含符合 filter 过滤器的文件和目录,如果 filter 为 null,则接受所有名称。
RandomAccessFile类
所谓动态读取是指从文件的任意位置开始访问文件,而不是必须从文件开始位置读取到文件末尾。动态读取需要用到 Java 中的 RandomAccessFile 类。
RandomAccessFile 是 Java 输入/输出流体系中功能最丰富的文件内容访问类,它提供了众多的方法来访问文件内容,它既可以读取文件内容,也可以向文件输出数据。由于 RandomAccessFile 可以从任意位置访问文件,所以在只需要访问文件部分内容的情况下,使用 RandonAccessFile 类是一个很好的选择。
RandomAccessFile 对象包含了一个记录指针,用以标识当前读写处的位置,当程序新创建一个 RandomAccessFile 对象时,该对象的文件记录指针位于文件头(也就是 0 处),当读/写了 n 个字节后,文件记录指针将会向后移动 n 个字节。除此之外,RandonAccessFile 可以自由移动该记录指针,既可以向前移动,也可以向后移动。
注意:如果使用 rw 方式声明 RandomAccessFile 对象时,要写入的文件不存在,系统将自动进行创建。
写入文件,代码如下:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;
public class RandomAccessFileDemo01 {
public static void main(String[] args) throws Exception {
/**
* RandomAccessFile 是 Java 输入/输出流体系中功能最丰富的文件内容访问类,
* 它提供了众多的方法来访问文件内容,它既可以读取文件内容,也可以向文件输出数据。
* 由于 RandomAccessFile 可以从任意位置访问文件,所以在只需要访问文件部分内容的情况下,
* 使用 RandomAccessFile 类是一个很好的选择
*
* RandomAccessFile类提供了两个构造方法:
* RandomAccessFile(File file, String mode)
* 其中file表示文件对象,mode表示文档的属性(常用属性有r:只读模式,w:只写模式,
* rw:可读可写模式)
*
* RandomAccessFile(String path, String mode)
* 其中path表示文件所在路径,mode表示文档的属性(常用属性有r:只读模式,w:只写模式,
* rw:可读可写模式)
* 注意:当指定路径下文件不存在,则会创建改文件对象
*/
// 任务:将数据写入dir/a.txt文件当中
// 创建file对象
File f = new File("dir/a.txt");
// 创建随机文件对象
RandomAccessFile raf = new RandomAccessFile(f, "rw");
// 将hello java写入文件当中
// String content = "Hello Java";
String content = "今天安顺天气真好";
byte[] bytes = content.getBytes("UTF-8");
/**
* 注意:
* 每次写入内容时都会清空原本的内容
*/
raf.write(bytes);
raf.write(1);
System.out.println("写入完毕");
// 关闭文件
raf.close();
}
读取文件,代码如下:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;
public class RandomAccessFileDemo02 {
public static void main(String[] args) throws Exception {
/**
* 读取文件
*/
// 创建file对象
File f = new File("dir/a.txt");
// 创建随机文件对象
RandomAccessFile raf = new RandomAccessFile(f, "r");
// 读取文件
// int read = raf.read();// 每次读取一个字节
// String s = raf.readLine();// 读取一行数据
// 获取文件内容长度
long length = raf.length();
byte[] data = new byte[(int) length];
// 读取数据
raf.read(data);
// 将二进制数据转为中文
String result = new String(data, "Utf-8");
System.out.println(result);
// 关闭文件流
raf.close();
}
根据上面所学的制作一个简易的记事本程序
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;
import java.util.Scanner;
public class RAFDemo03 {
public static void main(String[] args) throws Exception {
/**
* 任务:
* 制作一个简易的记事本程序
* 要求:
* 用户输入记事本名字打开记事本,如果不存在则创建,当用户输入Q或者q的时候
* 保存并且退出记事本
*/
// 创建扫描器对象
Scanner scan = new Scanner(System.in);
System.out.println("欢迎来到记事本,请输入要打开的记事本名字,如果不存在则会创建:");
String name = scan.nextLine();
// 创建随机读取文件对象
RandomAccessFile raf = new RandomAccessFile("dir/"+name+".txt", "rw");
String cont = "";
while (true) {
System.out.println("请输入内容:");
cont = scan.nextLine();
// 判断用户是否退出
if ("Q".equals(cont) || "q