zoukankan      html  css  js  c++  java
  • JAVA基础(10)——IO、NIO

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

  • 相关阅读:
    动态内存
    用c的数组简单的模拟了入栈
    c++实验,需要的人都知道是啥
    c语言的一个简单的链表
    c++的引用
    c++的一个有趣的程序
    奥运五环的绘制
    网页中的事件与事件响应
    响应事件的示例
    关于window.onload,window.onbeforeload与window.onunload
  • 原文地址:https://www.cnblogs.com/ceshi2016/p/8446780.html
Copyright © 2011-2022 走看看