Java基础复习_day16_IO流--字节流

耗尽温柔 提交于 2020-02-12 20:55:30

字节流

一. 字节输入流(InputStream)

  • InputStream 这个抽象类是表示字节输入流的所有类的超类

1. FileInputStream(字节输入流)

① 概述

  • 从文件系统中的某个文件中获得输入字节。
  • 用于读取诸如图像数据之类的原始字节流。

② 构造方法

  • FileInputStream(File file)
    通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
  • FileInputStream(String name)
    通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。

③ 常用方法

  • int read()
    从此输入流中读取一个数据字节
  • int read(byte[] b)
    从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中

2. BufferedInputStream(字节缓冲输入流)

① 概述

  • 创建BufferedInputStream将创建一个内部缓冲区数组。 当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节

② 构造方法

  • BufferedInputStream(InputStream in)
    创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。

③ 常用方法

  • int read()
    从此输入流中读取一个数据字节
  • int read(byte[] b)
    从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中

3. ObjectInputStream(对象反序列化流)

① 概述

  • 对象反序列化流 ObjectInputStream反序列化使用ObjectOutputStream编写的原始数据和对象

② 构造方法

  • ObjectInputStream(InputStream in)
    创建从指定 InputStream 读取的 ObjectInputStream。

③ 常用方法

  • readObject()
    从 ObjectInputStream 读取对象

4. 标准输入流

  • InputStream is = System.in
  • 数据源来源于键盘录入的

二. 字节输出流(OutputStream)

  • OutputStream:这个抽象类是表示字节输出流的所有类的超类

1. FileOutputStream(字节输出流)

① 概述

  • 用于将数据写入 File 或 FileDescriptor 的输出流。
  • 用于写入诸如图像数据之类的原始字节的流。

② 构造方法

  • FileOutputStream(File file)
    创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
  • FileOutputStream(String name)
    创建一个向具有指定名称的文件中写入数据的输出文件流。

③ 常用方法

  • write(int b)
    将指定字节写入此文件输出流。
  • write(byte[] b)
    将 b.length 个字节从指定 byte 数组写入此文件输出流中。
  • write(byte[] b, int off, int len)
    将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。

2. BufferedOutputStream(字节缓冲输出流)

① 概述

  • 该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用

② 构造方法

  • BufferedOutputStream(OutputStream out)
    创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
  • BufferedOutputStream(OutputStream out, int size)
    创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。

③ 常用方法

  • write(int b)
    将指定字节写入此文件输出流。
  • write(byte[] b)
    将 b.length 个字节从指定 byte 数组写入此文件输出流中。
  • write(byte[] b, int off, int len)
    将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此文件输出流。

3. ObjectOutputStream( 对象序列化流)

① 概述

  • 对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象
  • 这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型、对象的数据和对象中存储的属性等信息
  • 字节序列写到文件之后,相当于文件中持久保存了一个对象的信息
  • 反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化

② 构造方法

  • ObjectOutputStream(OutputStream out)
    创建一个写入指定的OutputStream的ObjectOutputStream

③ 常用方法

  • writeObject(Object obj)
    将指定的对象写入ObjectOutputStream

④ 注意事项

  • 一个对象要想被序列化,该对象所属的类必须必须实现Serializable 接口;
  • Serializable是一个标记接口,实现该接口,不需要重写任何方法;
  • 在类中定义一个变量 private static final long serialVersionUID = 42L;

4. PrintStream(字节打印流)

① 概述

  • 只负责输出数据,不负责读取数据
  • 永远不会抛出IOException
  • 有自己的特有方法

② 构造方法

  • PrintStream(File file)
    创建具有指定文件且不带自动行刷新的新打印流。
  • PrintStream(OutputStream out)
    创建新的打印流。
  • PrintStream(String fileName)
    创建具有指定文件名称且不带自动行刷新的新打印流。
  • PrintStream(OutputStream out, boolean autoFlush, String encoding)
    创建新的打印流。

③ 常用方法

  • print(Object x)
    打印字符串。
  • println(Object x)
    打印 String,然后终止该行。
  • flush()
    刷新该流的缓冲。

5. 标准的输出流

  • PrintStream ps = System.out
  • 数据输出的目的地是控制台

三. 案例练习

字节流复制视频文件

public class Copy {
    public static void main(String[] args) throws IOException {
        // 普通字节流复制视频
        long start = System.currentTimeMillis();
        copyByFileStream(new File("day01/myFile/video.avi"));
        long over = System.currentTimeMillis();
        System.out.println(over - start); //1902 毫秒
        
        // 字节缓冲流复制视频
        long start1 = System.currentTimeMillis();
        copyByBufferStream(new File("day01/myFile/video.avi"));
        long over1 = System.currentTimeMillis();
        System.out.println(over1 - start1); //69毫秒
    }
    // 1 使用普通字节流复制视频
    public static void copyByFileStream(File file) throws IOException {
        // 创建字节输入流, 读取视频文件
        FileInputStream fis = new FileInputStream(file);

        // 创建字节输出流, 写入视频文件
        FileOutputStream fos = new FileOutputStream("day01/Video1.avi");
        
        // 读取文件, 一次读取一个字节数组
        byte[] b = new byte[128];
        int len;
        while ((len = fis.read(b)) != -1) {
            fos.write(b, 0, len);
        }

        // 释放资源
        fos.close();
        fis.close();
    }

    // 2 使用字节缓冲流复制视频
    public static void copyByBufferStream(File file) throws IOException {
        // 创建字节输入流, 读取视频文件
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));

        // 创建字节缓冲输出流, 写入视频文件
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("day01/Video2.avi"));

        // 读取文件, 一次读取一个字节数组
        byte[] b = new byte[128];
        int len;
        while ((len = bis.read(b)) != -1) {
            bos.write(b, 0, len);
        }

        // 释放资源
        bos.close();
        bis.close();
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!