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. 自定义View—绘制基本图形

    一.Canvas能够绘制哪些图形 二.

  2. 字符串:格式化 - 零基础入门学习Python015

    字符串:格式化 让编程改变世界 Change the world by program 字符串:格式化 上节课我们介绍了Python字符串的N多种奇葩方法的用法,但我们唯独漏了一个format()方法 ...

  3. BZOJ 2879 NOI2012美食节

    链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2879 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M ...

  4. SHELL种类,版本及选择

    SHELL种类,版本及选择 凡是使用 *INX 的人,不论是作为 login shell 还是编程,多少都要接触到 Shell.经过多年的发展, Shell 的种类繁多.除了我们熟悉的 sh.ksh. ...

  5. GBT28181中的RTP

    国标中说h264数据按照RFC3984打包,但是国标的测试工具——SPVMN,却不支持RFC3984的打包方式.无奈之下直接用RFC3550的方式打包,其实就是分包,然后加上RTP头,对于一帧的结束, ...

  6. PHP 字符串替换 substr_replace 与 str_replace 函数

    PHP 字符串替换 用于从字符串中替换指定字符串. 相关函数如下: substr_replace():把字符串的一部分替换为另一个字符串 str_replace():使用一个字符串替换字符串中的另一些 ...

  7. 程序员求职之道(《程序员面试笔试宝典》)之程序设计基础(static的使用)?

    在C语言中,关键字static的意思是静态,它有三个明显的作用:首先,在函数体内,静态变量具有"记忆"功能,即一个被声明为静态的变量在这一函数被调用过程中其值维持不变.其次,在模块 ...

  8. hdu 5676 ztr loves lucky numbers(dfs+离线)

    Problem Description ztr loves lucky numbers. Everybody knows that positive integers are lucky if the ...

  9. SpringMVC(一)——流程框架总体介绍

    SpringMVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能MVC 模块,其功能和Strtus2 ...

  10. Pure Css 菜单的使用

    本人新手,之前偶尔接触Bootstrap,也做过一些响应式开发,但是都是略显皮毛,公司的业务需求也限制了深入学习. 现着手Pure Css学习,尝试了简单的左边菜单自动隐藏的demo.闲话少说,代码贴 ...