java的序列化流和打印流

对象操作流(序列化流)

每次读取和写出的都是JavaBean对象.

  • 序列化:将对象写入到文件中的过程

  • 反序列化:从文件中读取对象到程序的过程

  • transient: 标识瞬态,序列化的时候,该修饰符修饰的成员不能序列化

ObjectOutputStream

  • 构造方法:
    • public ObjectOutputStream(OutputStream out) : 创建一个指定OutputStream的ObjectOutputStream。
  • 特有方法:
    • public final void writeObject (Object obj) : 将指定的对象写出。

ObjectInputStream

  • 构造方法:

    • public ObjectInputStream(InputStream in) : 创建一个指定InputStream的ObjectInputStream。
  • 特有方法:

    • public final Object readObject () : 读取一个对象。
  • java.io.EOFException : 数据输出流到了末尾,继续读取会抛出此异常(读到文件的末尾)

    • 解决方案:使用集合存储要写出的对象,写数据的时候只需要写一个集合对象,下次使用的时候只需要读取了一次就可以.

举个例子:

package review.serializable;

import lombok.*;

import java.io.Serializable;
import java.net.ServerSocket;

/**
 * 创建学生类
 * 利用lombok可以使用注解来写get,set等方法,使实体类看起来很简单
 * @author WZLOVE
 * @create 2018-07-25 19:17
 */
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student implements Serializable {

    private static final long serialVersionUID = -1495868075552053159L;
    private String name;
    private int age;
    private double score;

}


package review.serializable;

import java.io.*;
import java.util.ArrayList;

/**
 * 测试序列化流
 *
 * @author WZLOVE
 * @create 2018-07-25 19:19
 */
public class SerializableDemo {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // 创建对象输出流
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("stu1.txt"));
        // 向文件中输出数据(为了方便读取,所以存入集合,这样的话,读取的时候只用读取一次,查看源码也可以看出,集合也实现了Serializable接口)
        ArrayList<Student> list = new ArrayList<>();
        // 向集合中添加数据
        list.add(new Student("stu1",23,100.0));
        list.add(new Student("stu2",23,98.0));
        list.add(new Student("stu3",24,96.0));
        // 利用对象输入流向文件中写入内容
        oos.writeObject(list);
        oos.close();

        // 创建对象输入流
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("stu1.txt"));
        // 利用对象输入流获取文件内容
        Object object = ois.readObject();
        // 强制类型转换,将Object转换为集合
        ArrayList<Student> arrayList = (ArrayList<Student>)object;
        // 进行遍历
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.println(arrayList.get(i));
        }
        // 关闭流
        ois.close();

    }
}

打印流(只有输出流)

  • 字节打印流(了解)
    • PrintStream:
  • 字符打印流(掌握)
    • PrintWriter
      • 构造方法:

        1. public PrintStream(String fileName) : 使用指定的文件名创建一个新的打印流。
        2. PrintWriter(File file) 使用指定的文件创建一个新的PrintWriter,而不需要自动的线路刷新。
        3. PrintWriter(OutputStream out) 从现有的OutputStream创建一个新的PrintWriter,而不需要自动线路刷新。
        4. PrintWriter(Writer out) 创建一个新的PrintWriter,没有自动线冲洗(追加内容考虑参数的变化)。
        5. PrintWriter(Writer out, boolean autoFlush)创建一个新的PrintWriter。
        6. PrintWriter(OutputStream out, boolean autoFlush) 从现有的OutputStream创建一个新的PrintWriter。
      • 特有方法(自动换行(实现自动换行,必须使用println方法)和自动刷新(在构造方法中启用并且要使用println()方法)功能):

        1. void println(Object x) 打印一个对象,然后终止该行。

注意:

  1. 实现自动换行必须使用PrintWriter中特有的方法println
  2. 实现自动刷新必须满足两个要求,第一个是在构造方法中启用自动刷新,第二个是使用PrintWriter中特有的方法println

举个例子:

package review.print;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 测试打印流的书写
 * 打印流也是用写文件的,简单的是他能实现自动刷新和自动换行,其他的都简单,就不演示了
 * 打印流分为打印字节流和打印字符流
 * @author WZLOVE
 * @create 2018-07-25 19:55
 */
public class PrintWriteDemo {

    public static void main(String[] args) throws IOException {
        // 打印流只有输出流
        // 创建打印字符流对象(一个true表示追加,第二个true代表开启自动刷新)
        PrintWriter pw = new PrintWriter(new FileWriter("pw.txt",true),true);
        // 利用特有的方法进行输出(无论是自动刷新还是自动换行,都要利用这个特有的方法)
        pw.println("qazxswedc,我爱你");
        pw.println("qazxswedc,我爱你");
        pw.println("qazxswedc,我爱你");
        // 关闭流
        pw.close();
    }

}
原文地址:https://www.cnblogs.com/wadmwz/p/9368443.html