File对象
File对象本质是一个文件或文件夹,用于写入和读取文件内容
注意:对于相对路径而言,在单元测试方法中的File是相对于Module,在main中的File是相对于Project
构造器
File(String pathname)
File file1 = new File("D:\\workspace"); // 对应一个文件夹 File file2 = new File("D:\\workspace\test.txt"); // 对应一个文件
File(String parent, String child)
File file = new File("D:\\workspace", "test.txt"); // 第一个参数是文件夹,第二个参数可以是文件/文件夹
File(File parent, String child)
File file1 = new File("D:\\workspace"); File file2 = new File(file1, "test.txt"); // 第一个参数传入一个File对象,且这个对象必须是个文件夹
常用方法
获取文件信息
getName()
:获取文件名称gePath()
:获取相对路径getAbsolutePath()
:获取文件绝对路径File getAbsoluteFile()
:获取绝对路径表示的文件getParent()
:获取上层目录路径length()
:获取文件所占的字节lastModified()
:获取文件最后修改的时间(毫秒数)exists()
:判断文件或目录是否存在isDirectory()
:是否是一个目录isFile()
:是否是一个文件canRead()
:是否可读canWrite()
:是否可写isHidden()
:是否隐藏
遍历文件内部
String[] list()
:返回目录中最外层的所有子目录及子文件File[] listFiles()
:返回目录中最外层的所有子目录及子文件
操作文件
renameTo(File)
:重命名(文件移动)
前提:源文件必须存在,目标文件必须不存在,且目标文件所在文件夹必须存在File file1 = new File("hello.txt"); // 假设hello.txt存在 File file2 = new File("workspace", "world.txt"); // 假设workspace存在,world.txt不存在 Boolean isSuccess = file1.renameTo(file2); // 是否移动成功 System.out.println(isSuccess); // 是否成功
createNewFile()
:创建文件,若文件存在,则返回falseFile file = new File("workspace/hello.txt"); try { System.out.println(file.createNewFile()); // 不存在返回true,文件已存在返回false } catch(IOException e) { e.printStackTrace(); }
delete()
:删除文件或目录,若文件/目录不存在,返回false
说明:
① 对于目录而言,只能删除空目录
② 删除不走回收站mkdir()
:创建一个目录,如果当前目录的上层目录不存在,则创建失败// 前提:只有workspace目录存在 File file = new File("workspace/test.txt"); file.mkdir(); // 创建成功 File file = new File("workspace/a/test.txt"); // a目录和test.txt不存在 file.mkdir(); // 创建失败
mkdirs()
:创建多级目录,如果当前目录的上层目录也不存在,一并创建// 前提:只有workspace目录存在 File file = new File("workspace/a/test.txt"); // a目录和test.txt不存在 file.mkdirs(); // 创建成功(a目录和test.txt都被创建)
IO流
- 按流向划分:输入流、输出流
- 按操作数据单位划分:字节流、字符流
- 按IO流的角色划分:节点流、处理流
IO流的基础类
抽象基类 | 文件流(节点流) | 缓冲流(处理流) | 转换流(处理流) | 数据流(处理流) | 对象流(处理流) |
---|---|---|---|---|---|
InputStream(字节流输入流) | FileInputStream | BufferedInputStream | InputStreamReader | DataInputStream | ObjectInputStream |
ouputStream(字节输出流) | FileOutputStream | BufferedOutputStream | OutputStreamWriter | DataOutputStream | ObjectOutputStream |
Reader(字符输入流) | FileReader | BufferedReader | |||
Writer(字符输出流) | FileWriter | BufferedWriter | |||
PrintStream(打印流) |
说明
① 字符流一般用于读取txt文件,字节流一般用于读取mp3、mp4、jpg等文件
② 字节流可以用于txt文件的复制,但是用于读取txt文件可能会出现乱码(如果遇到汉字,一个汉字占3个字节,可能读不完整)
③ 缓冲流可以提高文件的读写效率(相当于在文件和内存中间架了一层8kb的缓存区,先从文件中读取到缓存中,最后再一并读入到内存中)
④ 输出流中的flush()
方法,可以手动将数据立即写入到磁盘中
⑤ 转换流可以将字节流转换为字符流,或者将字符流转换为字节流
⑥ 数据流只可以读写基本数据类型、String类型数据
⑦ 对象流既可以读写基本数据类型、String类型数据,又可以读写引用类型数据
案例1:将磁盘中的文本文件读入内存中,并打印文件内容(使用字符输入流 FileReader)
File file = new File("hello.txt");
FileReader fr = null;
try {
fr = new FileReader(file);
char[] cBuffer = new char[5]; // 用于存储批量读出来的字符
int len; // 用于存储本次读取出的长度
// 开始读入
while((len = fr.read(cBuffer)) != -1) {
// 遍历本次所有读出的字符
for(int i = 0; i < len; i++) {
System.out.println(cBuffer[i]);
}
}
} catch(IOException e) {
e.printStackTrace();
} finally {
// 关闭字符输入流
try {
if (fr != null) {
fr.close();
}
} catch(IOException e) {
e.printStackTrace();
}
}