转载: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

最新文章

  1. linux查看MySQL版本的四种方法
  2. .net用SQL Server进行session会话管理
  3. 手动设置Windows7锁屏界面背景
  4. STM32L051 PVD的调试
  5. asp.net mvc中包含webapi时,token失效产生302的解决方案
  6. VEP安装指南
  7. Codeforces Round #313 (Div. 1) A. Gerald's Hexagon 数学题
  8. [杂题]URAL2047. Maths
  9. hdoj 1873 看病要排队【优先队列】
  10. iScroll 下拉刷新
  11. linux 切换用户之后变成-bash-x.x$的解决方法
  12. JS特效——文字打印机
  13. ThinkPHP框架知识的注意点
  14. Android 开发笔记___SD卡基本操作
  15. hdu 2048 递推&&错排
  16. js获取元素宽高、位置相关知识汇总
  17. win10双系统安装卸载ubuntu
  18. my live thinkcenter / ThinkCentre M920x Tiny / Thinkpad yoga 12 vPro
  19. Eslint相关知识和配置大全
  20. Liunx软Raid实现

热门文章

  1. 【剑指offer】(第 2 版)Java 题解
  2. 【笔试题】Java 易错题精选
  3. linux 把用户加入一个组&从这个组中移除
  4. 货币金额javascript正则表达式
  5. 10 个常用的 es6 特性
  6. ubuntu14.04下安装爬虫工具scrapy
  7. Visual Studio Xamarin提示Bonjour backend初始化失败
  8. [BZOJ3214][ZJOI2013]丽洁体(Hash+DP)
  9. 【Floyd】POJ2139 -Six Degrees of Cowvin Bacon
  10. bzoj 1483: [HNOI2009]梦幻布丁