转载:http://blog.csdn.net/weitry/article/details/52964948

JAVA基础系列规划:


IO 是主存和外部设备 ( 硬盘、终端和网络等 ) 拷贝数据的过程。 IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成。

1. 标准IO

Java 标准 IO 类库是 io 面向对象的一种抽象。基于本地方法的底层实现,我们无须关注底层实现。

从处理数据类型上,可以分为字节流和字符流;从数据流向上,可以分为输入流和输出流。

- 字节流 字符流
输入流 InputStrea Reader
输出流 OutputStream Writer

字节流均继承自InputStream和OutputStream这两个抽象类。字符流均继承自Reader和Writer这两个抽象类。

字节流和字符流的区别,除了读写单位和处理对象不同外,在文件操作中,字节流在操作时不使用缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。

输入流和输出流的区别在于流向上,流入程序的为输入,从程序流出的为输出。

Java 标准 IO 类库提供了数量众多的封装类,为了更加从容的使用这些类,使用标准IO时可以参考以下原则:

  1. 考虑最原始的数据格式是什么

    • 二进制格式(只要不能确定是纯文本的),使用InputStream/OutputStream类的子类。
    • 纯文本格式(含纯英文与汉字或其他编码方式),使用Reader/Writer类型子类。
  2. 数据方向 
    • 输入,使用Reader/InputStream类的子类
    • 输出,使用Writer/OutputStream类的子类
  3. 是否需要转换流 
    • 若需要Stream -> Reader/Writer,使用InputStreamReader/OutputStreamWriter。
  4. 数据来源 
    • 文件: FileInputStream、 FileOutputStream、FileReader、FileWriter
    • byte[]:ByteArrayInputStream、ByteArrayOutputStream
    • Char[]:CharArrayReader、 CharArrayWriter
    • String:StringBufferInputStream、StringBufferOuputStream、StringReader、StringWriter
    • 网络数据流:InputStream、OutputStream、Reader、Writer
  5. 是否需要用到缓冲区 
    • BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter
  6. 是否有特殊需要 
    • 格式化输出:PrintStream、PrintWriter
    • 对象输入输出: ObjectInputStream、ObjectOutputStream
    • 进程间通信: PipeInputStream、PipeOutputStream、PipeReader、PipeWriter
    • 合并输入: SequenceInputStream
    • 更特殊的需要: PushbackInputStream、PushbackReader、LineNumberInputStream、LineNumberReader

操作示例可参考《java中的IO整理》

2. NIO

Java NIO是JDK1.4之后新出的一套IO接口,这里的的新是相对于原有标准的Java IO和Java Networking接口。NIO提供了一种完全不同的操作方式:

    • Channel和Buffer

      标准IO的编程接口是面向字节流和字符流的。而NIO是面向通道和缓冲区的,数据总是从通道中读到Buffer缓冲区内,或者从Buffer写入到通道中。

      Buffer。Buffer是一块连续的内存块,是NIO数据读或写的中转地,其只能和Channel对接。

      Channel。Channel是数据的源头或者目的地,用于向Buffer提供数据或者读取Buffer数据,Buffer的唯一接口,支持异步IO。

    • Non-blocking

      NIO中的N可以理解为Non-blocking,不单纯是New。Java NIO使我们可以进行非阻塞IO操作。比如说,单线程中从通道读取数据到buffer,同时可以继续做别的事情,当数据读取到buffer中后,线程再继续处理数据。写数据也是一样的。

    • Selectors

      Selector可以检测多个通道的事件状态(例如:链接打开,数据到达),这样单线程就可以操作多个通道的数据,实现多路 (non-bloking) 非阻塞式的高伸缩性网络 I/O

