JAVA基础(10)——IO、NIO

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

JAVA基础系列规划:java


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

1. 标准IO

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

从处理数据类型上,能够分为字节流和字符流;从数据流向上,能够分为输入流和输出流。并发

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

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

字节流和字符流的区别,除了读写单位和处理对象不一样外,在文件操做中,字节流在操做时不使用缓冲区(内存),是文件自己直接操做的,而字符流在操做时使用了缓冲区,经过缓冲区再操做文件。编码

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

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整理》.net

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 

相关文章
相关标签/搜索