I/O(输入/输出)——字节流和字符流

一、字节流

        在计算机中,无论是文本、图片、音频还是视频,所有文件都是以二进制的形式(也就是字节)存在的。为字节的输入输出流提供的一系列流统称为字节流。在JDK中提供了两个抽象类InputStream和OutputStream,它们是字节流的顶级父类。

1.InputStream

        InputStream是I/O流包中用来读取文件的,并且计算机中的数据大多数都保存在硬盘中,因此不可避免的需要操作文件中的数据。但InputStream并不是一个接口,而是一个抽象类,它是所有输入流的父类。

InputStream的常用方法:

  1. int read() 从输入流读取一个8位的字节,把它转换为0~255之间的整数,并返回这一整数
  2. int read(byte[ ] b) 从输入流读取若干字节,把它们保存到参数b指定的字节数组中,返回的整数表示读取字节的数目
  3. int read(byte[ ] b, int off, int len) 从输入流读取若干字节,把它们保存到参数b指定的字节数组中,off指定字节数组开始保存数据的起始下标,len表示读取的字节数目
  4. void close() 关闭此输入流并释放与该流关联的所有系统资源

2.OutputStream

        OutputStream是JDK提供的最基本的输出流,也是抽象类,是所有输出流的父类,如果使用此类,则首先必须通过子类实例化对象。

OutStream的常用方法:

  1. void write(int b) 向输出流写入一个字节
  2. void write(byte[ ] b) 把参数b指定的字节数组的所有字节写入到输出流
  3. void write(byte[ ] b, int off, int len) 将指定字节数组b中从偏移量off开始的len个字节写入输出流
  4. void flush() 刷新此输出流并强制写出所有缓冲的输出字节
  5. void close() 关闭此输出流并释放与该流关联的所有系统资源

3.字节缓冲流

        I/O提供两个带缓冲的字节流,分别是BufferedInputStream和BufferedOutputStream,它们的构造方法中分别接收InputStream和OutoutStream类型的参数作为对象,在读写数据时提供缓冲功能。

二、字符流

        InputStream和OutputStream类在读写文件时操作的都是字节,如果希望在程序中操作字符,则应该使用JDK提供的字符流。同字节流一样,字符流也有两个抽象的顶级父类,分别是Reader(字符输入流)和Writer(字符输出流)。用法类似于字节流,不过字节流是基于字节的,而字符流是以字符为单位的,每次读取一个或一组字符。

        同时,字符流也提供了带缓冲的包装流,即BufferReader(对字符输入流进行包装)和BufferWriter(对字符输出流进行包装)。需要注意的是,在BufferReader中有一个特别重要的方法readLine(),该方法用于一次读取一行文本,当读到回车符'\r'或换行符'\n'时会将读到的字符作为一行的内容返回

        需要注意的是,在写入字符时,只有当缓冲区内部写满时或调用close()方法时,缓冲区中的字符才会被写入目标文件。

        有时字节流和字符流之间也需要进行转换。JDK 提供了两个类可以将字节流转换为字符流,它们分别是 InputStreamReader 和 OutputStream Witer。

  1.  InputSreamReader 是Reader 的子类,它可以将一个字节输人流转换成字符输人流,方便直接读取字符
  2. OutputStreamWriter 是Writer的子类,它可以将一个字节输出流转换成字符输出流,方便直接写入字符。为了提高读写效率,可以通过 InputStreamReader 和 OutputStream Writer 实现转换工作

 

 

你可能感兴趣的:(java)