一、概念
1、IO流:流就是内存和存储设备之间传输数据的通道、管道。
2、流的分类
(1)按照方向分:【以jvm为参照物】
a. 输入流:将 存储设备 中的数据读取到 jvm内存 中,读操作
b. 输出流:将 jvm内存 中的数据写出到 存储设备 中,写操作
(2)按照单位分:
a. 字节流:以字节为单位,可以操作所有类型文件
b. 字符流:以字符为单位,只能操作文本文件(以记事本打开,但是不丢失原有内容的文件,例如.java .html)
(3) 按照功能分:
a.节点流:只具有基本的读写功能
b.过滤流:在节点流的基础上,增强新的功能
二、字节流
1、字节流的父类:【抽象类】
InputStream:字节输入流,对应的为读操作,read方法
OutputStream:字节的输出流,对应的为写操作,write方法
2、字节节点流:
(1) FileOutputStream:文件字节的输出流
a. 常见的构造方法:
a.1. FileOutputStream fos = new FileOutputStream("操作的文件路径及文件名");
i.参数:代表操作的路径及文件名,e:/test/a.txt 或者 e:\\test\\a.txt
ii.如果指定的文件不存在,则系统默认创建文件;但是指定的文件夹如果不存在,则报错,错误信息为 java.io.FileNotFoundException(系统找不到指定的路径)。
iii.绝对路径:盘符:/文件夹/文件名 (不通用)
iv.相对路径:文件夹/文件名,默认在当前project中查找有没有指定的文件夹及文件,如果指定文件不存在,则系统默认创建一个新文件;如果指定文件夹不存在,则运行报错,错误信息为 java.io.FileNotFoundException(系统找不到指定的路径)。
a.2. FileOutputStream fos = new FileOutputStream("操作的文件路径及文件名",true);
i. 参数:第一个参数代表操作文件路径及文件名
第二个参数代表是否在原有包中内容进行追加新内容
true:不会覆盖原有内容(追加)false:覆盖原有内容
b.常见功能方法:
void write(int n):将单个字节内容写入到文件中
void close():关闭流,释放所有系统资源
(2) FileInputStream:文件字节的输入流
a.常用构造方法:
FileInputStream fis = new FileInputStream("");
参数说明:代表读取文件路径(文件名)
注意:如果指定文件不存在,则运行报错,错误信息为:java.io.FileNotFoundException(系统找不到指定的文件)。
b. 常用功能方法:
int read():一次读取一个字节的内容,将读取到的字节内容作为返回值返回,如果达到文件的尾部,则返回-1
(3)文件上传与下载
a.txt 拷贝到 b.txt
// 1. 创建文件字节输入流和输出流
FileInputStream fis = new FileInputStream("");
FileOutputStream fos = new FileOutputStream("");
// 2. 边读边写
while(true){
int n= fis.read();
if(n==-1) break;
fos.write(n);
}
// 3. 关闭流
fis.close();
fos.close();
3、字节过滤流
(1) ObjectOuptStream:字节过滤输出流
a. 创建过滤流对象时,需要节点流作为基础流
// 1. 创建节点流作为基础流
FileOutputStream fos = new FileOutputStream("");
// 2. 创建过滤流对象,将基础流作为参数传递
ObjectOutputStream s=new ObjectOutputStream(fos);
b. 可以将8种基本数据类型写入到文件中
c. writeObject(Object obj):将对象写入文件中
4、对象序列化:
a. 对象序列化:对象在流上传输过程称为对象序列化
b. 对象序列化的要求:参与对象序列化的对象对应的类必须实现java.io.Serializable接口(标记接口/空接口
c. 被 transient修饰的属性不参与对象序列化
d. 达到文件尾部的标记为:java.io.EOFException
e. 如果参与对象序列化的对象中有定义类型的属性时,该属性对应类需要实现 java.io.Serializable接口
写入学生信息
学生类
读出学生信息
结果展示
三、编码
1、常见编码:【理解】
ASCII码值:美国制定的第一个标准表
ISO8859-1:西欧编码,底层占用一个字节
GBK:目前主流的中国汉字编码表,2万多汉字
GB2312:最早的中国汉字编码表,6000多汉字
GB18030:汉字的编码表,7万多中国符号
Big5:中国繁体,中国台湾应用
UTF-8:万国码,底层采用动态编码,汉字占2~3字节
注意:编码方式书写不区分大小写,utf-8等价 UTF-8
2、编码和解码
编码:将字符对应的十进制转换为二进制的过程
解码:将二进制转换为十进制对应字符的过程
注意:实际开发当编码方式和解决方式一致,才不会出现乱码
四、字符流
1、字符流的父类【抽象类】
(1) Reader:字符输入流,对应读操作
(2) Writer:字符输出流,对应的写操作
2、字符节点流
(1) FileWriter:文件字符输出流 void write(int n):将单个字符写入到文件
(2) FileReader:文件字符输入流 int read():一次读取一个字符的内容,将读取内容作为返回值进行返回,如果达到文件的尾部,则返回-1
3、字符过滤流
(1) BufferReader:
String readLine():一次读取一个文本行内容,当达到文 件尾部,返回null
while(true){
String n = br.readLine();
if(n==null) break;
System.out.println(n);
}
(2) PrinterWriter:
print(参数):将对应的数据写入到文件中,不换行
println(参数):将对应的数据写入到文件中,自动换行
代码展示
结果展示
4、桥转换流 【需要设置编解码格式应用】
(1) 桥转换流:InputStreamReader/OutputStreamWriter
(2) 作用:字节流和字符流之间转换一个桥梁;可以设置编解码格式
(3) 开发步骤:
// 1. 创建字节节点流对象:
FileInputStream / FileOutputStream
// 2. 创建桥转换流:可以设置编解码格式
InputStreamReader / OutputStreamWriter
// 3. 包装过滤流,目的增强读写操作(看需求)
BufferedReader / PrintWriter
// 4. 读写操作
// 5. 关闭流:关闭最外层即可
五、File类
1、File类和IO流区别
(1) File类:代表一个文件或是文件夹,利用File类中的一些功能对文件进行操作,例如:删除文件、判断文件是否存在、获取文件名字
(2) IO流:对文件内容直接操作,读取文件内容或者是往文件中写内容
2、File常见操作
(1) 构造方法:File file = new File("文件路径及文件名");
(2) 常见功能方法:
boolean exists():判断文件是否存在,存在-true;不存在-false
String getName():获取文件名字,带有后缀,a.txtString
getAbsolutePath():获取绝对路径
3、实际开发应用:
利用File指定操作的文件,然后利用IO流对文件进行操作
File file = new File("文件路径及文件名");
FileInputStream fis = new FileInputStream(file);