zoukankan      html  css  js  c++  java
  • 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();
        }
    
    }
  • 相关阅读:
    不开心吗?那来看看这组治愈漫画吧!
    TF、Keras错误解决:TypeError: Cannot interpret feed_dict key as Tensor ...... is not an element of this graph.
    【JMeter】HTTP请求示例以及事务控制器的使用
    <%=BASE_URL%>根目录
    vue循环多个form表单,v-model绑定值一样的问题。
    vue 具名插槽
    vue 实现子组件改变数据,父组件实时更新 (使用.sync修饰符就可以实现)
    vue-cli3快速创建项目
    js关于Blob对象的使用
    AnyCAD C#开发-TopoShapeConvert辅助类TopoShape转换为SceneNode
  • 原文地址:https://www.cnblogs.com/wadmwz/p/9368443.html
Copyright © 2011-2022 走看看