高效流/缓冲流
原理:是在创建对象是,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写 ,减少系统IO次数,从而提高读写的效率
BufferedInputStream 间接继承 InputStream
BufferedOutputStream 间接继承 OutputStream
字节缓冲流:
构造方法:
public BufferedInputStream(InputStream in) :创建一个 新的缓冲输入流。
public BufferedOutputStream(OutputStream out) : 创建一个新的缓冲输出流。
// 创建字节缓冲输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bis.txt"));
// 创建字节缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bos.txt"));
普通流FileInputStream 慢于 BufferedInputStream 慢于 FileInputSteam 的数组流
符缓冲流:
构造方法public BufferedReader(Reader in) :创建一个 新的缓冲输入流。
public BufferedWriter(Writer out) : 创建一个新的缓冲输出流。
特有方法
BufferedReader: public String readLine() : 读一行文字。
BufferedWriter: public void newLine() : 写一行行分隔符,由系统属性定义符号。
转换流
字符编码 Character Encoding :就是一套自然语言的字符与二进制数之间的对应规则
字符集 Charset :是一个系统支持的所有字符的集合
InputStreamReader 子类:(字符输入流)转换流InputStreamReader , 是Reader的子类,是从字节流到字符流的桥梁
它读取字节,并使用指定的字符集将其解码为字符,它的字符集可以由名称指定,也可以接受平台的默认字符集
gbk: 中文占两个字节
utf8: 中文占三个字节
构造方法
InputStreamReader(InputStream in) : 创建一个使用默认字符集的字符流。在idea中默认就是utf-8编码(把字节流转换为字符流)
InputStreamReader(InputStream in, String charsetName) : 创建一个指定字符集的字符流。(把字节流转换为字符流)charseName:指定解析编码
OutputStreamWriter 子类 (字符输出流)转换流 java.io.OutputStreamWriter ,是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集讲字符 编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。
构造方法
OutputStreamWriter(OutputStream in) : 创建一个使用默认字符集的字符流。idea中默认的字符集是utf-8
OutputStreamWriter(OutputStream in, String charsetName) : 创建一个指定字符集的字符流。
序列化流
序列化:ObiectOutputStream 把对象转换为字节保存到文件中 java.io.ObjectOutputStream 类,将java对象的原始数据类型写出到文件,实现对象的持久存储。
构造方法
public ObjectOutputStream(OutputStream out) : 创建一个指定OutputStream的ObjectOutputStream。
写出对象方法
public final void writeObject (Object obj) : 将指定的对象写出。
Student str1=new Student("张三",18,"男");
Student str2=new Student("李四",23,"男");
Student str3=new Student("王小丫",21,"女");
Student str4=new Student("赵六",20,"男");
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("day10\\stu.txt"));
oos.writeObject(str1);
oos.writeObject(str2);
oos.writeObject(str3);
oos.writeObject(str4);
oos.close();
序列化操作注意事项
一个对象要想序列化,必须满足两个条件:
该类必须实现 java.io.Serializable 接口, Serializable 是一个标记接口,不实现此接口的类将不会使任 何状态序列化或反序列化,会抛出 NotSerializableException 异常。
该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用 transient 关键字修饰。
反序列化:ObjectInputStream 把字节重构成对象
ObjectInputStream反序列化流,将之前使用
ObjectOutputStream 序列化的原始数据恢复为对象
构造方法
public ObjectInputStream(InputStream in) : 创建一个指定InputStream的ObjectInputStream
常用方法:
public final Object readObject () : 读取一个对象。
ObjectInputStream ois=new ObjectInputStream(new FileInputStream(“day10\stu.txt”));
Object object1 =ois.readObject();
try {
while (true){
System.out.println(object1);
Object object2 = ois.readObject();
}
}catch (Exception a){
}
ois.close();
反序列化操作注意事项:
1.对于JVM可以反序列化对象,它必须是能够找到class文件的类。如果找不到该类的class文件,则抛出一个 ClassNotFoundException 异常
2.当JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操 作也会失败,抛出一个 InvalidClassException 异常。
解决方案:
Serializable 接口给需要序列化的类,提供了一个序列版本号
serialVersionUID 该版本号的目的在于验证序列化的对象和对应类是否版本匹配
打印流
java.io.PrintStream类,该类能够方便地打印各种数据类型的值,是一种便捷的输出方式。
构造方法
public PrintStream(String fileName): 使用指定的文件名创建一个新的打印流
改变打印流向
System.out 就是PrintStream类型的,只不过它的流向是系统规定的,打印在控制台上。不过我们可以改变它的流向。
//创建一个文本扫描器,用来键盘输入
Scanner scan=new Scanner(System.in);
//提示输入一行字符串
System.out.println("请输入一行字符串:");
//接收键盘输入的字符串
String s = scan.nextLine();
//创建一个打印流路径文件
PrintStream ps=new PrintStream("day10\\d.txt");
//打印到文件
ps.println(s);
//指定打印位置,
d.txt文件System.setOut(ps);
//把键盘接收的字符串打印
System.out.print(s);