目录
一、文件
文件指的是存储在硬盘上的文件。硬盘上文件的目录结构是树形结构。目录分隔符推荐用 "/"。
【文件的路径】
1、绝对路径:从根目录到目标文件。
2、相对路径:从当前目录到目标文件。
二、Java中操作文件
2.1 File 类
在 Java 中提供了 File 类来表示文件。
【构造方法】
方法 | 说明 |
File(File parent, String child) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例 |
File(String pathname) | 根据文件路径创建一个新的 File 实例,路径可以是绝对路径或相对路径 (也可以是不存在的路径) |
File(String parent, String child) | 根据父目录路径 + 孩子文件路径,创建一个新的 File 实例 |
【文件操作方法】
方法 | 说明 |
String getParent() | 返回 File 对象的父目录文件路径 |
String getName() | 返回 File 对象的纯文件名称 |
String getPath() | 返回 File 对象的文件路径 |
String getAbsolutePath() | 返回 File 对象的绝对路径 |
String getCanonicalPath() | 返回 File 对象修饰过的绝对路径 |
boolean exists() | 判断 File 对象描述的文件是否存在 |
boolean isDirectory() | 判断 File 对象代表的文件是否是一个目录 |
boolean isFile() | 判断 File 对象代表的文件是否是一个普通文件 |
boolean createNewFile() | 根据 File 对象删除该文件,成功后返回 true |
boolean delete() | 根据 File 对象创建一个空文件,成功后返回 true |
void deleteOnExit() | 根据 File 对象,到 JVM 运行结束时标注文件将被删除 |
String[] list() | 返回 File 对象代表的目录下所有文件名 |
File[] listFiles() | 返回 File 对象代表的目录下所有文件,以 File 对象表示 |
boolean mkdir() | 创建 File 对象代表的目录 |
boolean mkdirs() | 创建 File 对象代表的目录,如果必要,会创建中间目录 |
boolean renameTo(File dest) | 进行文件改名,也可以视为剪切、粘贴操作 |
boolean canRead() | 判断用户对文件是否具有可读权限 |
boolean canWrite() | 判断用户对文件是否具有可写权限 |
2.2 文件内容的操作(流)
Java 标准库对于流进行了一系列的封装,提供了一组类来负责这些操作,大致可以分为两个类别:
1、字节流
以字节为单位进行读写,一次最少读写一个字节。
【代表类】
InputStream:输入
OutputStream:输出
2、字符流
以字符为单位进行读写,一次最少读写一个汉字。举个例子,若用 utf8 表示汉字,3 个字节就是一个汉字,故一次读写最少读写 3 个字节 (一个汉字为单位)。
【代表类】
Reader:输入
Writer:输出
2.2.1 InputStream
方法 | 说明 |
int read() | 读取一个字节的数据,返回 -1 表示已经读完了 |
int read(byte[] b) | 最多读取 b.length 字节的数据到 b 中,返回实际读到的数量,-1表示读完了 |
int read(byte[] b, int off, int len) | 最多读取 len - off 字节的数据到 b 中,放在从 off 开始,返回实际读到的数量;-1 表示已经读完了 |
void close() | 关闭字节流 |
2.2.2 FileInputStream
InputStream 只是⼀个抽象类,要使用还需要具体的实现类。关于 InputStream 的实现类有很多,基本可以认为不同的输入设备都可以对应一个 InputStream 类。
我们现在只关心从文件中读取,所以使用 FileInputStream 类。
构造方法 | 说明 |
FileInputStream(File file) | 利用 File 构造文件输入流 |
FileInputStream(String name) | 利用文件路径构造文件输入流 |
2.2.3 用 Scanner 进行字符读取
可以使用 Scanner 辅助我们读取文件,System.in 本质上就是一个 InputStream。
构造方法 | 说明 |
Scanner(InputStream is, String charset) | 使用 charset 字符集进行 is 的扫描读取 |
2.2.4 OutputStream
方法 | 说明 |
void write(int b) | 写入要给字节的数据 |
void write(byte[] b) | 将 b 这个字符数组中的数据全部写入 os 中 |
int write(byte[] b, int off, int len) | 将 b 这个字符数组中从 off 开始的 数据写入 os 中,一共写 len 个 |
void close() | 关闭字节流 |
void flush() | 重要:我们知道 I/O 的速度是很慢的,所以大多的 OutputStream 为了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,调用 flush (刷新) 操作,将数据刷到设备中。 |
总结
1、文件路径分隔符推荐用 "/"。
2、有 File 对象并不代表文件真实存在。
3、System.in 本质上就是一个 InputStream。
4、InputStream 和 OutputStream 都是抽象类,需要具体的实现类。
5、OutputStream 暂存至缓冲区的数据,可能会有残留,需要刷新至最后的位置中。