目录
一、File类概述
1.1 使用案例
二、文件内容的读写
2.1 字符流
2.1.1 读取文件
2.1.2 写入文件
2.2 字节流
2.2.1 读取文件
2.2.2 写入文件
对于Java操作文件,具体详情可以参考Java api文档 中的Java.io.File类
一、File类概述
首先先了解一下File类中常见的属性、构造方法和普通方法
属性
修饰符及类型 | 属性 | 说明 |
static String | pathSeparator | 依赖于系统的路径分隔符,String 类型的表示 |
static char | pathSeparator | 依赖于系统的路径分隔符,char 类型的表示 |
构造方法
签名 | 说明 |
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() | 判断用户是否对文件有可写权限 |
1.1 使用案例
File的基本使用
import java.io.File;
import java.io.IOException;public class Demo5 {public static void main(String[] args) throws IOException {File file = new File("../hello.txt");//这里不要求该文件存在System.out.println(file.getParentFile());System.out.println(file.getName());System.out.println(file.getAbsoluteFile());System.out.println(file.getCanonicalFile());}
}
普通文件的创建、删除
import java.io.File;
import java.io.IOException;public class Demo6 {public static void main(String[] args) throws IOException {File file = new File("./test.txt");System.out.println(file.exists());System.out.println(file.isFile());// 创建文件file.createNewFile();System.out.println(file.exists());System.out.println(file.isFile());System.out.println(file.getAbsoluteFile());}
}
当前的目录中是没有这个test.txt文件的,然后运行程序
从这里可以看出创建已经成功了,接下来是删除操作。
import java.io.File;public class Demo7 {public static void main(String[] args) {File file = new File("./test.txt");file.delete();}
}
当这个代码执行的时候,文件就会被删除了。
二、文件内容的读写
2.1 字符流
2.1.1 读取文件
构造方法
签名 | 说明 |
FileReader(File file) | 利用 File 构造文件输入流 |
FileReader(String name) | 利用文件路径构造文件输入流 |
文件读取
首先先准备好一个含有内容的文件
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;public class Demo9 {public static void main(String[] args) throws IOException {//这里用try()的写法就不用去关闭字符流了,这个会自动关闭try(Reader reader = new FileReader("./test.txt")) {// 因为文件不能一下就全部读完,所以采取循环读取的方式while (true) {// 用来存储读取到的字符char[] buf = new char[1024];// 将文件中的内容写入字符数组中int n = reader.read(buf);if (n == -1) {// 读取结束break;}for (int i = 0; i < n; i++) {System.out.print(buf[i]);}}}}
}
2.1.2 写入文件
修饰 符及 返回 值类 型 | 方法签名 | 说明 |
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(刷新)操作,将数据刷到设备中。 |
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class Demo10 {public static void main(String[] args) throws IOException {try (Writer fileWriter = new FileWriter("./test.txt",true)) {fileWriter.write("hello world!");}}
}
运行代码就会看到,结果已经写入了文件中了
2.2 字节流
2.2.1 读取文件
构造方法
签名 | 说明 |
FileInputStream(File file) | 利用 File 构造文件输入流 |
FileInputStream(String name) | 利用文件路径构造文件输入流 |
开始读取文件
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;public class Demo11 {public static void main(String[] args) throws IOException {try (InputStream in = new FileInputStream("./test.txt")) {while (true) {byte[] buf = new byte[1024];// 由于这里是字节流读入,所以只能用字节数组接收int n = in.read(buf);if (n == -1) {break;}for (int i = 0; i < n; i++) {System.out.printf("%x",buf[i]);// 由于是字节,这里用16进制打印}}}}
}
由于有时候需要的是文件本身的内容,而不是字节内容,这里通常使用 String 来解决。
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;public class Demo11 {public static void main(String[] args) throws IOException {try (InputStream in = new FileInputStream("./test.txt")) {while (true) {byte[] buf = new byte[1024];// 由于这里是字节流读入,所以只能用字节数组接收int n = in.read(buf);if (n == -1) {break;}// 利用String 字节转字符String s = new String(buf,0,n);System.out.print(s);}}}
}
利用Scanner 进行字符读取
上述例子中,我们看到了对字符类型直接使用 InputStream 进行读取是非常麻烦且困难的,所以,我们使用一种我们之前比较熟悉的类来完成该工作,就是 Scanner 类。但是Scanner类只能用于字节流的文本内容读取,如果内容是二进制文件则不能用Scanner。
构造方法 | 说明 |
Scanner(InputStream is, String charset) | 使用 charset 字符集进行 is 的扫描读取 |
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;public class Demo12 {public static void main(String[] args) throws IOException {try (InputStream in = new FileInputStream("test.txt")) {Scanner sc = new Scanner(in);// 由于Scanner遇到换行就会停止读取,为了读取全部文本内容就要用到hashNextwhile (sc.hasNextLine()) {String s = sc.nextLine();System.out.println(s);}}}
}
注意:不论是字节流还是字符流都能用Scanner来接收 ,但是都只限于文本内容
2.2.2 写入文件
这里的写入具体方法参考 2.1.2中的方法,因为写入的方法都是一样的,只是写入的是字节还是字符的区别。
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;public class Demo14 {public static void main(String[] args) throws IOException {try (OutputStream os = new FileOutputStream("./test.txt",true)) {os.write("hello".getBytes());// 由于是字节输出所以要转换成字节}}
}
这里的操作并不需要全部记住,只需要了解如何使用即可。用的使用查询api文档