【转换流】(JDK11之前)
【概述】:
转换流就是来进行字节流和字符流之间转换的
InputStreamReader是从字节流到字符流的桥梁
OutputStreamWriter是从字符流到字节流的桥梁
【构造方法】:
InputStreamReader(InputStream in):创建一个使用默认字符集的InputStreamReader
InputStreamReader(InputStream in, String charsetName):创建一个使用命名字符集的InputStreamReader
OutputStreamWriter(OutputStream out):创建一个使用默认字符集的OutputStreamWriter
OutputStreamWriter(OutputStream out, String charsetName):创建一个使用命名字符集的OutputStreamWriter
例:
InputStreamReader isr=new InputStreamReader(new FileInputStream("stream_io\\b.txt"),"UTF-8");
int ch;
while ((ch=isr.read())!=-1){
System.out.println((char) ch);
}
isr.close();
OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("stream_io\\c.txt"),"UTF-8");
osw.write("我爱学习!");
osw.close();
【字符流】(JDK11之后)
FileReader(File file, Charset charset):创建一个新的FileReader,给出File读取和创建charset
FileReader(String fileName, Charset charset):创建一个给定文件名称的FileReader,给出File读取和创建charset
【注意】:
charset需要通过Charset.forName()获取
例:
FileReader fr=new FileReader(new FileReader("stream_io\\b.txt", Charset.forName("UTF-8"));
【对象操作流】
【概述】:
可以把对象以字节的形式写到本地文件
【分类】:
对象操作输出流(对象序列化流):就是将对象写到本地文件中,或者在网络中传输对象
对象操作输入流(对象反序列化流):把写到本地文件中的对象读到内存中,或者接收网络中传输的对象
【构造方法】:
ObjectOutputStream(OutputStream out):创建一个写入指定的OutputStream的ObjectOutputStream
ObjectInputStream(InputStream in):创建一个写入指定的InputStream 的ObjectInputStream
例:
User user=new User("zhangsan","123");
ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("stream_io\\log.txt"));
oos.writeObject(user);
oos.close();
ObjectInputStream ois=new ObjectInputStream(new FileInputStream("stream_io\\log.txt"));
User o=(User)ois.readObject();
System.out.println(o);
ois.close();
【注意】:
- 如果一个对象类的对象能被序列化,那么这个类必须实现一个接口(Serializable)
- 如果出现InvalidClassException异常,则给对象所属的类加一个serialVersionUID
格式:private static final long serialVersionUID = 长整型数据;
例:
private static final long serialVersionUID = 42L;
- 如果一个对象中的某个成员变量的值不想被序列化,就给该成员变量加transient关键字修饰,该关键字标记的成员变量不参与序列化过程
例:
private transient String password;
【对象操作流——示例项目】
创建多个Javabean类对象写到文件中,再次读取到内存
Student s1 = new Student("张三", 23);
Student s2 = new Student("李四", 24);
Student s3 = new Student("王五", 25);
//方法一
ObjectOutputStream oos1 = new ObjectOutputStream(new FileOutputStream("stream_io\\d.txt"));
oos1.writeObject(s1);
oos1.writeObject(s2);
oos1.writeObject(s3);
oos1.close();
ObjectInputStream ois1 = new ObjectInputStream(new FileInputStream("stream_io\\d.txt"));
while (true){
try {
Object o = ois1.readObject();
System.out.println(o);
} catch (EOFException e) {
break;
}
}
ois1.close();
//方法二
ObjectOutputStream oos2 = new ObjectOutputStream(new FileOutputStream("stream_io\\e.txt"));
ArrayList<Student> list=new ArrayList<>();
list.add(s1);
list.add(s2);
list.add(s3);
oos2.writeObject(list);
oos2.close();
ObjectInputStream ois2 = new ObjectInputStream(new FileInputStream("stream_io\\e.txt"));
ArrayList<Student> list2 =(ArrayList<Student>) ois2.readObject();
for (Student student : list2) {
System.out.println(student);
}
ois2.close();