JavaIO系列——字节缓冲流,对象流,序列化与反序列化

181 篇文章 3 订阅
21 篇文章 1 订阅

字节缓冲流

BufferedInputStream

BufferedInputStream为另一个输入流添加了功能,即缓冲输入并支持标记和重置方法的能力。创建BufferedInputStream时,将创建一个内部缓冲区数组。当读取或跳过流中的字节时,会根据需要从包含的输入流中重新填充内部缓冲区,每次填充多个字节。标记操作会记住输入流中的一个点,重置操作会导致在从包含的输入流中获取新字节之前,重新读取自最近的标记操作以来读取的所有字节。

在这里插入图片描述

常用方法和InputStream是一样的

构造函数

在这里插入图片描述

示例

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class demo5 {
    public static void main(String[] args) throws IOException {
        String path = "C:\\Users\\Syf200208161018\\Desktop\\neww.txt";
        FileInputStream fileInputStream = new FileInputStream(path);
        BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
        int count = 0;
        byte[] bytes = new byte[1024];
        while ((count = bufferedInputStream.read(bytes))!=-1){
            System.out.println(new String(bytes,0,count));
        }
        bufferedInputStream.close();
    }
}

BufferedOutputStream

该类实现了一个缓冲的输出流。 通过设置这样的 输出流,应用程序可以将字节写入底层 输出流而不必引起对底层的调用 系统为每个写入的字节。

数据首先会写入缓冲区
调用flush方法才会真正写入
在这里插入图片描述

构造函数

在这里插入图片描述

示例

import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class demo6 {
    public static void main(String[] args) throws IOException {
        String path = "C:\\Users\\Syf200208161018\\Desktop\\neww.txt";
        FileOutputStream fileOutputStream = new FileOutputStream(path);
        BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
        //写入缓冲区(8k)
        bufferedOutputStream.write("bufferoutput".getBytes(StandardCharsets.UTF_8));
        //刷新写入
        bufferedOutputStream.flush();
        bufferedOutputStream.close();
    }
}

对象流

ObjectInputStream 之前反序列化原始数据和对象使用ObjectOutputStream 编写。

警告:不可信数据的反序列化本质上是危险的 并且应该避免。 不受信任的数据应根据 “序列化和反序列化”部分的 Java SE 的安全编码指南 。 序列化过滤 描述最好 串行过滤器的防御性使用实践。

ObjectOutputStream 和 ObjectInputStream 可以为应用程序提供 与FileOutputStream 一起使用时对象图的持久存储 和 FileInputStream 分别。 ObjectInputStream 用于恢复 那些之前序列化的对象。 其他用途包括传递对象 使用套接字流或用于编组和解组的主机之间 远程通信系统中的参数和参数。

ObjectInputStream 确保图中所有对象的类型 从流中创建的与 Java Virtual 中存在的类匹配 机器。 使用标准机制根据需要加载类。

只有对象支持 java.io.Serializable 或 java.io.Externalizable 接口可以从流中读取。

方法 readObject用于读取对象。 应该使用 Java 的安全转换来获得所需的类型。 在 Java、字符串和数组都是对象,在处理过程中被视为对象 序列化。 读取时需要将它们转换为预期的类型。

可以使用适当的从流中读取原始数据类型 DataInput 上的方法。

对象的默认反序列化机制恢复内容 将每个字段的值和类型转换为写入时的值和类型。 字段 反序列化过程会忽略声明为瞬态或静态的。 对其他对象的引用会导致从流中读取这些对象 有必要的。 使用参考正确恢复对象图 共享机制。 反序列化时总是分配新对象, 这可以防止现有对象被覆盖。

读取对象类似于运行新对象的构造函数目的。 为对象分配内存并初始化为零 (NULL)。 为不可序列化的类调用无参数构造函数,然后 可序列化类的字段从流开始恢复 最接近 java.lang.object 的可序列化类并以 对象最具体的类。

增强了缓冲区功能
增强了读写8种基本数据类型和字符串功能
增强读写对象的功能

使用流传输的过程被称为序列化与反序列化

序列化

内存中的对象写入文件中

反序列化

文件中的对象读取到内存中

关于序列化和反序列化中的要点

  1. 序列化的类必须实现Serializable接口,该接口是个空接口,单纯只是用于标记
  2. 序列化中对象属性也要实现Serializable接口
  3. 系列化的类必须要加上一个版本ID,这个ID用于保证序列化和反序列的类是同一个类!
    //序列化版本ID,保证序列化和反序列化的类是同一个类
    private static final Long serialVersionUID = 1000L;
  1. 若使用transient关键词修饰属性,那么该属性就不能被序列化!(不可被序列化的属性进行反序列化后得到是空值)
  2. 静态属性无法序列化!!!
  3. 我们是可以序列化多个对象的!

ObjectInputStream

构造函数

在这里插入图片描述

方法

总的来说就是read+类型的方法
readUTF() 读取一个字符串 修改后的 UTF-8 格式(个人认为重要!)

在这里插入图片描述
在这里插入图片描述

示例

import entity.Stu;

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

public class demo8 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        String path = "C:\\Users\\Syf200208161018\\Desktop\\neww.txt";
        FileInputStream fileInputStream = new FileInputStream(path);
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
        //反序列化
        Stu stu = (Stu) objectInputStream.readObject();
        objectInputStream.close();
        System.out.println(stu.toString());
    }
}

ObjectOutputStream

构造函数

在这里插入图片描述

方法

在这里插入图片描述
在这里插入图片描述

示例

import entity.Stu;

import java.io.*;

public class demo7 {
    public static void main(String[] args) throws IOException {
        String path = "C:\\Users\\Syf200208161018\\Desktop\\neww.txt";

        Stu stu = new Stu("张三",16,162.69);

        FileOutputStream fileOutputStream = new FileOutputStream(path);
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
        //实现序列化
        objectOutputStream.writeObject(stu);
        objectOutputStream.close();
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值