首先要序列化的对象必须实现一个Serializable接口(这是一个标识接口,不包括任何方法)
1public interface Serializable {2}
其次需要是用两个对象流类:ObjectInputStream 和ObjectOutputStream。主要使用ObjectInputStream对象的readObject方法读入对象、ObjectOutputStream的writeObject方法写入对象到流中
下面我们通过序列化机制将一个简单的pojo对象写入到文件,并再次读入到程序内存。
1public class User implements Serializable {2 private String name;
3 private int age;
4
5 public User(String name, int age) {
6 this.name = name;
7 this.age = age;
8 }
9
10 @Override
11 public String toString() {
12 return "User{" +
13 "name='" + name + '\'' +
14 ", age='" + age + '\'' +
15 '}';
16 }
17
18 public static void main(String[] args) throws IOException, ClassNotFoundException {
19 User user = new User("二营长",18);
20 ObjectOutputStream objectOps = new ObjectOutputStream(new FileOutputStream("f:/user.out"));
21 objectOps.writeObject(user);
22 objectOps.close();
23
24 // 再从文件中取出对象
25 ObjectInputStream objectIns = new ObjectInputStream(new FileInputStream("f:/user.out"));
26
27 // 这里要做一次强转
28 User user1 = (User) objectIns.readObject();
29 System.out.println(user1);
30 objectIns.close();
31 }
32}
33
程序运行结果:
1User{name='二营长', age='18'}不想序列化的数据使用transient(瞬时)关键字屏蔽
如果我们上面的user对象有一个password字段,属于敏感信息,这种是不能走序列化的方式的,但是实现了Serializable 接口的对象会自动序列化所有的数据域,怎么办呢?在password字段上加上关键字transient就好了。
1 private transient String password;序列化机制就简单介绍到这里吧。这是Java原生的序列化,现在市面上有好多序列化协议可以选择,比如Json、FastJson、Thrift、Hessian 、protobuf等。
I/O流的典型使用方式IO流种类繁多,可以通过不同的方式组合I/O流类,但平时我们常用的也就几种组合。下盘通过示例的方式盘点几种I/O流的典型用法。
缓冲输入文件
1public class BufferedInutFile {2 public static String readFile(String fileName) throws IOException {
3 BufferedReader bf = new BufferedReader(new FileReader(fileName));
4 String s;
5
6 // 这里读取的内容存在了StringBuilder,当然也可以做其他处理
7 StringBuilder sb = new StringBuilder();
8 while ((s = bf.readLine()) != null){
9 sb.append(s + "\n");
10 }
11 bf.close();
12 return sb.toString();
13 }
14
15 public static void main(String[] args) throws IOException {
16 System.out.println(BufferedInutFile.readFile("d:/1.txt"));
17 }
18}
格式化内存输入