zoukankan      html  css  js  c++  java
  • java中的IO流读取文件

    1 InputStream类和OutputStream类

    InputStream.read()方法从文件中读取一个字节(0-255),然后将此字节转换成对应的整数返回。假设一个文件的编码为utf-8编码,里面只有一个1,如图:

    那么,InputStream.read将读取1在文件中的16进制表示,即31h,转换成整数就是49。

    如果,文件中存储的是中文"春节",如图:

    中文"春节"的utf-8编码的16进制表示就是E6 98 A5 E8 8A 82。这是InputStream.read()方法将依次读入这些字节,这些字节转换成整数就是:-26, -104, -91, -24, -118, -126。

    OutputStream.write(int)刚好相反,将字节写入文件中,比如:

    out.write(49)

    此时,文件中对应的16进制将显示31h,也就是字符'1',如图:

     2 DataInputStream和DataOutputStream

    这两个总是配对使用,DataOutputStream将java的基本类型在内存中的表示原封不动的写入文件,整数49在内存中的表示为00000031h,总共32位,那么执行完DataOutputStream.writeInt(49),文件中的内容为:

    3个00字节被解码为Null,31h被解码为1,因为字符'1'的编码就是31h。注意这和OutputStream.write(49)的不同,OutputStream只是将49在内存中的最低一个字节,即31h写入了文件,而DataInputStream.writeInt却将49在内存中的整形表示原封不动的写到了文件之中。

    3 Reader类和Writer类

    Reader类的Reader.readLine方法的流程大致如下,从文件中读入一行字符的编码字节,如果读入的时候没有指定相应的字符集,那么,这些读入的字节按照平台的默认编码字符集(即java.nio.charset.Charset.defaultCharset()得到的编码)解码,得到相应的字符串。假设文件的编码方式是utf-8,存储中文字符"春节":

    那么,java首先读入这些字节,再用相应的字符集或者默认的字符集解码这些字节,如果解码的字符集和文件的字符集不一致,将得到乱码。解决的办法,读入的时候指定相应的与文件编码一致的字符集解码:

    InputStreamReader in = new InputStreamReader(new FileInputStream(fileName), "utf-8");
            BufferedReader buf = new BufferedReader(in);

    Writer类写入的时候也一样,首先,根据指定的字符集或者默认的字符集将要写入的字符串编码为字节,然后,将这些字节写入到文件当中。同样,如果编码字符集与解码字符集不一致,同样出现乱码。解决的办法同样是在写入的时候,指定与文件一直的字符集编码:

    Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName), "utf-8"));

     

  • 相关阅读:
    在Xsheel Linux上安装nodejs和npm
    判断js中的数据类型的几种方法
    Sequelize 中文API文档-1. 快速入门、Sequelize类
    php中 ob_start()有什么作用
    PHP错误类型及屏蔽方法
    ajax对象的获取及其常用属性
    linux工作笔记
    Redis和Memcached的区别
    MySQL架构
    Http协议三次握手过程
  • 原文地址:https://www.cnblogs.com/chaoguo1234/p/3379843.html
Copyright © 2011-2022 走看看