数据流:DataOutputStream与DataInputStream的使用

看这两个类的名字就不难猜测出它们的类关系图。

DataOutputStream: 主要是一些writeXxx()操作,写出, 相当于序列化

DataInputStream: 主要是一些readXxx()操作,写入, 相当于反序列化

一般情况下,两者会成对出现。 在使用过程中要特别注意, 一个writeXxx() 对应着一个readXxx(), 千万不要用readInt()去对应writeBoolean().

说白了,就是序列化与反序列化要匹配。

下面举个例子,将Student对象的属性序列化后保存到文件中,然后反序列还原,示例代码如下:

public class Student {
    private int id;
    private String name;
    private long age;
    private boolean gender;

    public Student(int id, String name, long age, boolean gender) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public long getAge() {
        return age;
    }

    public void setAge(long age) {
        this.age = age;
    }

    public boolean isGender() {
        return gender;
    }

    public void setGender(boolean gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name=‘" + name + ‘\‘‘ +
                ", age=" + age +
                ", gender=" + gender +
                ‘}‘;
    }
}
 @Test
    public void testDataStream() throws IOException {
        // 创建一个Student对象
        Student student = new Student(1, "郑钦锋", 100, true);
        // 创建一个DataOutputStream对象
        OutputStream outputStream = new FileOutputStream("E:\\360downloads\\wpcache\\srvsetwp\\student.txt");
        DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
        // 对java的8种基本数据类型进行write操作,其实就相当于序列化操作
        dataOutputStream.writeInt(student.getId());
        dataOutputStream.writeUTF(student.getName());
        dataOutputStream.writeLong(student.getAge());
        dataOutputStream.writeBoolean(student.isGender());
        // 关流
        dataOutputStream.close();

        // 读取文件,进行反序列化操作
        FileInputStream inputStream = new FileInputStream("E:\\360downloads\\wpcache\\srvsetwp\\student.txt");
        DataInputStream dataInputStream = new DataInputStream(inputStream);
        int id = dataInputStream.readInt();
        String name = dataInputStream.readUTF();
        long age = dataInputStream.readLong();
        boolean gender = dataInputStream.readBoolean();

        // 还原这个student对象
        Student retStudent = new Student(id, name, age, gender);
        System.out.println(retStudent);  // Student{id=1, name=‘郑钦锋‘, age=100, gender=true}
        dataInputStream.close();
    }
}

如果序列化与反序列化不匹配,就是个悲剧,请看下面的示例:

  @Test
    public void testDataStream() throws IOException {
        // 创建一个Student对象
        Student student = new Student(1, "郑钦锋", 100, true);
        // 创建一个DataOutputStream对象
        OutputStream outputStream = new FileOutputStream("E:\\360downloads\\wpcache\\srvsetwp\\student.txt");
        DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
        // 对java的8种基本数据类型进行write操作,其实就相当于序列化操作
        dataOutputStream.writeLong(student.getAge());
        dataOutputStream.writeBoolean(student.isGender());
        dataOutputStream.writeUTF(student.getName());
        dataOutputStream.writeInt(student.getId());
        // 关流
        dataOutputStream.close();

        // 读取文件,进行反序列化操作
        FileInputStream inputStream = new FileInputStream("E:\\360downloads\\wpcache\\srvsetwp\\student.txt");
        DataInputStream dataInputStream = new DataInputStream(inputStream);
        int id = dataInputStream.readInt();
        String name = dataInputStream.readUTF();
        long age = dataInputStream.readLong();
        boolean gender = dataInputStream.readBoolean();

        // 还原这个student对象
        Student retStudent = new Student(id, name, age, gender);
        System.out.println(retStudent);  // Student{id=0, name=‘‘, age=28148597348991889, gender=true}
        dataInputStream.close();
    }

所以,write序列化的顺序是: int(id) ---> string(name) ---> long(age)----> boolean(gender);

read反序列化的顺序一定要是: int(id) ---> string(name) ---> long(age)----> boolean(gender);

原文地址:https://www.cnblogs.com/z-qinfeng/p/11789786.html

时间: 2024-10-09 05:07:15

数据流:DataOutputStream与DataInputStream的使用的相关文章

java 数据流DataOutputStream和DataInputstream

java流操作类的认识和总结 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2pjMjExMzIy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" /> 应用实例 import java.io.*; public class DataStreamDemo { public static void main(String[] args) { t

JAVA IO操作:数据操作流:DataOutputStream和DataInputStream

掌握DataOutputStream和DataInputStream的作用. 可以使用DataOutputStream和DataInputStream写入和读取数据. 在IO包中提供了两个与平台无关的数据操作流 数据输出流:DataOutputStream 数据输入流:DataInputStream 通常按照一定格式将输入输出,再按照一定格式将数据输入. 要想使用数据输出流和输入流,则肯定要用户指定数据的保存格式.必须按指定的格式保存数据,才可以将数据输入流将数据读取进来. DataOutput

JavaI/O:简单的使用DataOutputStream和DataInputStream操作文件流

DataInputStream 是数据输入流.它继承于FilterInputStream.DataInputStream 是用来装饰其它输入流,它"允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型".应用程序可以使用DataOutputStream(数据输出流)写入由DataInputStream(数据输入流)读取的数据. DataOutputStream?是数据输出流.它继承于FilterOutputStream.DataOutputStream?是用来装饰其它

DataOutputStream and DataInputStream

        DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("a.txt")));         dos.writeInt(5);         dos.writeBoolean(true);         dos.flush();         dos.close();         DataInputStream dis = new Da

JAVA DataOutputStream和DataInputStream

是Java中输入输出流的装饰类 DataOutputStream 数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中.然后,应用程序可以使用数据输入流将数据读入. 主要方法: void write(byte[] b,int off,int len);//将byte数组off角标开始的len个字节写到OutputStream 输出流对象中. void write(int b);//将指定字节的最低8位写入基础输出流. void writeBoolean(boolean b);/

数据操作流DataOutputStream、DataInputStream类

[例子1] import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class DataOutputStreamDemo{ public static void main(String[] args) throws IOException{ File file = new File("d:" + Fi

Java IO学习笔记(三)转换流、数据流、字节数组流

转换流 1.转换流:将字节流转换成字符流,转换之后就可以一个字符一个字符的往程序写内容了,并且可以调用字符节点流的write(String s)方法,还可以在外面套用BufferedReader()和BufferedWriter,并使用它们的readLine 和 newLine方法. 2.有两种转换流:InputStreamReader.OutputStreamWriter 练习小程序1: package test.io.transfer; import java.io.FileOutputSt

JAVA基础——数据流

DataInputStream 类和DataOutputStream 类 在前面的学习中,我们知道数据流处理的数据都是指字节或字节数组,但实际上很多时候不是这样的,它需要数据流能直接读.写各种各样的java语言的基本数据类型.例如在一个文件中存放300个整数值,从中读取时,希望按int为基本单位进行读取,这样可以大大节省时间.这时就需要使用DataInputStream和DataOutputStream,DataInputStream和DataOutputStream不但支持父类InputStr

数据流和内存流

在前面的学习中,我们知道数据流处理的数据都是指字节或字节数组,但实际上很多时候不是这样的,它需要数据流能直接读.写各种各样的java语言的基本数据类型. DataInputStream和DataOutputStream提供了可以直接存取java基本类型(int,double等)的方法.对于存取基本类型,在效率上比普通字节流要快很多.它们分别继承inputStream和outputStream,并且需要套接在InputStream和OutputStream上. 例如在一个文件中存放300个整数值,