java IO简介及演变的历史

转载 2015年07月10日 14:40:06

IO简介

Java中所有的类都继承自Object类,所以各种IO类也不例外。InputStream和OutputStream类操作字节数据。Reader和Writer类工作在字符是上。File类为无论文件提供接口。Java SE 7 引入了java.nio.file.Path类,在新的API中,java.nio.file.Path被认为是java.io.File的替代品,并且提供了更复杂的功能。


IO类演变的历史-字节流与字符流

我们很有必要了解IO类的演变历史,如果缺乏历史的眼光,那么我们对什么时候该使用那些类,以及什么时候不该使用那些类而感到迷惑。
JDK1.0的时候,所有与输入相关的类都继承于InputStream,所有与输出相关的类都继承于OutputStream。
JDK1.1的时候,增加了面向字符的IO类,包括Reader和Writer。
JDK1.4的时候,增加了NIO,实际上旧的IO已经使用重新使用NIO实现过了,即使没有显示的使用NIO编码,我们也能从中受益的。

字节流

字节流,顾名思义,以字节为单位进行IO操作。字节流最常用的方法是read和write方法。
read方法是从流中读取字节并递增文件指针到一下个位置。在字节流的读取过程中,我们要明白一个重要的概念:文件指针。文件指针指示了流中的当前位置。当文件指针到达文件的末尾时候,读取操作返回-1给调用者。read方法不带任何参数,每次只能读取一个字节。read方法的返回值是读取的字节,并转化为int类型返回。如下所示:
FileInputStream reader =new FileInputStream(“filename”);//以字节流格式打开文件
int result =reader.read();
再此有个疑问:为什么result为-1表示已经读取到文件的末尾了?
因为read()方法内部将读取到的所有字节高位补0转为int返回,这样做所有的数据都会是正数,所以此时就可以用-1表示流末尾了。
read方法还有其他的形式:
int read(byte[] b),读出的数据被存储在字节数组中,返回读取的字节数,如果提前到达文件的末尾,返回值可能小于数组的长度。
int read(byte[] b, int off, int len),第一个参数指定数据被存储的字节数组,第二个参数off指定读取的第一个字节将存储在字节数组的偏移量,第三个参数len指定要读取的字节数。
注意:上面三种形式的读取都是直接从文件流里读取的,每次读取只能是一个一个字节的读取。需要说明的是每次读取单个字节或512个字节,需要的io数量都是相同的。为了提高效率,人们设计出了缓存的读取方式:

FileInputStream reader =new FileInputStream("filename");
BufferedInputStream bs = new BufferedInputStream(reader);
bs.read();

虽然上面仍然读取的是一个字节数据,但是因为缓存的存在,效率已经大大提高了。底层的实现是这样的:BufferedInputStream的实现中有一个用于存储数据的内部缓冲区数组:protected volatile byte[] buf。这个缓冲区数组的作用在于对源进行数据块访问,而不是一字节一字节的访问,也就是进行一次I/O将一块数据存到缓冲区中,再从缓冲区中read,当缓冲区为空时再重新读新的数据块。

字符流

字符流是操作字符文件的。一般情况下我们的使用方式是:

FileReader reader =new FileReader("filename");//以字符格式打开文件
BufferedReader buffer = new BufferedReader(reader);//建立缓存
buffer.readLine();//读取缓存中的一行

小结

虽然IO类的类很多,但是与我们实际开发密切相关的类,其实没有几个。我们一定要区分出字节类和字节类,另外还有对缓存的内部实现(以块的形式去读取文件)有个更深刻的认识。

转载自:http://swiftlet.net/archives/1166
http://swiftlet.net/archives/1262

相关文章推荐

html 等待界面

发送中,请稍等... --> 发送中,请稍等... function show(o1,o2,open) { var o1 = document.getElementById(o1)...

Java全屏窗口

1.import java.awt.Dimension; 2.import java.awt.Toolkit; 3.import java.awt.event.MouseAdapter; 4.i...

Java之美[从菜鸟到高手演变]之Java中的IO

IO是Java及众多编程语言很重要的一块,同时很多程序的瓶颈和耗时操作也都在IO这块。所以能够很好的解决IO问题对提高程序性能有很大的帮助!本章我们将要系统的对Java IO做个分析,通过理论加实践,...

Java之美[从菜鸟到高手演变]之多线程简介

从本篇文章起,我将在Java多线程方面进行深入剖析,这是很大的一部分内容,也是我们作为Java开发者必须要跨过的一道坎儿!因为Java本身就是多线程的语言,想要真正掌握Java,那么请先掌握多线程!文...

Java 网络IO简介

  • 2015年06月08日 23:22
  • 781KB
  • 下载

JAVA中的IO流简介

  • 2011年12月30日 23:00
  • 5KB
  • 下载

Java历史简介

Java是一种计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。1991 年Sun公司的James Gosling等人开始开发名称为 Oak 的语言。...

C语言历史演变过程

  • 2014年02月17日 19:06
  • 36KB
  • 下载

Web 开发模式演变历史和趋势

今天给大家分享一篇淘宝玉伯的文章,详细介绍了 Web 开发的四种常用模式以及未来可能成为流行趋势的 Node 全栈开发模式,相信你看了以后一定会有收获。...
  • hwhsong
  • hwhsong
  • 2016年01月29日 15:00
  • 474
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java IO简介及演变的历史
举报原因:
原因补充:

(最多只允许输入30个字)