一:节点流:
1.字节流:能处理一切文件,纯文本、视频、图片、音频
1)文件字节流:(以文件为源头)FileInputStream
FileOutputStream
2)数组字节流:(以数组为源头)ByteArrayInputStream
ByteArrayOutputStream toByteArray()新增方法,操作不同
2.字符流:只能处理纯文本文件
1)文件字节流:FileReader
FileWriter
2)数组字节流:CharArrayInputStream
CharArrayOutputStream
二:处理流:增强节点流的功能,提高可靠性
1.缓冲流:1)字节缓冲流:BufferedInputStream BufferedOutputStream
2)字符缓冲流:BufferedReader readLine() 一行一行的读取
BufferedWriter newLLine() 换行 相当于"\r\n"
注意运用新增方法时,不能使用多态
2.转换流:只能把字节流转换成字符流的,不能把字符流转换成字节流
1).编码与解码概念:
编码:二进制 编码字符集 字符
解码:字符 解码字符集 二进制
2).乱码原因:
1)编码与解码字符集不统一
2)字节缺少,长度丢失
3). InputStreamReader 解码(读取操作)
OutputStreamWriter 编码(写入操作)
3.处理 基本数据类型+String 保存类型
DataInputStream readXxx()
DataOutputStream writeXxx()
注意点:1)读取的顺序与写入的顺序必须相同
2)写入到文件中的内容由于保存了数据类型,因此我们无法识别,但计算机可以识别
4.处理 对象 保存对象
其实4相当于3的增强版,除了3的功能外,还可以处理对象类型:
ObjectInputStream readObject() 对象的反序列化
ObjectOutputStream writeObject() 对象的序列化
注意:1) 不是所用的对象都能序列化 必须是实现了java.io.Serializable接口才能序列化
2) 不是所有的属性都需要序列化,不想序列化的属性使用 transient关键字
5.打印流:PrintStream
System.in 从键盘输入
System.out 从控制台输出
System.err 和out差不多
注意:1)可以改变流向,比如不从键盘接收数据,而从文件中接收数据、输出数据到文件而不是到控制台
2)在System中定义了标准控制台:FileDescriptor.in
FileDescriptor.out
可以使用setIn() 和 setOut() 方法进行重定向
三:在流的操作中经常需要关闭流,大量的关闭会很繁琐,基于封装的思想,可以建立一个工具类来专门关闭流:
/**
* 工具类:关闭流
* 可变参数:... 表示可以有很多参数,只能在形参的最后一个位置,处理起来和数组一样
* jdk1.7新增特性可以用try-with-resource实现该功能
*/
/*
public static void closeAll(String str, Closeable ... io) {
}// 没有问题
public static void closeAll(Closeable ... io, String str) {
}// 有问题
*/
/**
* 面向接口编程,实现了Closeable接口的类都有close()方法
* @param obj
*/
public static void closeAll(Closeable ... io) {
for(Closeable temp: io) {
if(null != temp) {
try {
temp.close();
} catch (IOException e) {
System.out.println("关闭流异常");
e.printStackTrace();
}
}
}
}