承接上篇博客的目录
(3)对象流ObjectOutputStream类和ObjectInputStream类
这篇博客承接上篇博客:上篇博客链接
(3)对象流ObjectOutputStream类和ObjectInputStream类
使用对象流能够在保存和恢复数据时保留数据的值和数据类型。
补充知识:序列化与反序列
序列化:保存数据时保存数据的值和数据类型 反序列化:在恢复数据时,恢复数据的值和数据类型 需要让某个对象支持序列化机制,则必须让其类是可序列化的,为了让某个类是可序列化的该类必须实现如下两个接口之一: Serializable 这是一个标记接口没有方法 Externalizable 该接口有方法要实现所以一般实现上面的那个接口 ObjectOutputStream 提供序列化功能 ObjectInputStream 提供反序列化功能
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* @QQmian
* @version 1.0
* 演示ObjectOutputStream的使用,完成数据序列化
*/
public class FileIObjectStream {
public static void main(String[] args) throws Exception {
//序列化后保存的文件格式不是纯文本,而是按照它的格式储存
String filePath = "D:\\javacode\\hello.txt";
ObjectOutputStream ios = new ObjectOutputStream(new FileOutputStream(filePath));
ios.write(100);//int类型的100封装成Integer类的对象了,下面相同也是这样的
ios.writeBoolean(true);
ios.writeChar('a');
ios.writeDouble(9.5);
ios.writeUTF("雲雲太强了!");
ios.writeObject(new Yun("YunYun", 19));
ios.close();
System.out.println("数据序列化形式保存完毕");
}
//如果要序列化某个类的对象必须实现接口
}
class Yun implements Serializable {
private String name;
private int age;
public Yun(String name, int age) {
this.name = name;
this.age = age;
}
}
这里序列化了,所以hello.txt文档中会出现很多看起来奇奇怪怪的东东:
接下来我们试着用ObjectInputStream把这玩意反序列化一下:
package com.bluemsun.QQmian;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class JavaObjectInputStream {
public static void main(String[] args) throws IOException {
String Path = "D:\\javacode\\hello.txt";
ObjectInputStream ios = new ObjectInputStream(new FileInputStream(Path));
//读取(反序列)时必须和保存(序列化)数据时的顺序一致
System.out.println(ios.readInt());
System.out.println(ios.readBoolean());
System.out.println(ios.readChar());
System.out.println(ios.readDouble());
System.out.println(ios.readUTF());
try {
System.out.println(ios.readObject());
}catch(Exception e){
e.printStackTrace();
}
ios.close();
System.out.println("数据反序列化完毕");
}
}
这里会发现一个很奇怪的事情——最后一行是不是输出和我们想象的不一样!
package com.bluemsun.QQmian;
import java.io.*;
public class JavaObjectInputStream {
public static void main(String[] args) throws IOException {
String Path = "D:\\javacode\\hello.txt";
ObjectInputStream ios = new ObjectInputStream(new FileInputStream(Path));
//读取(反序列)时必须和保存(序列化)数据时的顺序一致
System.out.println(ios.readInt());
System.out.println(ios.readBoolean());
System.out.println(ios.readChar());
System.out.println(ios.readDouble());
System.out.println(ios.readUTF());
try {
System.out.println(ios.readObject());
}catch(Exception e){
e.printStackTrace();
}
ios.close();
System.out.println("数据反序列化完毕");
}
}
class Yun implements Serializable {
private String name;
private int age;
public Yun(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Yun{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
为了解决这个问题需要重写toString方法,同时还要将Yun类放在该类文件下才行。因为我们需要将Yun类的定义拷贝到需要引用的地方。
个人理解:理解不清楚,反正很多与文件有关的东西它就要catch异常,一般写代码的时候标红了我就去catch一下,throws一下就行了。
(4)标准输入输出流
这个玩意很常用默认的输入设备是键盘,输出设备是显示器。
System.in 标准输入
System.out 标准输出
package com.bluemsun.QQmian;
import java.io.PrintStream;
import java.util.Scanner;
public class StandardIO {
public static void main(String[] args) {
//System类里面的 public static final InputStream in = null;
//System.in编译类型是 InputStream
//System.in运行类型是 BufferedInputStream
System.out.println(System.in.getClass());
// public static final PrintStream out = null;
//System.out编译类型是 PrintStream
//System.out运行类型是 PrintStream
System.out.println(System.out.getClass());
Scanner input = new Scanner(System.in);
String next = input.next();
System.out.println("next = " + next);
}
}
预习就到这儿了,JavaIO流其实还有很多知识点,之后慢慢学咯~