• 输入输出流及其17个类(二)


     DataInputStream和DataOutputStream类

      DataInputStream和DataOutputStream类创建的对象称为数据输入流和数据输出流。这两个流是很有用的两个流,它们允许程序按着机器无关的风格读取Java原始数据。也就是说,当读取一个数值时,不必再关心这个数值应当是多少个字节。

      以下是DataInputStream和DataOutputStream的构造方法。

    DataInputStream(InputStream in)创建的数据输入流指向一个由参数in指定的底层输入流。

    DataOutputStream(OutnputStream out)创建的数据输出流指向一个由参数out指定的底层输出流。

    1. package demo01;
    2. import java.io.DataInputStream;
    3. import java.io.DataOutputStream;
    4. import java.io.FileInputStream;
    5. import java.io.FileNotFoundException;
    6. import java.io.FileOutputStream;
    7. import java.io.IOException;
    8. import java.io.InputStream;
    9. import java.io.OutputStream;
    10. public class DateInputStreamAndDateOutputStream {
    11. public static void main(String[] args) {
    12. //创建InputStream类对象,但是InputStream类是一个抽象类,不能直接创建对象,
    13. // 可以创建引用指向其子类
    14. InputStream is =null;
    15. //创建DataInputStream类对象
    16. DataInputStream dis =null;
    17. //创建OutputStream类对象,但是OutputStream类是一个抽象类,不能直接创建对象,
    18. // 可以创建其引用指向其子类
    19. OutputStream os = null;
    20. //创建DataOutputStream类对象
    21. DataOutputStream dos = null;
    22. try {
    23. is = new FileInputStream("F:/car.jpg");
    24. dis = new DataInputStream(is);
    25. os = new FileOutputStream("F:/runCar.jpg");
    26. dos = new DataOutputStream(os);
    27. int num;
    28. while((num=dis.read())!=-1){
    29. dos.write(num);
    30. }
    31. System.out.println("图片复制完毕");
    32. } catch (FileNotFoundException e) {
    33. e.printStackTrace();
    34. } catch (IOException e) {
    35. e.printStackTrace();
    36. }finally{
    37. try {
    38. dos.close();
    39. os.close();
    40. dis.close();
    41. is.close();
    42. } catch (IOException e) {
    43. e.printStackTrace();
    44. }
    45. }
    46. }
    47. }

    序列化和反序列化 

     序列化是将对象的状态写入到特定的流中的过程

    反序列化则是从特定的流中获取数据重新构建对象的过程

    实现序列化的步骤:

    注意:使用集合保存对象,可以将集合中的所有对象序列化 

    实现反序列化的步骤:

     

     注意:如果向文件中使用序列化机制写入多个对象,那么反序列化恢复对象时,必须按照写入的顺序读取

    对象流:ObjectInputStream和ObjectOutputStream类

            ObjectInputStream和ObjectOutputStream类分别是InputStream和OutputStream类的子类。ObjectInputStream和ObjectOutputStream类创建的对象称为对象输入流和对象输出流。对象输出流使用writeObject(Object obj)方法将一个对象 obj写入到一个文件,对象输入流使用readObject()读取一个对象到程序中。

            ObjectInputStream和ObjectOutputStream类的构造方法如下。                ObjectInputStream(InputStream in)

                            ObiectOutputStream(OutputStream out)

            当使用对象流写入或读入对象时,要保证对象是序列化的。这是为了保证能把对象写入到文件,并能再把对象正确读回到程序中。

            一个类如果实现了Serializable 接口(java.io 包中的接口),那么这个类创建的对象就是所谓序列化的对象。Java 类库提供的绝大多数对象都是所谓序列化的。需要强调的是,Serializable接口中没有方法,因此实现该接口的类不需要实现额外的方法。另外需要注意的是,使用对象流把一个对象写入到文件时不仅要保证该对象是序列化的,而且该对象的成员对象也必须是序列化的。

            Serializable接口中的方法对程序是不可见的,因此实现该接口的类不需要实现额外的方法,当把一个序列化的对象写入到对象输出流时,JVM就会实现Serializable接口中的方法,将一-定格式的文本(对象的序列化信息)写入到目的地。当ObjectInputStream对象流从文件读取对象时,就会从文件中读回对象的序列化信息,并根据对象的序列化信息创建一一个对象。

    1. package demo02;
    2. import java.io.Serializable;
    3. public class Student implements Serializable {
    4. private String name;
    5. private int age;
    6. private double score;
    7. public Student() {
    8. super();
    9. }
    10. public Student(String name, int age, double score) {
    11. super();
    12. this.name = name;
    13. this.age = age;
    14. this.score = score;
    15. }
    16. public String getName() {
    17. return name;
    18. }
    19. public void setName(String name) {
    20. this.name = name;
    21. }
    22. public int getAge() {
    23. return age;
    24. }
    25. public void setAge(int age) {
    26. this.age = age;
    27. }
    28. public double getScore() {
    29. return score;
    30. }
    31. public void setScore(double score) {
    32. this.score = score;
    33. }
    34. @Override
    35. public String toString() {
    36. return "Student [name=" + name + ", age=" + age + ", score=" + score
    37. + "]";
    38. }
    39. }

    序列化 :

    1. package demo02;
    2. import java.io.FileNotFoundException;
    3. import java.io.FileOutputStream;
    4. import java.io.IOException;
    5. import java.io.ObjectOutputStream;
    6. import java.io.OutputStream;
    7. public class ObjectOutputStreamDemo01 {
    8. public static void main(String[] args) {
    9. //创建一个Student对象
    10. Student stu = new Student("张三", 22, 99.5);
    11. //创建OutputStream类对象
    12. OutputStream os = null;
    13. //创建ObjectOutputStream类对象
    14. ObjectOutputStream oos =null;
    15. try {
    16. os = new FileOutputStream("F:/student.txt");
    17. oos = new ObjectOutputStream(os);
    18. oos.writeObject(stu);
    19. System.out.println("对象存储完毕");
    20. }catch (FileNotFoundException e) {
    21. e.printStackTrace();
    22. } catch (IOException e) {
    23. e.printStackTrace();
    24. }finally{
    25. try {
    26. oos.close();
    27. os.close();
    28. } catch (IOException e) {
    29. e.printStackTrace();
    30. }
    31. }
    32. }
    33. }

     反序列化:

    1. package demo02;
    2. import java.io.FileInputStream;
    3. import java.io.IOException;
    4. import java.io.InputStream;
    5. import java.io.ObjectInputStream;
    6. public class ObjectInputStreamDemo01 {
    7. public static void main(String[] args) {
    8. //创建InputStream类对象,但是InputStrteam类是抽象类,不能直接创建其对象,只能创建其引用指向其子类对象
    9. InputStream is =null;
    10. //创建ObjectInputStream类对象
    11. ObjectInputStream ois = null;
    12. try {
    13. is = new FileInputStream("F:/student.txt");
    14. ois = new ObjectInputStream(is);
    15. //从文件中读取对象
    16. Object object = ois.readObject();
    17. //将读取的对象通过向下转型为其真实类型
    18. Student stu =(Student) object;
    19. System.out.println(stu);
    20. } catch (IOException e) {
    21. e.printStackTrace();
    22. } catch (ClassNotFoundException e) {
    23. e.printStackTrace();
    24. }finally{
    25. try {
    26. ois.close();
    27. is.close();
    28. } catch (IOException e) {
    29. e.printStackTrace();
    30. }
    31. }
    32. }
    33. }

     输入输出流17个类,均可在API中查出所有信息

  • 相关阅读:
    leetcode两数之和使用JavaScript解题
    EasyExcel读写数字类型数据丢失精度解决方案
    Android 12.0 修改系统默认字体的大小
    https协议
    QT多媒体简单应用
    docker安装es docker安装Elasticsearch windows linux
    网络问题定位工具记录
    《向量数据库》——都有哪些向量数据库,都有什么特点?
    Elasticsearch7从入门到精通(简介、部署、原理、开发、ELK)
    springboot+vue+elementUI 公司财务固定资产管理系统#毕业设计
  • 原文地址:https://blog.csdn.net/qq_51810428/article/details/126472852