IO流概述和分类

IO流分类

  • 按照数据的流向
    • 输入流:读数据
    • 输出流:写数据
  • 按照数据类型来分
    • 字节流
      • 字节输入流;字节输出流
    • 字符流
      • 字符输入流;字符输出流

一般来说,我们说io的分类时按照数据类型来分的
那么什么情况下使用?

  • 如果数据通过window自带的记事本软甲打开,我们可以读懂里面的内容,就是用那个字符流否则就是用字节流。如果不知道就是用字节流

    字节流写数据

    字节流抽象类

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

  • OutputStream:这个抽象类表示字节输出流的所有类的超类
  • 子类名特点:子类名称都是以其父类名作为子类名的后缀

FileOutputStream:文件输出流用于将数据写入File

  • FileOutputStream(String name): 创建文件输出流已制定的名称写入文件

使用字节输出流写数据的步骤:

  • 创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节流对象指向文件)
  • 调用字节输出流的写数据方法
  • 释放资源(关闭文件输出流并释放与此流相关的任何系统资源)

    字节流写数据的3种方式

    image.png

    字节流写数据的两个小问题

    字节流写入数据如何实现换行?

  • window:\r\n

  • linux:\n
  • mac:\r

如何实现追加写入数据?

  • public fileOutput Stream(stringname,boolean,append)
  • 创建文件输出流已制定得到名称写入文件,如果第二个参数为true,则字节写入文件的末尾而不是开头

    字节流写数据加异常处理

    finally:在异常处理时提供finally块来执行所有清除操作,比如说IO六i中的的释放资源
    特点:被finally控制的语句一定会执行,除非JVM退出
    image.png

字节流读数据

File Input Stream(String name):通过打开与实际文件的连接来创建一个File Input Stream,该文件由文件系统中的路径名name命名
使用字节输入流读取的步骤:

  • 创建输入流对象
  • 调用字节输入流对象的读取方法
  • 释放资源

    字节流复制文本文件

  • 复制文本文件,其实就是把文本文件的内容从一个文件中读取出来(数据源),然后写到另一个文件中(目的地)

  • image.png

    • 根据数据源创建字节流输入流对象
    • 根据目的地创建字节流输出流对象
    • 读写数据,复制文本文件(一次读取一个字节,一次写入一个字节)
    • 释放资源

      字节缓冲流

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

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

构造方法

  • 字节缓冲输出流:Buffer Output Stream(OutputStream out)
  • 字节缓冲输入流:Buffer Input Stream(InputStrean in)

为什么构造方法需要的是字节流,而不是具体的文件或者路径?

  • 字节缓冲流仅仅提供缓冲区,而真正的读写数据还得依靠基本的字节流对象进行操作

    字符流

    为什么会出现字符流?

    由于字节流操作中文不是特别的方便,所以Java就提供字符流

  • 字符流 = 字节流 + 编码表

用字节流复制文本文件时,文本

  • 汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数

编码表

基础知识:

  • 计算机中存储的信息都是二进制数表示的;我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果
  • 按照某种规则将字符存储到计算机中,成为编码,反之,将存储在计算机中的二进制数按照某种规则解析显示出来,成为解码。这里强调一下:按照哪个编码存储,就比寻按照哪个编码解析,这样显示正确的文本符号,否则就会乱码。

    • 字符编码:就是一套自然语言的字符与二进制数之间的对应规则(A,65)

      字符集

  • 是一个系统支持的所有字符的集合,包括个国家文字、标点符号、图形符号、数字等

  • 计算机要准确的存储和识别各种字符集符号,就要进行字符编码,一套字符集必然至少有一套字符编码。
  • 常见的字符集由ASCll字符集,GBXXX字符集,Unicode字符集等

    ASCll字符集

  • ASCll(American standard code for information interchange,美国信息交换标准代码):是基于拉丁字母的一套电脑编码系统,用于显示现代英语,主要包括控制字符(回车键、推个、换行键等)和可显示字符(英文大小写字符、阿拉伯数字和西文符号)

  • 基本的ASCll字符集,使用7位表示一个字符,共128媳妇,ASCll的扩展字符使用8位表示一个字符,共256字符,方便支持欧洲常用字符,十一i个系统支持的所有字符的集合,包括个国家文字、标点符号、图形符号、数字等

    GBXXX字符集

  • GB2312:简体中文码表,一个小与127的字符的用于与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,这样大约可以组合了包含7000多个简体汉字,此外数学符号,罗马希腊的字母、日文的假名都编进去了,连在ASCll里本来就有的数字、标点、字母都统统重新编写了两个字节长的编码,这就是常说的“全角”字符,而原来在127号 以下的那些就叫“半角”字符了

  • GBK:最常用的中文码表,是在GB2312便准基础上的扩展规范,使用了双字节编码方案,共收录了21003个汉字,完全兼容GB2132标准,同时支持繁体汉字以及日韩汉字等
  • GB18030:最新的中文码表。收录了70244个,采用多字节编码,每个字可以由个、2个或4个自己就而组成。支持中国国内少数民族的文字,同时支持繁体汉字及日韩汉字等

Unicode字符集:

  • 为表达任意语言的任意字符而设计,是业界的一种标准,也称为统一码,标准玩过吗。他最多使用4个字节的数字来表达每个字母、符号、或者文字。有三种编码方案UTF-8、UTF-16、UTF32,最为常用的UTF-8编码
  • UTF-8编码:可以用来表示Unicode标准中的热议字符,它是电子邮件存储或者文字的应用中,优先采用的编码,互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。它使用一至四个字节为每个字符编码
    • 编码规则:
      • 128个US-ASCll字符,只需以恶搞 字符
      • 拉丁文等字符,需要2个字节编码
      • 大部分常用字(含汉字),使用3个字节编码
      • 其他极少使用的Unicode辅助字符,使用4个字节编码

小结:采用何种规则编码,就要采用对应的规则解码,否则就会出现乱码

字符串中的编码解码问题

编码:

  • byte[]getBytes():使用平台默认的字符集将该string编码为一系列字节,将结果存储到新的字节数组中
  • byte[]getBytes(String charsetName):使用指定的字符集将该string编码为一系列字节,将结果存储到新的字节数组中

解码:

  • String(byte[]bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的string
  • String(byte[]bytes,String charsetName):通过指定的字符集解码指定的字节数组来构造新的string

image.png

字符流中的编码解码问题

字符流抽象基类

  • Reader:字符输入流的抽象类

image.png

  • Writer:字符输出流的抽象类

image.png

字符流中的编码解码问题相关的两个类

  • Input Stream Reader
  • Output Stream Writer

image.png

字符流写数据的5种方式

image.png
image.png

image.png

字符流读数据的2种方式

image.png

字符缓冲流

字符缓冲流

  • BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小,默认值足够大,可用于大多数用途。
  • BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小,默认值足够大,可用于大多数用途。

构造方法

  • bufferedWriter(Writer out)
  • bufferedReader(Reader in)

    IO流小结

  • 字节流

image.png

  • 字符流

image.png