最全面IO流介绍

1.字符集介绍

  • 标准ASCII字符集:使用1个字节存储一个字符,首尾是0,总可以表示128个字符。是美国信息交换标准代码,包含英文、符号等等。

  • GBK汉字编码字符集,包含2万多个汉字等字符,GBK中一个中文字符编码成2个字节的形式存储,GBK兼容了ACSII字符集。GBK规定:汉字的第一个字节的第一位必须是1

  • Unicode字符集:是国际组织规定的,可以容纳世界所有文字、符号的字符集。叫万国码。

    • UTF-32: 4个字节表示一个字符,固定长度,可能只需要1个字节的英文字符现在要用4个字节来存储,太奢侈

    • UTF-8:采取可变长编码方案:共分为4个长度区:1(0xxxxxxx)、2(110xxxxx 10xxxxx)、3(1110xxxx 10xxxxx)、4(11110xxx 10xxxxx 10xxxxx 10xxxxx)个字节

      • 英文字符、数字只占用1个字节,汉字占用3个字节

注意:

  • 开发人员最好都是用UTF-8编码。

  • 字符编码时使用的字符集,和解码时使用的字符集必须一致,不然会出现乱码

  • 英文数字一般不会乱码,英文很多字符集都兼容了ASCII码

2. IO流分类

  • 按流的方向

    • 输入流:将数据从磁盘输入到程序中

    • 输出流:将数据从程序中保存到磁盘上

  • 按数据的最小单位

    • 字节流:适合操作所有类型的文件

    • 字符流:适合读写txt,java文件

3.总体概览图

4.IO流体系

  • 字节流(适合文件的复制)

    • 字节输入流:InputStream---->FileInputStream

      • 作用:把磁盘文件中的数据以字节的形式读取到内存中

      • 常用方法:

        //构造方法:创建字节输入流管道与源文件接通
         public FileInputStream(File file);
         public FileInputStream(String name)
         
         //方法
         //每次读取一个字节返回,如果发现没有数据可读会返回-1
         public int read();
         //每次用一个字节数组去读取数据,返回字节数组读取了多少个字节,如果发现没有数据可读会返回-1
         public int read(byte[] buffer);
    • 字节输出流: OutputStream---->FileOutputStream

      • 作用:把数据写入文件中并保存在磁盘 

      • 常用方法:

        //构造方法:创建字节输出流管道与源文件接通
         public FileOutputStream(File file);
         public FileOutputStream(String filePath)
         //以下构造方法可以追加数据
          public FileOutputStream(File file,boolean append);
         public FileOutputStream(String filePath,boolean append)
         //方法
         //写一个字节出去
         public void write(int a);
         //写一个字节数组出去
         public void write(byte[] buffer);
          //写字节数组的一部分出去
         public void write(byte[] buffer,int pos, int len);

  • 字符流(适合数据的读取)

    • 文件字符输入流: Reader---->FileReader

      • 作用:把磁盘文件中的数据以字符的形式读取到内存中

      • 常用方法:

        //构造方法:创建字符输入流管道与源文件接通
         public FileReader(File file);
         public FileReader(String pathname)
         
         //方法
         //每次读取一个字符返回,如果发现没有数据可读会返回-1
         public int read();
         //每次用一个字符数组去读取数据,返回字符数组读取了多少个字符,如果发现没有数据可读会返回-1
         public int read(char[] buffer);
    • 文件字符输出流: Writer---->FileWriter
      • 作用:把数据写入文件中并保存在磁盘

      • 常用方法:

        //构造方法:创建符节输出流管道与源文件接通
         public FileWriter(File file);
         public FileWriter(String filePath)
         //以下构造方法可以追加数据
          public FileWriter(File file,boolean append);
         public FileWriter(String filePath,boolean append)
         //方法
         //写一个字符出去
         public void write(int a);
         //写一个字符串出去
         public void write(String s);
          //写一个字符串的一部分出去
         public void write(String s,int off, int len);
         //写一个字符数组出去
         public void write(byte[] buffer);
          //写字符数组的一部分出去
         public void write(byte[] buffer,int pos, int len);
  • 缓冲流

    • 作用:包装原始字节流和字符流,提升原始流的读写数据的性能。

    • 字节输入缓冲流:BufferedInputStrea

      InputStream bis = new BufferedInputStream(FileInputStream is,int size);
    • 字节输出缓冲流: BufferedOutputStream

      OutputStream bos = new BufferedOutputStream(FileOutputStream os,int size);
    • 字符输入缓冲流: BufferedReader(新增读取某一行的数据)

    • 字符输出缓冲流: BufferedWriter(新增添加一行数据的方法)

  • 转换流

    • 引起问题:如果程序的编码方式和文本文件的编码方式不一致,就会出现乱码问题。解决该问题有以下两种方式:

    • 字符输入转换流:InputStreamReader:

      • 解决思路:先获取文件的原始字节流,然后按照指定的编码转为字符输入流。

        //构造函数
        public InputStreamReader(InputStream is,String charset);
    • 字符输出转换流: OutputStreamWriter:

      • 作用:可以控制写入文件的字符使用什么字符编码。

      • 解决:先获取字节输出流,再按照指定的编码转为字符输出流。

        //构造函数
        public OutputStreamWriter(OutputStream is,String charset);
  • 打印流

    • 作用:更方便更高效的打印数据出去,打印什么就输出什么

    • 字节输出打印流:PrintStream

      //构造方法
      //打印流直接通向字节输出流、文件、文件路径
      public PrintStream(OutputStream/File/String);
      //可以指定写出去的字符编码
      public PrintStream(String fileName,Charset charset);
      //可以指定实现自动刷新
      public PrintStream(OutputStream out,boolean autoFlush);
      //指定自动刷新,并指定字符编码
      public PrintStream(OutputStream out,boolean autoFlush,String encoding);
      
      //打印方法
      //打印任意类型的数据
      public void printIn(Xxx xx);
    • 字符输出打印流: PrintWriter

      //构造方法
      //打印流直接通向字节输出流、文件、文件路径
      public PrintWriter(OutputStream/Writer/File/String);
      //可以指定写出去的字符编码
      public PrintWriter(String fileName,Charset charset);
      //可以指定实现自动刷新
      public PrintWriter(OutputStream out/Writer,boolean autoFlush);
      //指定自动刷新,并指定字符编码
      public PrintWriter(OutputStream out,boolean autoFlush,String encoding);
      
      //打印方法
      //打印任意类型的数据
      public void printIn(Xxx xx);
  • 数据流

    • 数据输入流:DataInputStream(读取数据输出流写出去的数据)

    • 数据输出流:DataOutputStream(允许把数据及其类型一并写出去)

  • 序列化流(字节流下的)

    • 对象反序列化:ObjectInputStream(读取文件中的对象)

      //构造器
      //创建对象字节输入流,包装基础的字节流
      public ObjectInputStream(InputStream is);
      
      //读取存储在文件中的对象的方法
      public final Object readObject();
    • 对象序列化: ObjectOutputStream(把java对象序列化存储到文件中去)

      //构造器
      //创建字节输出流,包装基础的字节输出流
      public ObjectOutputStream(OutputStream os);
      
      //把对象写入文件的方法
      public final void writeObject(Object o);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值