[Day23]IO(字节流、字符流)

时间:2022-02-28 20:56:55

1.字节流

  1.1 字节输出流OutputStream-抽象类,表示输出字节流的所有类的超类

  (1)void  close()  关闭此输出流并释放与此流相关的所有系统资源

  (2)void  flush()  刷新此输出流并强制写出所有缓冲的输出字节

  (3)void  write(byte[] b)  将b.length个字节从指定的byte数组写入此输出流

  (4)write  wirte(byte[] b,int off,int len)  将指定byte数组从偏移量off开始的len个字节写入此输出流

  (5)abstract void  write(int b)  将指定的字节写入此输出流

  1.2 FileOutputStream类

  (1)是OutputStream的子类,可以用来写入数据到文件,用于将数据写入File的输出流

  (2)构造方法

    FileOutputStream(File file)  创建一个向指定File对象表示的文件中写入数据的文件输出流

    FileOutputStream(String name)  创建一个向具有指定名称的文件中写入数据的输出文件流

  (3)续写和换行-构造函数中可以接受一个boolean类型的值,如果值为true,就会在文件末位继续添加

    FileOutputStream(File file,boolean append)  创建一个向指定File对象表示的文件中写入数据的文件输出流

    FileOutputStream(String name,boolean append)  创建一个向具有指定name的文件中写入数据的输出文件流

    通过在上一行末位或下一行开头加入\r\n实现换行

  (4)IO异常处理

    可以直接throws,或者用try...catch...finally

  1.3 字节输入流InputStream-抽象类,是表示字节输入流的所有类的超类

  (1)abstract int  read()  从输入流中读取数据的下一个字节,读取并返回,没有字节则返回-1

  (2)int  read(byte[] b)  从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中,返回读取到的字节数

  1.4 FileInputStream类-InputStream类的子类,可以用来读取文件内容,从文件系统中的某个文件中获得输入字节

  (1)构造方法

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

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

  (2)读取数据方法

    abstract int read()  从输入流中读取数据的下一个字节

    int  read(byte[] b)  从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中

  1.5 字节流-文件复制

  (1)原理:读取一个已有的数据,并将这些读到的数据写入到另一个文件中

  (2)步骤:a.明确源和目的

         b.明确字节流、输入流和源相关联,输出流和目的关联

         c.使用输入流的读取方法读取字节,并将字节写入到目的文件中

         d.关闭资源

 

2.字符流

  2.1 字符编码表

  (1)ASCII:一个字节中的7位就可以表示,对应的字节都是正数 0-xxxxxxx

  (2)ISO-8859-1:拉丁码表latin,一个字节用的8位 1-xxxxxxx 负数

  (3)GB2312:简体中文码表,包含6000-7000中文和符号,用两个字节表示,其中的一部分是文字,第一个字节是负数,第二个字节可能是正数

    GBK:目前最常用的中文码表,2万的中文和符号。用两个字节表示。其中的一部分是文字,第一个字节开头是1,第二个字节开头是0

    GB18030:最新的中文码表,目前还未正式使用

  (4)UNICODE:国际标准码表,无论什么文字,都用两个字节存储

    Java中的char类型用的就是这个码表,char c='a',占两个字节

    Java中的字符串是按照系统默认码表来解析,简体中文版字符串默认的码表是GBK

  (5)UTF-8:基于unicode,一个字节就可以存储数据,不要用两个字节存储,而且这个码表更加的标准化,在每一个字节头加入了编码信息

  (6)能识别中文的码表:GBK、UTF-8;正因为识别中文码表不唯一,涉及到了编码解码问题。

    常见的编码 GBK  UTF-8  ISO-8859-1

    文字--->(数字) :编码。 “abc”.getBytes()  byte[]

    (数字)--->文字  : 解码。 byte[] b={97,98,99}  new String(b)

  2.2 字符输入流Reader-读取字符流的抽象类

  (1)int  read()  读取单个字符

  (2)int  read(char[] cbuf)  将字符读入数组

  2.3 FileReader类

  (1)FileInputStream用于读取诸如图像数据之类的原始字节流,要读取字符流,需要使用FileReader

  (2)构造方法

    FileReader(File file)  在给定从中读取数据的File的情况下创建一个新FileReader

    FileReader(String fileName)  在给定从中读取数据的文件名的情况下创建一个新FileReader

  2.4 字符输出流Writer-写入字符流的抽象类

  (1)void  write(char[] cbuf)  写入字符数组

  (2)abstract void  write(char[] cbuf,int off,int len)  写入字符数组的某一部分

  (3)void  write(int c)  写入单个字符

  (4)void  write(String str)  写入字符串

  (5)void   write(String str,int off,int len)  写入字符串的某一部分

  2.5 FileWriter类

  (1)FileWriter(File file) 根据给定的File对象构造一个FileWriter对象

  (2)FileWriter(File file,boolean append)  根据给定的File对象构造一个FileWriter对象

  (3)FileWriter(String fileName)  根据给定的文件名构造一个FileWriter对象

  (4)FileWriter(String fileName,boolean append)  根据给定的文件名以及指示是否附加写入数据的boolean值来构造FileWriter对象

  2.6 flush()和close()区别

  (1)flush():将流中的缓冲区缓冲的数据刷新到目的地中,刷新后,流还可以继续使用

  (2)close():关闭资源,但在关闭前会将缓冲区中的数据先刷新到目的地,否则丢失数据,然后在关闭流。流不可以使用。如果写入数据多,一定要一边写一边刷新,最后一次可以不刷新,由close完成刷新并关闭。