文章目录
一、File类介绍
Java中通过java.io.File 类 抽象的 描述了一个文件(包括目录)。注意,有File对象,不代表真是存在该文件。
先来看一看File类中的常见属性、构造方法和常用方法:
1.File类属性
修饰符及类型 | 属性 | 说明 |
---|---|---|
static String | pathSeparator | 依赖于系统的路径分隔符,String 类型的表示 |
static char | pathSeparator | 依赖于系统的路径分隔符,char 类型的表示 |
2.构造方法
签名 | 说明 |
---|---|
File(File parent, String child) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例 |
File(String pathname) | 根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者相对路径 |
File(String parent, String child) | 根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用路径表示 |
3.常用方法
修饰符及返回值类型 | 方法签名 | 说明 |
---|---|---|
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() | 判断用户是否对文件有可写权限 |
二、如何读写文件中的数据
文件内容的读写是以“流”的方式进行的。
写,就视为通过水龙头往池子里灌水–输出流
读,就视为通过水龙头从池子里往外节水–输入流
这里的输入输出是以CPU为中心的, 所以从CPU往磁盘上写数据叫做输出,从文件往CPU读数据叫做输入。
Java对于读写文件分为了两种方式,分别为字节流和字符流。
读类 | 写类 | 说明 |
---|---|---|
InputStream | OutputStream | 字节流读写,针对二进制文件,操作基本单位是字节 |
Reader | Writer | 字符流读写,针对文本文件,操作基本单位是字符 |
- 字节流: 它处理单元为1个字节,操作字节和字节数组,存储的是二进制文件,如果是音频文件、图片、歌曲,就用字节流。
- 字符流: 它处理的单元为2个字节的 Unicode 字符,分别操作字符、字符数组或字符串,字符流是由 Java 虚拟机将字节转化为2个字节的 Unicode 字符为单位的字符而成的,如果是关系到(文本)的,用字符流更好。
- 字节流可用于任何类型的对象,包括二进制对象,
而字符流只能处理字符或者字符串。 - 字节流提供了处理任何类型的 IO 操作的功能,但它不能直接处理 Unicode 字符,而字符流就可以。
- 所有文件都是以字节的形式储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列。
- 字节流在操作的时候本身不会用到缓冲区的,是与文件本身直接操作的;
而字符流在操作的时候会使用到缓冲区的。 - InputStream/OutputStream 和 Reader/Writer 都实现了 Closeable 接口,所以可以不主动通过 close 方法去关闭该资源,而是通过代码可读性更高的 try-with-resource 操作在 try 中的内容结束后,无论是否有异常都关闭该资源。
- 使用 OutputStream 或 writer 打开文件默认会清空之前的文件内容。
1.通过字节流读写数据
InputStream
InputStream 只是一个抽象类,使用时还需要具体的实现类,InputStream 的实现类有很多种,针对不同的输入设备都可以对应一个实现类,其中针对文件读取的实现类是 **FileInputStream**。
FileInputStream 概述
构造方法:
签名 | 说明 |
---|---|
FileInputStream(File file) | 利用File构造文件输入流 |
FileInputStream(String name) | 利用文件路径构造文件输入流 |
常用方法
修饰符及返回值类型 | 方法签名 | 说明 |
---|---|---|
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搭配Scanner进行字符读取
有时对字符类型直接使用InputStream进行读取非常麻烦且困难,所以,我们
使用一种我们之前比较熟悉的类来完成该工作,就是 Scanner 类。
构造方法 | 说明 |
---|---|
Scanner(InputStream is, String charset) | 使用 charset 字符集进行 is 的扫描读取 |
OutputStream
OutputStream 同样只是一个抽象类,要使用还需要具体的实现类。我们现在还是只关心写入文件中,所以使用 FileOutputStream。
FileOutputStream 概述
常用方法:
修饰符及返回值类型 | 方法签名 | 说明 |
---|---|---|
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(刷新)操作,将数据刷到设备中。 |
2.通过字符流读写数据
Reader
Reader 是实现字符输入流的一种类型,其本身属于一个抽象类,使用时需要使用具体的实现类。Reader 的实现类很多,针对不同的输入设备都可以对应一个实现类,其中针对文件读取的实现类是 FileReader。Reader 的使用方式InputStream 相仿。
代码示例:
public static void main1(String[] args) throws IOException { //读操作
try (Reader reader=new FileReader("./test.txt")){
while (true){
int ch=reader.read(); //返回值为int, 读完之后返回-1
if (ch==-1){
break;
}
System.out.println(""+(char)ch);
}
}
}
Writer
Writer 是实现字符输出流的一种类型,其本身属于一个抽象类,使用时需要使用具体的实现类。Writer 的实现类很多,针对不同的输出设备都可以对应一个实现类,其中针对文件读取的实现类是 FileWriter。Writer 的使用方式和OutputStream 相仿。
代码示例:
public static void main(String[] args) throws IOException { //写操作
try (Writer writer=new FileWriter("./test.txt")){
writer.write("hello world");
//手动刷新缓冲区
writer.flush();
}
}