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. ubuntu中安装jdk

    1.下载jdk压缩包: http://download.oracle.com/otn-pub/java/jdk/7u55-b13/jdk-7u55-linux-x64.tar.gz 2.解压缩jdk ...

  2. sublime text 发现一个超好的编辑器

    垂直竖行多行编辑 鼠标中建拖动或 shift+右键拖动 切换文件 ctrl+p 输入文件名 可以拖动项目文件夹到sublime text左栏, 也可文件--打开文件夹--项目所在文件夹,但会在新窗口中 ...

  3. 为什么1Byte=8bit

    Byte是字节的意思,而字节在早期计算机内部是用标准ASCII码来表示的根据当时情况确定至多有128种需要表示的字符(当时是IBM的标准,现在普遍是255),也就是2的7次方用二进制的0和1来表示就需 ...

  4. 在UC浏览器上很炫的一个效果

    效果简述: 这个效果将会强行去除UC浏览器的网址输入框和底部的菜单栏,这样网页将会占据整个手机界面.感觉看起来很像是一个APP. 浏览器界面右下角将会出现一个向上的标志,用来唤出简单的菜单栏. (界面 ...

  5. (摘) MDI登陆问题

    MDI编程中需要验证用户身份,那么登陆窗口就需要在验证密码后进行相关的隐藏处理. (1)隐藏登陆窗口(登陆窗体作为启动) 登陆按钮事件:this.Hide();//隐藏登陆窗口MDI_Name M = ...

  6. NOI十连测 第五测 T2

    思路:考虑建立可持久化线段树,第一层维护的是i这个位置的next位置,第二层,维护的是接下来走这个字符会到哪个节点. 感觉很巧妙啊,不愧是Claris #include<algorithm> ...

  7. Find out C++ Memory Usage in Code

    You can use Microsoft Platform SDK functions to get the heap size at a specific point. If get the he ...

  8. Ghost源代码

    http://download.csdn.net/download/xiaoshuai0101/4739231 彻底的掩藏磁盘,让病毒和破坏的人没有一点办法上传者 guizhoutiger

  9. 转:完善eclipse+pdt作php开发中的代码提示能力

    在eclipse开发中 ,可能由于各种原因导致项目文件(eclipse内置)丢失或错乱, 因而, 失去一些能力.. 以下是经过被痛苦折磨后查阅总结的一点东西 设置完下面内容, 支持以下特性 PHP: ...

  10. Android Studio 配置SVN实现代码管理

    Refference From:http://iaiai.iteye.com/blog/2267346 一.Android Studio配置SVN Android Studio关联配置SVN很简单,在 ...