一、文件目录的表示方式
- 绝对路径 :例如,
d:/home/user 表示在D盘下的 home 目录中的 user 目录。
./ :表示当前路径。当前路径是指您正在操作的目录,例如,在 /home/user 目录下,那么 ./file.txt 表示在该目录下的 file.txt 文件。
../ :表示父级路径,即当前路径所在的上一级目录。例如,在 /home/user 目录下,那么 ../file.txt 表示在 /home 目录下的 file.txt 文件。
二、File 文件操作
File类就是一个文件或目录的路径名的抽象表示,它可以让你方便地操作文件或目录的属性和结构。它可以用来创建、删除、重命名、查找和修改文件和目录。
| 构造方法 | 描述 |
|---|
File(String pathname) | 使用指定路径创建File对象,可以是绝对路径或相对路径。 |
File(File parent, String child) | 使用指定的父File对象和子路径创建File对象。 |
File(String parent, String child) | 使用指定的父路径和子路径创建File对象。 |
File(URI uri) | 通过指定的URI创建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() | 判断用户是否对文件有可写权限 |
三、文件内容操作
File只是对文件的属性进行操作,而想要对文件内容进行操作,就需要借助其它类。
(一)什么是流?
流是Java中用来处理输入和输出的一种抽象概念。流可以表示从一个源到一个目标的数据的流动,比如从文件到内存。
- 按照方向分,有输入流和输出流。输入流是从源读取数据到内存,输出流是从内存写入数据到目标。写数据到硬盘叫输出,是因为输出是相对于内存而言的。程序运行在内存中,硬盘是外部设备,所以把数据从内存写入到硬盘就是输出操作。反之,从硬盘读取数据到内存就是输入操作。
- 按照单位分,有字节流和字符流。字节流以字节为单位,可以处理任何类型的数据,字符流以字符为单位,可以处理文本数据。
(二)输入流(读文件)
1.字节流 —— InputStream
InputStream是抽象类,它有很多实现类,这里介绍较重要的FileInputStream
(1)FileInputStream
构造方法:
| 签名 | 说明 |
|---|
FileInputStream(File file) | 利用 File 构造文件输入流 |
FileInputStream(String name) | 利用文件路径构造文件输入流 |
| 方法 | 描述 |
|---|
int read() | 从输入流中读取下一个字节的数据,返回 -1 代表已经完全读完了。 |
int read(byte[] buffer) | 从输入流中读取多个字节的数据并将其存储在给定的字节数组中,返回实际读取的字节数,返回 -1 代表已经完全读完了。 |
int read(byte[] buffer, int offset, int length) | 从输入流中读取指定长度的字节数据,并将其存储在给定的字节数组中,从指定偏移位置开始,返回实际读取的字节数,返回 -1 代表已经完全读完了。 |
long skip(long n) | 跳过指定数量的字节。 |
int available() | 返回当前可从输入流中读取的字节数。 |
void close() | 关闭输入流。 |
int readNBytes(byte[] b, int off, int len) | 从输入流中读取指定数量的字节数据,并将其存储在给定的字节数组中,从指定偏移位置开始,返回实际读取的字节数。 |
public static void main(String[] args) throws IOException {
InputStream inputStream = new FileInputStream("D:/test.txt");
while(true){
int res = inputStream.read();
if(res == -1){
break;
}
System.out.println(res);
}
inputStream.close();
}
public static void main(String[] args) throws IOException {
try(InputStream inputStream = new FileInputStream("D:/test.txt")){
while(true){
int res = inputStream.read();
if(res == -1){
break;
}
System.out.println(res);
}
}
}
public static void main(String[] args) throws IOException {
try(InputStream inputStream = new FileInputStream("D:/test.txt")){
while(true){
byte[] buffer = new byte[1024];
int len = inputStream.read(buffer);
if(len == -1){
break;
}
for (int i = 0; i < len; i++) {
System.out.println(buffer[i]);
}
}
}
}
结果:

这是每个字母对应的ASCII值。
2.字符流 —— Reader
(1)FileReader
| 构造方法 | 描述 |
|---|
FileReader(File file) | 使用指定的File对象创建一个新的FileReader,用于读取指定文件的字符数据。 |
FileReader(String fileName) | 使用指定的文件名创建一个新的FileReader,用于读取指定文件的字符数据。 |
| 方法 | 描述 |
|---|
int read() | 读取单个字符并返回其Unicode代码点值,如果到达文件末尾则返回 -1。。 |
int read(char[] cbuf) | 将字符读入数组并返回读取的字符数,如果到达文件末尾则返回 -1。 |
int read(char[] cbuf, int off, int len) | 将字符读入数组的指定范围并返回读取的字符数,如果到达文件末尾则返回 -1。 |
void close() | 关闭FileReader并释放相关的资源。 |
public static void main(String[] args) {
try ( Reader reader = new FileReader("D:/test.txt")){
while (true){
char[] res = new char[1024];
int len = reader.read(res);
if(len == -1){
break;
}
for (int i = 0; i < len; i++) {
System.out.print(res[i]);
}
}
}catch (IOException e){
e.printStackTrace();
}
}
(三)输出流(写文件)
1.字节流 —— OutPutStream
(1)FileOutPutStream
OutPutStream是抽象类,它有很多实现类,这里介绍较重要的FileOutPutStream
| 构造方法 | 描述 |
|---|
FileOutputStream(File file) | 使用指定的File对象创建一个新的文件输出流,该流将数据写入到指定的文件。 |
FileOutputStream(File file, boolean append) | 使用指定的File对象创建一个新的文件输出流,可以选择是否以追加模式打开文件。 |
FileOutputStream(String name) | 使用指定的文件名创建一个新的文件输出流,该流将数据写入到指定的文件。 |
FileOutputStream(String name, boolean append) | 使用指定的文件名创建一个新的文件输出流,可以选择是否以追加模式打开文件。 |
| 方法 | 描述 |
|---|
void write(int b) | 将指定的字节写入输出流。 |
void write(byte[] b) | 将字节数组中的所有字节写入输出流。 |
void write(byte[] b, int off, int len) | 将字节数组中的指定范围的字节写入输出流。 |
void flush() | 刷新输出流,将缓冲区中的数据写入目标文件。 |
void close() | 关闭输出流,释放资源并确保所有数据都已写入目标文件。 |
public static void main(String[] args) throws IOException {
try(OutputStream outputStream = new FileOutputStream("D:/test.txt",true)){
outputStream.write('h');
outputStream.write('e');
outputStream.write('l');
outputStream.write('l');
outputStream.write('o');
}
}

2.字符流 —— Writer
(1)FileWriter
| 构造方法 | 描述 |
|---|
FileWriter(File file) | 使用指定的File对象创建一个新的FileWriter,用于向指定文件写入字符数据。 |
FileWriter(File file, boolean append) | 使用指定的File对象创建一个新的FileWriter,可以选择是否以追加模式打开文件。 |
FileWriter(String fileName) | 使用指定的文件名创建一个新的FileWriter,用于向指定文件写入字符数据。 |
FileWriter(String fileName, boolean append) | 使用指定的文件名创建一个新的FileWriter,可以选择是否以追加模式打开文件。 |
| 方法 | 描述 |
|---|
void write(int c) | 写入单个字符。 |
void write(char[] cbuf) | 将字符数组的所有字符写入文件。 |
void write(String str) | 将字符串的所有字符写入文件。 |
void write(char[] cbuf, int off, int len) | 将字符数组的一部分写入文件,从指定偏移位置开始,写入指定长度的字符。 |
void write(String str, int off, int len) | 将字符串的一部分写入文件,从指定偏移位置开始,写入指定长度的字符。 |
void flush() | 刷新缓冲区,将缓冲区中的数据写入文件。 |
void close() | 关闭FileWriter并释放相关的资源。 |
public static void main(String[] args) {
try(Writer writer = new FileWriter("D:/test.txt")){
writer.write("你好哇!掘友~");
}catch (IOException e){
e.printStackTrace();
}
}