目录
一、文件的分类
二、文件路径
三、File 常见方法
1、get 相关方法使用
2、文件的创建和删除
3、遍历目录下所有文件
四、文件读写
一、文件的分类
站在程序员的角度,文件通常可以分为两类:
- 文本文件:以字符形式存储
- 二进制文件:以字节方式存储
有的朋友可能有疑惑:字符不也是由字节构成的吗?
是的,文本文件中的字符的确是由一个个相邻的字符构成的,但这些相邻的字节之间是存在关系的,而二进制文件里面存储的字节毫无关系!!
二、文件路径
文件路径通常可以分为两类:
- 绝对路径(绝对路径 (absolute path) : 以一个盘符开头的路径,就是绝对路径)
- 相对路径(相对路径 (relative path) 一般是以
.
或者..
开头的路径.一般会有一个基准,去找对应的路径)
三、File 常见方法
Java 中通过 java.io.File
类来对一个文件(包括目录)进行抽象的描述
File 属性:
修饰符及类型 | 属性 | 说明 |
---|---|---|
static String | pathSeparator | 依赖于系统的路径分隔符,String 类型的表示 |
static char | pathSeparator | 依赖于系统的路径分隔符,char 类型的表示 |
构造方法:
签名 | 说明 |
---|---|
File(File parent, Stringchild) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例 |
File(String pathname) | 根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者相对路径 |
File(String parent, Stringchild) | 根据父目录 + 孩子文件路径,创建一个新的 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() | 判断用户是否对文件有可写权限 |
小练习:
1、get 相关方法使用
package com;
import java.io.File;
import java.io.IOException;
public class Demo {
public static void main(String[] args) throws IOException {
File file = new File("./test.txt");
// file 里边的路径是可以不存在的哦~~~
System.out.println(file.getName());
System.out.println(file.getAbsolutePath());
System.out.println(file.getPath());
System.out.println(file.getCanonicalPath());
}
}
运行截图:
2、文件的创建和删除
import java.io.File;
import java.io.IOException;
public class FileDemo2 {
public static void main(String[] args) throws IOException {
File file = new File("./test.txt");
System.out.println("创建前:");
System.out.println("文件是否真实存在: "+file.exists());
System.out.println("文件是否是一个目录: "+file.isDirectory());
System.out.println("文件是否是一个普通文件: "+file.isFile());
System.out.println("创建后:");
System.out.println("文件创建是否成功: "+file.createNewFile());
System.out.println("文件是否真实存在: "+file.exists());
System.out.println("文件是否是一个目录: "+file.isDirectory());
System.out.println("文件是否是一个普通文件: "+file.isFile());
System.out.println("再次创建:");
System.out.println("文件创建是否成功: "+file.createNewFile());
}
}
3、遍历目录下所有文件
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class FileDemo9 {
// 这里的result 用来记录每一个目录里面的路径
public static List<String> result = new ArrayList<>();
public static void getAllFiles(String basePath){
File file = new File(basePath);
if(file.isFile()){
//如果是一个文件就之间add
result.add(basePath);
return ;
}else if (file.isDirectory()){
//这里是一个目录 就需要递归
String[] files = file.list();
for (String f : files){
getAllFiles(basePath+"/"+f);
}
}else{
//非普通文件,暂不考虑
}
}
public static void main(String[] args) {
getAllFiles(".");
for (String s : result){
System.out.println(s);
}
}
}
四、文件读写
对文件的读写根据文件的类型大体可以分为两种:
- 字节流:针对二进制文件,以字节为单位进行读写
- 字符流:针对文本文件,以字符为单位进行读写
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() | 关闭字节流 |
InputStream
是一个抽象类.可用使用FileInputStream
来实现.
FileInputStream 的构造方法
构造方法 | 说明 |
---|---|
FileInputStream(File file) | 利用 File 构造文件输入流 |
FileInputStream(String name) | 利用文件路径构造文件输入流 |
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 为了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,调用 |
OutputStream
也是一个抽象类,可以使用FileOutputStream
来实现