java IO流【常用流对象三】

发布于:2022-10-27 ⋅ 阅读:(223) ⋅ 点赞:(0)

本文章学自尚学堂,如有侵权,请及时联系!谢谢

8 对象流

  • 对象的本质是用来组织和存储数据的,对象本身也是数据。那么,能不能将对象存储到硬盘上的文件中呢?能不能将对象通过网络传输到另一个电脑呢?我们可以通过序列化和反序列化来实现这些需求。

8.1 java对象的序列化和反序列化

8.1.1 序列化和反序列化

  • 当两个进程远程通信时,彼此可以发送各种类型的数据。***无论是何种类型的数据,都会以二进制序列的形式在网络上传送。***比如,我们可以通过http协议发送字符串信息;我们也可以在网络上直接发送Java对象。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象才能正常读取。
  • 序列化:把Java对象转化为字节序列的过程
  • 反序列化:把自己恢复为java对象的过程

8.1.2 对象序列化的作用

  • 持久化:把对象的字节序列永久地保存到磁盘上,通常放在一个文件中。
  • 网络通信:在网络上传输对象的字节序列。

8.1.3 序列化涉及的类和接口

ObjectOutputStream代表对象输出流 它的writeObject(Object obj)方法可对参数指定的obi对象进行序列化,把得到的学节序列写到一个自标输出流中。
ObjectinputStream代表对象输入流 它的readobject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

只有实现了Serializable接口的类的对象才能被序列化。Serializable接口是一个空接口只起到标记作用。
如果一个接口没有任何抽象方法,那么这个接口就是一个标识接口。

8.2 操作基本数据类型

  • 前边的数据流只能实现对基本数据类型和字符串类型的读写,并不能对Java对象进行读写操作(字符串除外),但是对象流中除了能实现对基本数据类型进行读写操作以外,还可以对Java对象进行读写操作。

8.2.1 写出基本数据类型数据

package IO流.对象流;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

/**
 * @author 缘友一世
 * date 2022/10/27-16:49
 */
