缓冲流&转换流&序列换流

前言

Java——IO流基础

缓冲流

  • 字节缓冲流:BufferedInputStream,BufferedOutputStream
  • 字符缓冲流:BufferedReader,BufferedWriter

缓冲流的基本原理,是在创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。(用法和FileInputStream相差不多)

// 创建字节缓冲输入流
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bis.txt"));
// 创建字节缓冲输出流
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bos.txt"));
// 创建字符缓冲输入流
BufferedReader br = new BufferedReader(new FileReader("br.txt"));
// 创建字符缓冲输出流
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));

转换流

将GBK编码的文本文件,转换为UTF-8编码的文本文件。

 // 1.创建转换输入流对象,关联数据源文件路径,指定编码为gbk
InputStreamReader isr = new InputStreamReader(new FileInputStream("day13\\ccc\\gbk.txt"),"gbk");
// 2.创建转换输出流对象,关联目的地文件路径,指点编码为utf8
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day13\\ccc\\utf8.txt"),"utf8");

读取,写入后转换编码类型,注意关闭流。

序列化流

Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据、对象的类型和对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。
反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化。对象的数据、对象的类型和对象中存储的数据信息,都可以用来在内存中创建对象。

对象–>ObjectOutputStream序列化–>字节
字节–>ObjectOutputStream反序列化–>对象

序列化:

一个对象要想序列化,必须满足两个条件:

  1. 该类必须实现java.io.Serializable 接口,Serializable 是一个标记接口
  2. 写出对象方法
    public final void writeObject (Object obj): 将指定的对象写出。
// 创建序列化流对象,关联目的地文件路径
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("day13\\ddd\\a.txt"));
// 写出对象p,p对象的类必须要实现Serializable接口
oos.writeObject(p);

反序列化

如果能找到一个对象的class文件,我们可以进行反序列化操作,调用ObjectInputStream读取对象的方法:
public final Object readObject () : 读取一个对象。

// 1.创建反序列化流对象,关联数据源文件路径
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("day13\\ddd\\a.txt"));
// 2.读取一个对象
Object obj = ois.readObject();

序列化的注意事项

  • 该类必须实现java.io.Serializable 接口,Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出NotSerializableException 。
  • 该类的所有属性必须是可序列化的。
  • 如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient 关键字修饰。

反序列化的注意事项

  • 对于JVM可以反序列化对象,它必须是能够找到class文件的类。如果找不到该类的class文件,则抛出一个 ClassNotFoundException 异常。
  • 另外,当JVM反序列化对象时,能找到class文件,但是class文件在序列化对象之后发生了修改,那么反序列化操作也会失败,抛出一个InvalidClassException异常。发生这个异常的原因如下:
    • 该类的序列版本号与从流中读取的类描述符的版本号不匹配
    • 该类包含未知数据类型
    • 该类没有可访问的无参数构造方法
      Serializable 接口给需要序列化的类,提供了一个序列版本号。serialVersionUID 该版本号的目的在于验证序列化的对象和对应类是否版本匹配。

打印流

平时我们在控制台打印输出,是调用print方法和println方法完成的,这两个方法都来自于java.io.PrintStream类,该类能够方便地打印各种数据类型的值,是一种便捷的输出方式。

构造方法:
public PrintStream(String fileName): 使用指定的文件名创建一个新的打印流。

// 创建打印流对象,关联目的地文件路径
        PrintStream ps = new PrintStream("day13\\eee\\a.txt");
        // 打印数据
        ps.print(100);
        ps.println();// 换行
        ps.println("jack");

        // 关闭流,释放资源
        ps.close();
  // 获取系统的打印流对象:
        System.out.println(100);// 打印到控制台 100
        // 需求: 把System.out.println()打印的目的地从控制台改成day13\\eee\\b.txt
        PrintStream ps2 = System.out;
        ps2.println(100);// 打印到控制台 100
// 修改系统的打印流对象:
        // 创建打印流对象,关联目的地文件路径
        PrintStream ps3 = new PrintStream("day13\\eee\\b.txt");
        // 修改System.out的值
        System.setOut(ps3);
        System.out.println(100);// 打印b.txt文件中

commons-io工具包

commons-io是apache开源基金组织提供的一组有关IO操作的类库,可以挺提高IO功能开发的效率。commons-io工具包提供了很多有关io操作的类,

  1. public static int copy(InputStream in, OutputStream out); 把input输入流中的内容拷贝到output输出流中,返回拷贝的字节个数(适合文件大小为2GB以下)
  2. public static long copyLarge(InputStream in, OutputStream out);把input输入流中的内容拷贝到output输出流中,返回拷贝的字节个数(适合文件大小为2GB以上)
 private static void method01() throws IOException {
        // 拷贝一个文件
        // 创建输入流和输出流对象
        FileInputStream fis = new FileInputStream("day13\\aaa\\hb.jpg");
        FileOutputStream fos = new FileOutputStream("day13\\fff\\hb1.jpg");
        // 拷贝
        IOUtils.copy(fis,fos);
        // 关闭流,释放资源
        fos.close();
        fis.close();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值