1. IO概念
JavaIO操作的核心是五个抽象类和一个接口,所有的IO操作其实都是在操作这些类和接口,他们分别是:
- FILE文件操作类
- OutputStream字节输出流
- InputStream字节输入流
- Reader字符输入流
- Writer字符输出流
- Serializable序列化标识接口
首先介绍一下FILE文件操作类。
2. FILE文件操作类
FILE类位于java.io包中,是五个核心类中唯一一个与文件本身操作(文件的删除,创建,取得信息…)有关的类。但是它并不能修改文件的内容(其它四个类用来修改文内容)。
2.1 FILE构造方法
FILE有两个构造方法。
// 通过绝对路径创建FILE实例化
public File(String pathname)
// 通过父路径和子路径来创建FILE对象实例化
public File(String parent, String child)
一般使用第一种构造方法,简洁明了。
File file = new File("E:\\IO\\demo.txt");
2.2 文件基本操作
FILE作为文件的实例化对象时,FILE类提供如下几种基本操作方法:
// 文件是否存在
public boolean exists()
// 创建一个新的文件,FILE只是创建文件本身,并不进行文件内容的修改
public boolean createNewFile() throws IOException
// 删除一个文件
public boolean delete()
看下面的例子:
import java.io.File;
import java.io.IOException;
/**
* 测试路径:E:\IO
*/
public class Test {
public static void main(String[] args) throws IOException {
// 测试路径:E:\IO\demo.txt
File file = new File("E:\\IO\\demo.txt");
if(file.exists() && file.exists()) {// 文件如果存在,删除
System.out.println("文件存在,删除...");
file.delete();
} else {// 文件不存在,创建
System.out.println("文件不存在,创建...");
file.createNewFile();
}
}
}
程序运行前,测试文件夹为空:
程序运行,程序运行结果:
测试文件夹:
Java为了突出跨平台性,在FILE中还引入了一个描述当前系统文件分隔符样式的常量。
实际项目部署环境可能与开发环境不同。那么这个时候路径的问题就很麻烦了。windows下使用的
是”\”,而Unix系统下使用的是”/”。所以在使用路径分隔符时都会采用File类的一个常量。
public static final String separator = "" + separatorChar;
2.3 目录基本操作
FILE不仅可以描述文件,也可以用来描述目录,描述目录时,有如下方法:
// 拿到当前FILE对象的父FILE(目录或文件)
public File getParentFile()
// 创建当前FILE的父目录
public boolean mkdirs()
看下面的例子:
import java.io.File;
import java.io.IOException;
/**
* 测试路径:E:\IO
*/
public class Test {
public static void main(String[] args) throws IOException {
// 测试路径:E:\IO
File file = new File("E:\\IO\\a\\b");
// 父路径不存在
if(!file.getParentFile().exists()) {
// 创建父路径
file.getParentFile().mkdirs();
}
}
}
运行前测试文件夹为空:
运行后创建了多级目录:
我们在创建FILE对象的父目录时绝对不能这样写:
// 这样写的话,会将file全部认为成路径
// 如果file: E:\IO\a\b\demo.txt。会将最后一级的 demo.txt 也识别成目录从而创建
// 而不是我们预期的 demo.txt 文件
file.mkdirs();
// 而先通过 getParentFile()拿到FILE对象父信息,就不会发生上述后果了
file.getParentFile().mkdirs();
2.4 取得文件信息
// 判断路径是否是文件
public boolean isFile()
// 判断路径是否是目录
public boolean isDirectory()
// 取得文件大小(字节)
public long length()
// 最后一次修改日期,这里返回的是一个时间戳
public long lastModified()
看下面的例子:
import java.io.File;
import java.io.IOException;
import java.util.Date;
/**
* 测试路径:E:\IO
*/
public class Test {
public static void main(String[] args) throws IOException {
// 测试路径:E:\IO\demo.txt
File file = new File("E:\\IO\\demo.txt");
if(file.exists() && file.isFile()) {
System.out.println("文件大小为:"+file.length());
System.out.println("文件最后一次修改日期:"+file.lastModified());
// lastModified()返回的是一个时间戳,我们可以使用 Date类将其转换为时间
System.out.println(new Date(file.lastModified()));
} else {
file.createNewFile();
}
}
}
运行结果:
最后,我们来看一个厉害一点的方法。
// 获取当前目录子目录下所有的文件信息
public File[] listFiles()
看个例子:
import java.io.File;
import java.io.IOException;
/**
* 测试路径:E:\IO
*/
public class Test {
public static void main(String[] args) throws IOException {
File file = new File("E:\\IO");
// 现在测试文件夹中创建一些文件
for(int i = 0; i < 10; i++) {
File tmpFile = new File("E:\\IO\\"+i);
tmpFile.createNewFile();
}
System.out.println("创建测试文件完毕");
// listFiels()只能获得目录信息,所以要确保当前为一个目录
if(file.exists() && file.isDirectory()) {
File[] files = file.listFiles();
// 打印文件信息
System.out.println("开始打印测试文件夹文件信息");
for(File tmp : files) {
System.out.println(tmp);
}
}
}
}
运行结果:
测试文件夹结果:
关于FILE的综合演练可以参考