1 File
- File可以将程序和电脑的文件夹或者文件关联起来
相对路径
绝对路径
2 基本概念
分类
- 流向
输入流,输出流
- 数据
字节流:二进制,可以使一切文件包括文件,文本音视频
字符流:文本文件,只可以处理纯文本
- 功能
节点流:包裹源头
处理流:增强功能,提供性能
字节流和字符流
- 字节流
- 输入流
InputStream;
read(byte[] b)
read(byte[] b,int off,int len);
close();
- 输出流
OutputStream;
write(byte[] b) + flush() + close()
- 字符流
- 输入流:Reader
read(char[] buffer)
- 输出流:Writer
write(byte[] buffer)+flush()+close()
2 字节流
步骤:
- 建立与文件的联系
- 选择对应流
- 读取|写出
- 数组大小读取或者写出
- 释放资源
读取文件与写出文件与拷贝
- 读取
// 建立联系
File file = new File("F://zhao.txt");
// 选择流
InputStream inputStream = new FileInputStream(file);
// 读取的大小每次
byte[] b = new byte[10];
int len = 0;// 实际读取的字节数
while((len = inputStream.read(b)) != -1){
System.out.println(len);
}
inputStream.close();
- 写入文件
FileOutputStream(File file) // 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(File file, boolean append) //创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(String name) // 创建一个向具有指定名称的文件中写入数据的输出文件流。
FileOutputStream(String name, boolean append) // 创建一个向具有指定 name 的文件中写入数据的输出文件流。
// f://zhaodi.txt在写的时候自动创建这个文件
OutputStream os = new FileOutputStream(new File("f://zhaodi.txt"),true);
String info ="zhaodi is 赵迪";
// 字符串转字节
byte[] data = info.getBytes();
os.write(data);
os.flush();
- 拷贝文件
就是先读取一个文件,然后写到另一个文件
InputStream is = null;
OutputStream os = null;
os = new FileOutputStream("f://zhaodiishao.txt",true);
is = new FileInputStream(new File("f://zhao.txt"));
byte[] car = new byte[1024];
int len = 0;
while((len = is.read(car)) != -1){
os.write(car);
}
os.flush();
is.close();
os.close();
- 拷贝文件夹
3 字符流
只可以操作纯文本
步骤:
- 建立联系
- 选择流 Writer、Reader
- 读取|写出 char[] data = new char[10] 注意这里是字符数组!!
- 关闭
原理同字节流,此处省略
4 处理流
- 节点流处于io操作的第一线,所有操作必须通过他们进行;处理流可以对其它流进行处理(提高效率或者操作灵活性)
- 记住处理流是对其它流的处理哦
- 提高性能,增强功能
字节缓冲流
- 字节缓冲流
没有加入新的方法
InputStream is = null;
OutputStream os = null;
os = new BufferedOutputStream(new FileOutputStream("f://zhaodiishao.txt",true));
is = new BufferedInputStream(new FileInputStream(new File("f://zhao.txt")));
byte[] car = new byte[1024];
int len = 0;
while((len = is.read(car)) != -1){
os.write(car);
}
os.flush();
is.close();
os.close();
字符缓冲流
加入新的重要的方法
readLine() //读取一个文本行,包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
newLine() // 写入一个行分隔符
// 选择流
BufferedReader bufferedReader = null;// 多态是不可以访问新增加的方法的所以这里不可以使用多态
BufferedWriter bufferedWriter = null;
try {
// 包装节点流
bufferedReader = new BufferedReader(new FileReader(new File("f://zhao.txt")));
bufferedWriter = new BufferedWriter(new FileWriter(new File("f://zhaozhao.txt")));
String line_info = null;
// 读取 写入
while((line_info=bufferedReader.readLine())!=null){
bufferedWriter.write(line_info);
bufferedWriter.newLine();
}
bufferedWriter.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
// 关闭
bufferedReader.close();
bufferedWriter.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
转换流
作用
- 字节流转换为字符流
- 处理乱码编码集
- 解码
编码
graph LR
字符-->二进制
解码
graph LR
二进制-->字符
乱码出现原因
- 编码与解码的字符集不统一
String user_name = "zhaodi 赵迪";
// 编码
byte[] data = user_name.getBytes("utf-8");
// 解码
String user_name1 = new String(data,"utf-8");
System.out.println(user_name1);
- 字节缺少,长度丢失
5 序列化,反序列化
程序运行时,只要需要,对象可以一直存在,并且我们可以随时访问对象的一些状态信息,如果程序终止,那么对象是肯定不会存在的,但是有时候,我们需要再程序终止时保存对象的状态信息,之后程序再次运行时可以重新恢复到之前的状态,如,玩家玩游戏退出时,需要保存玩家的状态信息(如等级、装备等等),之后玩家再此登入时,必须要恢复这些状态信息。我们可以通过数据库手段来达到这个保存状态的目的,在Java中,我们有更简便的方法进行处理,那就是序列化与反序列化。序列化是一种对象持久化的手段,反序列化与序列化相反,其是通过序列化后的信息重新组装成对象。
-序列化 需要实现Serializable 接口,反序列化不需要