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"));

java中的IO流读取文件的更多相关文章

  1. java中的IO流之文件复制

    O(∩_∩)O哈哈~ 1.综述 一门成熟的语言肯定具备的几个模块:IO,通信,线程,UI...... Java作为一门成熟的程序语言,其IO流是比较复杂的.上个图大家感受下: 简单分析一下,IO分为两 ...

  2. Java中常用IO流之文件流的基本使用姿势

    所谓的 IO 即 Input(输入)/Output(输出) ,当软件与外部资源(例如:网络,数据库,磁盘文件)交互的时候,就会用到 IO 操作.而在IO操作中,最常用的一种方式就是流,也被称为IO流. ...

  3. java中使用IO流复制文件

    public class TestIO { public static void main(String[] args) { // TODO Auto-generated method stub tr ...

  4. java中的IO流

    Java中的IO流 在之前的时候我已经接触过C#中的IO流,也就是说集中数据固化的方式之一,那么我们今天来说一下java中的IO流. 首先,我们学习IO流就是要对文件或目录进行一系列的操作,那么怎样操 ...

  5. Java中的IO流总结

    Java中的IO流总结 1. 流的继承关系,以及字节流和字符流. 2. 节点流FileOutputStream和FileInputStream和处理流BufferedInputStream和Buffe ...

  6. Java中的IO流大体介绍

    由于Java中的IO流是在是知识点繁多,所以我大约花了1周的时间将其整理起来.但是整理起来后并不是将完事了,我还是要分字节流和字符流来讲述.然后字节流和字符流中还有是否带有缓冲流. 讲述完IO流后我将 ...

  7. Java中的IO流,Input和Output的用法,字节流和字符流的区别

    Java中的IO流:就是内存与设备之间的输入和输出操作就成为IO操作,也就是IO流.内存中的数据持久化到设备上-------->输出(Output).把 硬盘上的数据读取到内存中,这种操作 成为 ...

  8. Java中的IO流(五)

    上一篇<Java中的IO流(四)>记录了一下Properties类,此类不属于IO流,它属于集合框架.接下来说一下IO流中的其它流 一,打印流PrintStream PrintStream ...

  9. Java中的IO流(六)

    上一篇<Java中的IO流(五)>把流中的打印流PrintStream,PrintWriter,序列流SequenceInputStream以及结合之前所记录的知识点完成了文件的切割与文件 ...

随机推荐

  1. HDU 4268 Alice and Bob set用法

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=4268 贪心思想,用set实现平衡树,但是set有唯一性,所以要用 multiset AC代码: #i ...

  2. ECSHOP_百度收录网址后面有?from=rss

    ecshop的feed.xml文件中间添加了?from=rss,百度蜘蛛抓取收录后,会出现frome页面,导致商品列表重复抓取,访问出错. 修改方法简单: 在根目录下的feed.php找到(八处), ...

  3. Double Strings Solved Problem code: DOUBLE

    # Fuking silly, OTZ.... import sys def main(): n = int(raw_input()) for num in sys.stdin: if int(num ...

  4. Linux下安装memcached图文版

    所用到的工具: putty小软件  可以远程连接主机的小软件     然后在屏幕上输入用户名root  密码:******即可连接 由于安装这两个工具需要编译所以:第一步要进行安装编译: 习惯于将下载 ...

  5. iOS学习之自定义视图时,在屏幕发生旋转时触发重新布局方法

    如果要对自定义的视图在屏幕旋转时重新布局,则在自定义视图中定义以下触发方法: -(void)layoutSubviews { [super layoutSubviews]; //1.获取到屏幕旋转的方 ...

  6. Qt工具知多少

    一级题目: Qt Designer — 所见即所得的界面设计工具, 可以用拖拽的方式将控件排布在界面上,支持layout, 支持signal/slot编辑. 生成的文件保存为ui格式, ui是xml格 ...

  7. [置顶] Android四大组件之BroadcastReceiver

    Android四大组件之BroadcastReceiver Broadcast Receiver 广播接收器,是一种负责接收广播消息并对消息做出响应的组件,和Service一样并不提供与用户交互的UI ...

  8. Hdu3812-Sea Sky(深搜+剪枝)

    Sea and Sky are the most favorite things of iSea, even when he was a small child.  Suzi once wrote: ...

  9. Ubuntu Eclipse的Tomcat小问题:不能输入server name,不能启动tomcat

    Ubuntu的Eclipse上安装Tomcat环境,这是让人烦啊,万幸还是终于解决了. Eclipse上Tomcat的搭建: 1.点击Eclipse上的菜单:Windows - Preference, ...

  10. thinkphp实现excel数据的导入导出

    下载地址:phpexcel.rar 实现步骤: 一:在http://phpexcel.codeplex.com/下载最新PHPExcel放到Vendor下,注意位置:ThinkPHP\Extend\V ...