• IO流2


    一、IO流简介及分类

    1、IO流简介

    IO流: 简单理解数据从一个地方流向另外一个地方

    2、IO流分类

    按照数据流动的方向 分为  输入流和输出流

    按照数据流动的单位分为   字节流和字符流

    二、四大抽象流(都是抽象类)

     

    1、FileInputStream(是InputStream接口的子类)

    ①构造方法

      FileInputStream(String name); 根据指定的路径名创建字节输入流对象

      FileInputStream(File file);

    注意:以上路径不存在,它会直接抛出异常

       ③read方法

    int read(); 读取一个字节,返回的是ASCII值

          int read(byte[] bytes);  读取多个字节,它把读取的字节放到bytes数组中,返回值返回的是读取的个数     

    ④注意:以上方法,如果读取完毕之后都会返回-1

         

    ⑤完整代码:

         FileInputStream fileInputStream = new FileInputStream(name);

         byte[] bytes = new byte[10];

         StringBuilder sb = new StringBuilder();

         while(fileInputStream.read(bytes)!=-1){

          sb.append(new String(bytes));

         }

         从上面这段代码我们可以看出,出现很多重复的字符

         解决方式: 读多少,就取多少

         new String(bytes,0,len);

         改变以上代码

     FileInputStream fileInputStream = new FileInputStream(name);

         byte[] bytes = new byte[10];

         StringBuilder sb = new StringBuilder();

         int len;

         while((len = fileInputStream.read(bytes))!=-1){

          sb.append(new String(bytes,0,len));

         }

         fileInputStream.close();

         以上代码解决了格式不正确问题!!

    2FileOutputStream

    构造方法:

    FileOutPutStream(String name); 以指定的路径创建字节输出流对象

    FileOutPutStream(String name,boolean append);       append:表示是否在之前的基础上追加数据

    FileOutPutStream(File file);

    FileOutPutStream(File file,boolean append);

    如果路径不存在,直接报错,如果路径存在,文件自动创建

    重要方法:

    void  write(int num);// 以ASCII进行输出

    void  write(byte[] bytes); 一次性输出多个字节

    void write(byte[] bytes,int offset,int len);

    3FileReader  

    构造方法:

     FileReader(String name); 根据指定的路径名创建字节输入流对象

         FileReader(File file);

    重要方法:

    int read();每次只读取一个字符

    int read(char[] chars);  一次读取多个字符

    写个完整代码

    FileReader f = new FileReader(name);

    char[] chars = new char[10];

    int len;

    StringBuilder sb = new StringBuilder();

    while((len = f.read(chars))!=-1){

    sb.append(new String(chars,0,len));//只能解决格式问题

    }

    f.close();

    4FileWriter

    FileWriter(String name); 以指定的路径创建字符输出流对象

    FileWriter(String name,boolean append);       append:表示是否在之前的基础上追加数据

    FileWriter(File file);

    FileWriter(File file,boolean append);

    重要方法:

       void write(int num);

       void write(char[] chars);

       void write(String str);

    当它输出数据的时候,它并不是直接输出到磁盘上,它是输出到内存中(缓存中),必 须要通过flush或者close方法,它会把内存里面的数据清空,同步到磁盘里面

    flush与close的区别:

    flush,清空内存里面的数据同步到磁盘里面,可以继续使用io

    close,在关闭流资源之前,它会先去调用flush的方法,io流一旦关闭之后,就不能继续使用

    5、转换流

    InputStreamReader(InputStream in);//把字节流转为字符流

    OutputStreamWriter(OutputStream o)//把字符流转为字节流

    三、乱码问题

    为什么以上代码依然会出现中文乱码问题:原因它是把一个字掰成2半了

        解决方式: 使用字符流来读取纯文本内容

        出现中文乱码的三种情况:

        1.编码和解码不一致

        2.把一个中文字符掰成2半

           3.字符编码集不支持中文   ---》ISO-8859-1  它眼里,所有的字符都是1个字节

       

        编码: 把字符串转为字节数组

        解码:把字节数组转为字符串

       

        怎么去正确使用编码和解码呢?

        统一都使用UTF-8的编码集, 你编码是以什么字符集编的,就以什么字符集进行解码

        GBK--中文---2字节

        UTF-8--中文--3个字节

  • 相关阅读:
    ASP.NET中常用的附件上传下载
    C#中导出Excel的常用方式
    ASP.NET中AjaxPro.dll的简单应用
    在ASP.NET中使用FusionCharts图表
    ASP.NET中使用MagicAjax.dll
    FusionCharts图表导出
    C#中经常注入的一些Javascript代码
    CodeSmith3.2(.net2.0)教程
    您未必知道的Css技巧
    Web Service简介
  • 原文地址:https://www.cnblogs.com/limengkun/p/10727154.html
Copyright © 2020-2023  润新知