流的分类:
- 根据流的操作的方式分类:输入流和输出流
- 根据数据的类型分类:字节流和字符流
- 字节流:传输的是字节,可以传输任意类型的数据。----视频,音频,文件,图片等。
- 字符流:传输的也是字节,不同点在于传输过程中加入了编码的操作,让我们在传输字符的时候更加便捷。----文件。
- 字节流:–对应的父类
- 字节输入流:InputStream
- 字节输出流:OutputStream
- 字符流:–对应的父类
- 字符读入流(将数据输入内存):Reader
- 字符写出流(将数据从内存取出):Writer
- 流的体系
- 缓冲流
为了提高数据读写的速度,Java API提供了带缓冲功能的流类,在使用这些流类时,会创建一个内部缓冲区数组,缺省使用8192个字节(8Kb)的缓冲区。
缓冲流要“套接”在相应的节点流之上,根据数据操作单位可以把缓冲流分为:
BufferedInputStream 和 BufferedOutputStream
BufferedReader 和 BufferedWriter
- 转换流
转换流提供了在字节流和字符流之间的转换。
InputStreamReader:将InputStream转换为Reader
OutputStreamWriter:将Writer转换为OutputStream
- 常见的编码表
ASCII:美国标准信息交换码。用一个字节的7位可以表示。
ISO8859-1:拉丁码表。欧洲码表用一个字节的8位表示。
GB2312:中国的中文编码表。最多两个字节编码所有字符
GBK:中国的中文编码表升级,融合了更多的中文文字符号。最多两个字节编码
Unicode:国际标准码,融合了目前人类使用的所有字符。为每个字符分配唯一的字符码。所有的文字
都用两个字节来表示。
UTF-8:变长的编码方式,可用1-4个字节来表示一个字符
- 标准输入、输出流
System.in和System.out分别代表了系统标准的输入和输出设备
默认输入设备是:键盘,输出设备是:显示器
System.in的类型是InputStream
System.out的类型是PrintStream,其是OutputStream类,FilterOutputStream 的子类
- 对象流
ObjectInputStream和OjbectOutputSteam:用于存储和读取基本数据类型数据或对象的处理流。它的强
大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。
序列化:用ObjectOutputStream类保存基本类型数据或对象的机制。
反序列化:用ObjectInputStream类读取基本类型数据或对象的机制。
- 对象的序列化
对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。当其它程序获取了这种二进制流,就可以恢复成原来的Java对象。序列化的好处在于可将任何实现了Serializable接口的对象转换为字节数据,使其在保存和传输时可被还原。序列化是RMI(Remote Method Invoke-远程方法调用)过程的参数和返回值都必须实现的机制。而RMI是javaEE的基础,因此序列化机制是JavaEE平台的基础。如果需要让某个对象支持序列化机制,则必须让对象所属的类及其属性是可序列化的,为了让某
个类是可序列化的,该类必须实现如下两个接口之一,否则会抛出NotSerializableException。
通常实现Serializable - 瞬态关键字
当一个类的对象需要被序列化时,某些属性不需要被序列化,这时不需要序列化的属性可以使用关键字transient修饰。只要被transient修饰了,序列化时这个属性就不会琲序列化了。同时静态修饰也不会被序列化,因为序列化是把对象数据进行持久化存储,而静态的属于类加载时的数据,不会被序列化。
public class Person implements Serializable {
/** 给类显示声明一个序列版本号。 */
private static final long serialVersionUID = 1L;
private static String name;
private transient/*瞬态*/
int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
......
}
文件复制