JAVA基础(10)——IO、NIO的更多相关文章

  1. java基础之IO流(二)之字符流

    java基础之IO流(二)之字符流 字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢? 字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写 ...

  2. java基础之IO流(一)字节流

    java基础之IO流(一)之字节流 IO流体系太大,涉及到的各种流对象,我觉得很有必要总结一下. 那什么是IO流,IO代表Input.Output,而流就是原始数据源与目标媒介的数据传输的一种抽象.典 ...

  3. Java基础之IO流整理

    Java基础之IO流 Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽 ...

  4. java面试:java基础、Io、容器

    1.java基础 1.JDK 和JRE有什么区别 ​ JDK:java开发工具包,java开发运行环境.包含了JRE. ​ JRE:java运行环境,包含java虚拟机,java基础类库. 2.jav ...

  5. Java基础之IO技术(一)

    ---恢复内容开始--- Java基础中的IO技术可谓是非常重要,俗话说的好,万丈高楼起于垒土之间.所以学习Java一定要把基础学好,今天我们来学习IO技术的基础. IO无非就是输入与输出,而其中处理 ...

  6. Java基础之IO和NIO补完

    Java Stream,File,IO 关于NIO和IO的比较,参考:Java NIO系列教程(十二) Java NIO与IO java包之java.io 参考材料:菜鸟教材 NIO 由于下面的系列教 ...

  7. java基础10(IO流)-字节流

    IO流 输入与输出[参照物是程序] 如果从键盘.文件.网络甚至是另一个进程(程序或系统)将数据读入到程序或系统中,称为输入 如果是将程序或系统中的数据写到屏幕.硬件上的文件.网络上的另一端或者是一个进 ...

  8. java基础知识----IO篇

    写在前面:本文章基本覆盖了java IO的所有内容.java新IO没有涉及.文章依然以样例为主,由于解说内容的java书非常多了,我觉的学以致用才是真.代码是写出来的,不是看出来的. 最后欢迎大家提出 ...

  9. JAVA基础知识之NIO.2——Path,Paths,Files

    NIO.2 JDK7对NIO进行了重大改进,主要包含以下两方面 新增Path接口,Paths工具类,Files工具类. 这些接口和工具类对NIO中的功能进行了高度封装,大大简化了文件系统的IO编程. ...

  10. java基础之 IO流

    javaIO流   IO流 : (input  output) 输入输出流 :输入 :将文件读到内存中 输出:将文件从内存输出到其他地方.   IO技术的作用:主要就是解决设备和设备之间的数据传输问题 ...

随机推荐

  1. 解决网页中Waiting (TTFB)数据加载过慢的问题

    解决网页中Waiting (TTFB)数据加载过慢的问题 最近做了一个网页,在本地测试良好,数据可以得到很快的反馈,但是当部署到云端Linux上时候,就会出现加载缓慢的问题.本地测试,得到数据大概3s ...

  2. jQuery插件开发,jquery插件

    关于jQuery插件的开发自己也做了少许研究,自己也写过多个插件,在自己的团队了也分享过一次关于插件的课.开始的时候整觉的很复杂的代码,现在再次看的时候就清晰了许多.这里我把我自己总结出来的东西分享出 ...

  3. onethink 路由规则无效问题解决

    修改文件 Application/Common/Conf/config.php 打开注释 //'MODULE_ALLOW_LIST' => array('Home','Admin'), // 1 ...

  4. POJ 1985.Cow Marathon-树的直径-树的直径模板(BFS、DFS(vector存图)、DFS(前向星存图))

    Cow Marathon Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 7536   Accepted: 3559 Case ...

  5. Apache配置文件相关命令

    转:http://www.365mini.com/page/apache-options-directive.htm Options指令是Apache配置文件中一个比较常见也比较重要的指令,Optio ...

  6. 洛谷P3539 [POI2012] ROZ-Fibonacci Representation

    题目传送门 转载自:five20,转载请注明出处 本来看到这题,蒟蒻是真心没有把握的,还是five20大佬巨orz 首先由于斐波拉契数的前两项是1,1 ,所以易得对于任何整数必能写成多个斐波拉契数加减 ...

  7. shell中的特殊变量

    常见的特殊变量: $* 和 $@ 的区别: 1. 在这两个变量没有被双引号""引起来的时候,它们没有区别. 2. 在这两个变量被双引号""引起来的时候,&quo ...

  8. [Codeforces 1053B] Vasya and Good Sequences

    Link: Codeforces 1053B 传送门 Solution: 其实就是暴力 观察需要满足的条件: 1.个数和为偶数 2.最大个数不大于其它所有个数的和 如果只有第一个条件记录前缀和的奇偶性 ...

  9. 【模拟】Gym - 101190A - Abbreviation

    让你把所有的“连续的仅有首字母大写的”词组用缩写表示,并且在后面用括号注明原词组. #include<cstdio> #include<cstring> using names ...

  10. Educational Codeforces Round 8 E. Zbazi in Zeydabad 树状数组

    E. Zbazi in Zeydabad 题目连接: http://www.codeforces.com/contest/628/problem/D Description A tourist wan ...