I/O体系:
非流式: File
流式: 字节流: 输入:InputStream 输出:OutputStream 字符流; 输入:Reader 输出:Writer
以内存为主体 输入: 硬盘 -> 内存 输出: 内存 -> 硬盘
非流式:
文件和文件夹: File
用来创建/操作文件和文件夹的对象
方法 | 返回值 | 说明 |
---|---|---|
File(String str) | 构造方法 | 根据文件路径创建对象 |
File(String str, String str) | 构造方法 | 根据拼接后文件路径创建对象 |
File(File f, String str) | 构造方法 | 根据拼接后文件路径创建对象 |
length() | long | 获取路径文件大小(单位:byte) |
createNewFile() | boolean | 创建一个文件 |
mkdir() | boolean | 创建一个单级文件夹 |
mkdirs() | boolean | 创建多级文件夹 |
delete() | boolean | 删除文件或空文件夹(无法删除非空文件夹,不经过回收站) |
isDirectory() | boolean | 测试路径是否为文件夹 |
isFlie() | boolean | 测试路径是否为文件 |
isexists() | boolean | 测试路径是否存在 |
getName() | String | 获取文件或文件夹名称 |
listFiles() | File[] | 获取该目录文件夹内所有文件和文件夹的路径 |
流式:
方法 | 返回值 | 说明 |
---|---|---|
flush() | void | 刷新流 |
close() | void | 释放资源,一般先刷新再关闭,每个流使用完必须释放资源 |
字节输出流: FileOutputStream
方法 | 返回值 | 说明 |
---|---|---|
FileOutputStream(File f) | 构造方法 | 根据File对象创建一个文件,并获取其字节输出流(若已存在,则清空内容) |
FileOutputStream(String str) | 构造方法 | 根据 str 路径创建一个文件,并获取其字节输出流 |
FileOutputStream(String str, boolean b) | 构造方法 | 根据 str 路径创建一个文件,并获取其字节输出流 b:续写开关 true则不清空 |
write(byte[]) | void | 写入字节 |
write(byte[], int i1, int i2) | void | 写入字节,从第 i1 个开始,写入 i2 个 |
import java.io.File;
import java.io.FileOutputStream;
public class Demo {
public static void main(String[] args) throws Exception {
File f = new File("D:/新建文件夹/a.txt");
FileOutputStream fout = new FileOutputStream(f);
byte[] bs = "是谁在唱歌?\n温暖了寂寞!\n\"此处广告位招租\"".getBytes("GBK"); //将字符串以 GBK 编码转为字节数组 \n表示换行 由于 " 字符有特殊含义故加 \ 转义
fout.write(bs);
fout.close(); //不要忘记关闭流!
}
}
运行结果:
字节输入流: FileInputStream
方法 | 返回值 | 说明 |
---|---|---|
FileInputStream(File f) | 构造方法 | 获取一个文件的字节输入流 |
FileInputStream(String str) | 构造方法 | 获取一个文件的字节输入流 |
read() | int | 读取文件内容(一个字节)返回该字节对应的码值 |
read(byte[] bs) | int | 读取文件内容, bs.length 个字节存入形参数组 返回读取到的字节个数 若读取完则返回 -1 |
import java.io.File;
import java.io.FileInputStream;
public class Demo {
public static void main(String[] args) throws Exception {
File f = new File("D:/新建文件夹/a.txt");
FileInputStream fin = new FileInputStream(f);
byte[] bs = new byte[1024 * 1024]; //一次读取 1024*1024 个字节 即 1mb
int a;
while ((a = fin.read(bs)) != -1) { //循环读取文件内容直到读完
String s = new String(bs, 0, a, "GBK"); //以 GBK 编码将读取到的转换成字符串
System.out.print(s);
}
fin.close(); //不要忘记关闭流!
}
}
运行结果:
是谁在唱歌?
温暖了寂寞!
“此处广告位招租”
字节缓冲输出流: BufferedOutputStream
用法同FileOutputStream 效率更高
方法 | 返回值 | 说明 |
---|---|---|
BufferedOutputStream(FileOutputStream fout) | 构造方法 | 通过字节流获取字节缓冲流 |
字节缓冲输入流: BufferedInputStream
用法同FileInputStream 效率更高
方法 | 返回值 | 说明 |
---|---|---|
BufferedInputStream(FileInputStream fin) | 构造方法 | 通过字节流获取字节缓冲流 |
字符输出流: FileWriter
仅适用于文本文件
方法 | 返回值 | 说明 |
---|---|---|
FileWriter(File f) | 构造方法 | 根据File对象创建一个文件,并获取其字符输出流(若已存在,则清空内容) |
FileWriter(String str) | 构造方法 | 根据 str 路径创建一个文件,并获取其字符输出流 |
FileWriter(String str, boolean b) | 构造方法 | 根据 str 路径创建一个文件,并获取其字符输出流 b:续写开关 true则不清空 |
write(char[] cs) | void | 写入字符 |
write(char[] cs, int i1, int i2) | void | 写入字符从第 i1 个开始,写入i2个 |
write(String str) | void | 写入字符串 |
write(String str, int i1, int i2) | void | 写入字符串从第 i1 个字符开始,写入i2个 |
import java.io.File;
import java.io.FileWriter;
public class Demo {
public static void main(String[] args) throws Exception {
File f = new File("D:/新建文件夹/a.txt");
FileWriter fw =new FileWriter(f);
fw.write("白云悠悠蓝天依旧\n泪水在漂泊\n\"此处广告位招租\""); //字符流可以直接输出字符,不必转换为字节,但只适用于文本文件
fw.close();
}
}
运行结果:
字符输入流: FileReader
仅适用于文本文件
方法 | 返回值 | 说明 |
---|---|---|
FileReader(File f) | 构造方法 | 获取一个文件的字符输入流 |
FileReader(String str) | 构造方法 | 获取一个文件的字符输入流 |
read() | int | 读取文件内容(一个字符) 返回对应码值 |
read(char[] cs) | int | 读取文件,数组长度个字符存入数组 返回读取的字节个数 若读取完则返回 -1 |
import java.io.File;
import java.io.FileReader;
public class Demo {
public static void main(String[] args) throws Exception {
File f = new File("D:/新建文件夹/a.txt");
FileReader fr = new FileReader(f);
char[] cs = new char[1024 * 1024]; //一次读取 1024*1024 个字符 注: 一个字符不一定为一个字节,故此处不一定为 1mb
int a;
while ((a = fr.read(cs)) != -1) {
String s = new String(cs, 0, a);
System.out.println(s);
}
fr.close();
}
}
运行结果:
白云悠悠蓝天依旧
泪水在漂泊
“此处广告位招租”
字符缓冲输出流: BufferedWriter
用法同FileWriter 效率更高
方法 | 返回值 | 说明 |
---|---|---|
BufferedWriter(FileWriter fw) | 构造方法 | 通过字符流获取字符缓冲流 |
BufferedReader(InputStreamReader inr) | 构造方法 | 将转换流转为字符缓冲流 |
newLine() | void | 写入分行符(换行) |
字符缓冲输入流: BufferedReader
用法同FileReader 效率更高
方法 | 返回值 | 说明 |
---|---|---|
BufferedReader(FileReader fr) | 构造方法 | 通过字符流获取字符缓冲流 |
BufferedWriter(OutputStreamWriter outw) | 构造方法 | 将转换流转为字符缓冲流 |
readLine() | String | 直接读取一行字符串,若没有返回null |
转换输出流: OutputStreamWriter
方法 | 返回值 | 说明 |
---|---|---|
OutputStreamWriter(OutputStream out, “GBK”) | 构造方法 | 将字节流以指定编码转为转换流 |
import java.io.*;
public class Demo {
public static void main(String[] args) throws Exception {
File f = new File("D:/新建文件夹/a.txt");
FileOutputStream fout = new FileOutputStream(f); //字节输出流
OutputStreamWriter out = new OutputStreamWriter(fout, "UTF-8"); //转换输出流
BufferedWriter bw = new BufferedWriter(out); //字符输出流
bw.write("随风奔跑自由是方向");
bw.close();
}
}
运行结果:
转换输入流: InputStreamReader
转换流一般用于解决中文乱码
可以将字节流以指定编码转换为字符缓冲流
方法 | 返回值 | 说明 |
---|---|---|
InputStreamReader(new InputStream(路径), “GBK”) | 构造方法 | 将字节流以指定编码转为转换流 |
import java.io.*;
public class Demo {
public static void main(String[] args) throws Exception {
File f = new File("D:/新建文件夹/a.txt");
FileInputStream fin = new FileInputStream(f); //字节输入流
InputStreamReader in = new InputStreamReader(fin, "UTF-8"); //转换输入流
BufferedReader br = new BufferedReader(in); //字符输入流
char[] cs = new char[1024 * 1024];
int a;
while ((a = br.read(cs)) != -1) {
String s = new String(cs, 0, a);
System.out.println(s);
}
}
}
运行结果:
随风奔跑自由是方向
对象输出流: ObjectOutputStream
想要被输出对象中必须实现: Serializable接口
若对象类被修改则会抛出异常,需要给对象类增加序列号(private static final long serialVersionUID)
方法 | 返回值 | 说明 |
---|---|---|
ObjectOutputStream(FileOutputStream fout) | 构造方法 | 通过字节流获取对象流 |
writeObject(Object obj) | void | 直接将对象输出 |
import java.io.*;
public class Demo {
public static void main(String[] args) throws Exception {
File f = new File("D:/新建文件夹/a.txt");
FileOutputStream fout = new FileOutputStream(f);
ObjectOutputStream out = new ObjectOutputStream(fout); //对象输出流
Student student = new Student();
student.setName("张三");
student.setAge(21);
out.writeObject(student);
out.close();
}
}
class Student implements Serializable { //对象类
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
运行结果:
对象输入流: ObjectInputStream
方法 | 返回值 | 说明 |
---|---|---|
ObjectInputStream(FileInputStream fin) | 构造方法 | 通过字节流获取对象流 |
readObject() | Object | 直接读取对象 |
import java.io.*;
public class Demo {
public static void main(String[] args) throws Exception {
File f = new File("D:/新建文件夹/a.txt");
FileInputStream fin = new FileInputStream(f);
ObjectInputStream in = new ObjectInputStream(fin);
Student student = (Student) in.readObject();
System.out.println(student);
in.close();
}
}
class Student implements Serializable {
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
运行结果:
Student{name=‘张三’, age=‘21’}