public class ObjectOutputStreamBasicTypeDemo {
    public static void main(String[] args) {
        ObjectOutputStream oos=null;
        try {
            oos=new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream("basic grammar/src/IO流/对象流/text1.txt")));
            oos.writeInt(1024);
            oos.writeDouble(Math.random());
            oos.writeChar('x');
            oos.writeUTF("中国加油!");
            oos.flush();
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            try{
                if(oos!=null) {
                    oos.close();
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

8.2.2 读取基本数据类型数据

package IO流.对象流;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.ObjectInputStream;

/**
 * @author 缘友一世
 * date 2022/10/27-17:02
 */
public class ObjectInputStreamBasicTypeDemo {
    public static void main(String[] args) {
        ObjectInputStream ois=null;
        try {
           ois=new ObjectInputStream(new BufferedInputStream(new FileInputStream("basic grammar/src/IO流/对象流/text1.txt")));
           //必须要按照写入的顺序读取数据
            /*
            *   oos.writeInt(1024);
                oos.writeDouble(Math.random());
                oos.writeChar('x');
                oos.writeUTF("中国加油!");
            * */
            System.out.println("int:"+ois.readInt());
            System.out.println("double:"+ois.readDouble());
            System.out.println("char:"+ois.readChar());
            System.out.println("utf:"+ois.readUTF());
            
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            try{
                if(ois!=null) {
                    ois.close();
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

在这里插入图片描述

8.3 操作对象

8.3.1 将对象序列化到文件

  • ObjectOutputstream可以将一个内存中的Java对象通过序列化的方式写入到磁盘的文件中。被序列化的对象必须要实现
    Serializable序列化接口,否则会抛出异常。

8.3.1.1 创建对象

package IO流.对象流;

import java.io.Serializable;

/**
 * @author 缘友一世
 * date 2022/10/27-17:19
 */
public class User implements Serializable {
    private int userId;
    private String userName;
    private String userAge;

    public User() {
    }

    public User(int userId, String userName, String userAge) {
        this.userId = userId;
        this.userName = userName;
        this.userAge = userAge;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserAge() {
        return userAge;
    }

    public void setUserAge(String userAge) {
        this.userAge = userAge;
    }
}

8.3.1.2 序列化对象
package IO流.对象流;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

/**
 * @author 缘友一世
 * date 2022/10/27-17:24
 */
public class ObjectOutputStreamObjectTypeDemo {
    public static void main(String[] args) {
        ObjectOutputStream oos=null;
        try {
            oos=new ObjectOutputStream(new FileOutputStream("basic grammar/src/IO流/对象流/text2.txt"));
            User user1 = new User(1, "酸梅汤小王子", "18");
            oos.writeObject(user1);
            oos.flush();
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(oos!=null) {
                    oos.close();
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

8.3.2 将对象反序列化到内存中

package IO流.对象流;

import java.io.FileInputStream;
import java.io.ObjectInputStream;

/**
 * @author 缘友一世
 * date 2022/10/27-17:44
 */
public class ObjectInputStreamObjectTypeDemo {
    public static void main(String[] args) {
        ObjectInputStream ois=null;
        try {
          ois=new ObjectInputStream(new FileInputStream("basic grammar/src/IO流/对象流/text2.txt"));
            User user = (User) ois.readObject();
            System.out.println(user.getUserId()+"\t"+user.getUserName()+"\t"+user.getUserAge());
            
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            try{
                if(ois!=null) {
                    ois.close();
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

在这里插入图片描述

9 随机访问流

  • 并不是javaIO流中四大抽象类的子类。它是独立于Java IO包中的一个类。
  • RandomAccessFile可以实现两个作用:
    1. 实现对一个文件做读和写的操作。
    2. 可以访问文件的任意位置。不像其他流只能按照先后顺序读取。
  • 在开发某些客户端软件时,经常用到这个功能强大的可以”任意操作文件内容”的类。比如,软件的使用次数和使用日期,可以通过本类访问文件中保存次数和日期的地方进行比对和修改。Java很少开发客户端软件,所以在Java开发中这个类用的相对较少。

9.1 三个核心方法

  1. RandomAccessFile(String name,String mode)
    • name用来确定文件;mode 取r(读)或rw(可读写),通过mode可以确定流对文件的访问权限
  2. seek(long a)用来定位流对象读写文件的位置,a确定读写位置距离文件开头的字节个数。
  3. getFilePointer()获得流的当前读写位置。
package IO流.随机流;

import java.io.RandomAccessFile;

/**
 * @author 缘友一世
 * date 2022/10/27-18:54
 */
public class RandomAccessFileDemo {
    public static void main(String[] args) {
        RandomAccessFile raf=null;
        try {
            raf= new RandomAccessFile("basic grammar/src/IO流/随机流/text.txt","rw");
            //将若干数据写入到文件中。
            for(int i=1;i<=10;i++) {
                raf.writeInt(i*10);
            }
            //访问数据 默认为0指向第一个字节
            //跳过四个字节,从第二个数开始读取
            raf.seek(4);
            System.out.println(raf.readInt());
            //隔一个读一个数据
            for(int i=0;i<10;i+=2) {
                raf.seek(i* 4L);
                System.out.print(raf.readInt()+" ");
            }
            System.out.println();
            System.out.println("==========");
             //在第8个字节位置插入一个新的数据45,替换之前的数据30
            raf.seek(8);
            raf.writeInt(35);
            for(int i=0;i<10;i+=2) {
                raf.seek(i* 4L);
                System.out.print(raf.readInt()+" ");
            }
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(raf!=null) {
                    raf.close();
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

在这里插入图片描述

10 FIle类在IO中的作用

  • 当有文件作为数据源核目标时。除了可以使用字符串作为文件以及位置的指定以外。也可以使用file类指定。
package IO流;

import java.io.*;

/**
 * @author 缘友一世
 * date 2022/10/27-21:04
 */
public class FileInIODemo {
    public static void main(String[] args) {
        BufferedReader br=null;
        BufferedWriter bw=null;
        try {
            br=new BufferedReader(new FileReader(new File("basic grammar/src/IO流/write.txt")));
            bw=new BufferedWriter(new FileWriter(new File("basic grammar/src/IO流/write3.txt")));
            int i=1;
            String temp;
            while ((temp=br.readLine())!=null) {
                bw.write(i+":"+temp);
                bw.newLine();
                i++;
            }
            bw.flush();
        }catch(Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(br!=null) {
                    br.close();
                }if(bw!=null) {
                    bw.close();
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

在这里插入图片描述

本文含有隐藏内容,请 开通VIP 后查看