Java讲课笔记24:字节流

零、本讲学习目标

1、了解字节流的概念及其分类

2、学会使用字节流实现读写操作

3、学会使用字节流实现文件拷贝

一、I/O流概述

1、I/O流定义

I/O(Input/Output)流,即输入/输出流,是Java中实现输入/输出的基础,它可以方便地实现数据的输入/输出操作。

2、I/O流分类

分类 分类依据
字节流与字符流 根据流操作的数据单位的不同,可以分为字节流和字符流
输入流与输出流 根据流传输方向的不同,可以分为输入流和输出流
节点流与处理流 根据流的功能不同,可以分为节点流和处理流

3、I/O流层次结构

Java中的I/O流主要定义在java.io包中,该包下定义了很多类,其中有4个类为流的顶级类,分别为InputStream和OutputStream,Reader和Writer。
在这里插入图片描述

  • InputStream和OutPutStream是字节流,而Reader和Writer是字符流
  • InputStream和Reader是输入流,而OutPutStream和Writer是输出流
  • 注意图中的4个顶级类都是抽象类,并且是所有流类型的父类

在这里插入图片描述

4、数据的输出

数据从程序到文件,叫做输出,引入流的概念,那就叫输出流,这个流是以字节为单位,叫做字节输出流(OutputStream)。如果是针对文本文件来进行操作,一般是以字符为单位,叫做字符输出流(Writer)。
在这里插入图片描述
在这里插入图片描述

5、数据的输入

数据从文件到程序,叫做输入,引入流的概念,那就叫输入流,这个流是以字节为单位,叫做字节输入流(InputStream)。如果是针对文本文件来进行操作,一般是以字符为单位,叫做字符输入流(Reader)。
在这里插入图片描述
在这里插入图片描述

6、声明I/O流的四个顶级抽象类

可以看到I/O流的类都在java.io包里,程序里要使用,必须要导入。
在这里插入图片描述

二、字节流概述

1、字节流定义

在计算机中,无论是文本、图片、音频还是视频,所有文件都是以二进制(字节)形式存在的,I/O流中针对字节的输入/输出提供了一系列的流,统称为字节流。

2、字节流说明

字节流是程序中最常用的流。在JDK中,所有的字节输入流都继承自InputStream,所有的字节输出流都继承自OutputStream。

3、字节输入流与字节输出流示意图

在这里插入图片描述

  • InputStream被看成一个输入管道,OutputStream被看成一个输出管道,数据通过InputStream从源设备输入到程序,通过OutputStream从程序输出到目标设备,从而实现数据的传输。

4、字节输入流

(1)常用方法

方法声明 功能描述
int read() 从输入流读取一个8位的字节,把它转换为0~255之间的整数,并返回这一整数。当没有可用字节时,将返回-1
int read(byte[] b) 从输入流读取若干字节,把它们保存到参数b指定的字节数组中,返回的整数表示读取字节的数目
int read(byte[] b,int off,int len) 从输入流读取若干字节,把它们保存到参数b指定的字节数组中,off指定字节数组开始保存数据的起始下标,len表示读取的字节数目
void close() 关闭此输入流并释放与该流关联的所有系统资源
  • 前三个read()方法都是用来读数据的,分按字节读取和按字节数组读取。
  • 进行I/O流操作时,应该调用close()方法关闭流,从而释放当前I/O流所占的系统资源。

(2)继承关系图

在这里插入图片描述

5、字节输出流

(1)常用方法

方法声明 功能描述
void write(int b) 向输出流写入一个字节
void write(byte[] b) 把参数b指定的字节数组的所有字节写到输出流
void write(byte[] b,int off,int len) 将指定byte数组中从偏移量off开始的len个字节写入输出流
void flush() 刷新此输出流并强制写出所有缓冲的输出字节
void close() 关闭此输出流并释放与此流相关的所有系统资源
  • 前三个write()方法都是用来写数据的,分按字节读取和按字节数组写入。
  • flush()方法用来将当前输出流缓冲区(通常是字节数组)中的数据强制写入目标设备,此过程称为刷新。
  • close()方法是用来关闭流并释放与当前IO流相关的系统资源。

(2)继承关系图

在这里插入图片描述

三、利用字节流输入输出数据

1、DataInputStream继承关系图

在这里插入图片描述

2、DataOutputStream继承关系图

在这里插入图片描述

3、案例演示:利用DataInputStream与DataOutputStream输入输出整数

  • 创建Example2402
    在这里插入图片描述
package net.hw.lesson24;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;

/**
 * 功能:利用DataInputStream与DataOutputStream输入输出整数
 * 作者:华卫
 * 日期:2020年05月25日
 */
public class Example2402 {
    public static void main(String[] args) throws IOException {
        int a;
        // 定义数据字节输入流
        DataInputStream dis = new DataInputStream(System.in);
        // 定义数据字节输出流
        DataOutputStream dos = new DataOutputStream(System.out);

        System.out.print("a = ");
        a = dis.readInt(); // 从数据字节输入流读取整数
        System.out.print("a = ");
        dos.writeInt(a); //  将整数写入数据字节输出流
    }
}
  • 运行程序,查看结果
    在这里插入图片描述
  • 输入a的之后,修改a的值
    在这里插入图片描述
  • 运行程序,查看结果
    在这里插入图片描述
    改变a的值之后,再利用数据字节输出流对象输出a的值,竟然是空,也没有报异常。那么我们应该如何操作,才能让输入的数据参与运算之后还能输出正确的结果呢?

4、案例演示:行读取键盘输入的数据

  • 创建Example2403
    在这里插入图片描述
package net.hw.lesson24;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 功能:行读取键盘输入的数据
 * 作者:华卫
 * 日期:2020年05月25日
 */
public class Example2403 {
    public static void main(String[] args) throws IOException {
        int a;
        /**
         * System.in 标准字节输入流,代表的是键盘
         * InputStreamReader 转换流:将字节流转换成字符流
         * BufferedReader:缓冲字符输入流,提供高效的行读取方法
         */
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        System.out.print("a = ");
        a = Integer.parseInt(br.readLine()); // 读取的字符串解析成整数
        a = a + 150;
        System.out.println("a + 150 = " + a);
    }
}

-运行程序,查看结果
在这里插入图片描述
转换过程:标准字节输入流——>字符流——>缓冲字符输入流(提供了效率比较高的行读取方法)

5、课堂练习:利用缓冲字符输入流输入学生基本信息(学号、姓名和年龄)

在这里插入图片描述

五、利用字节流读写文件

六、利用字节流实现文件拷贝

猜你喜欢

转载自blog.csdn.net/howard2005/article/details/106329696