Java IO与NIO的总结、比较

一、IO流总结

  1、Java I/O主要包括如下3层次:

  流式部分——最主要的部分。如:OutputStream、InputStream、Writer、Reader等
  非流式部分——如:File类、RandomAccessFile类和FileDescriptor等类
  其他——文件读取部分的与安全相关的类,如:SerializablePermission类,以及与本地操作系统相关的文件系统的类,如:FileSystem类和Win32FileSystem类和WinNTFileSystem类。

  

  2、流式部分的不同分类

  • 按数据的流动方向:输入流、输出流
  • 按所要操作的数据对象的格式:字节流、字符流
  • 按来源和去向:
    • File(文件): FileInputStream, FileOutputStream, FileReader, FileWriter
    • byte[]:ByteArrayInputStream, ByteArrayOutputStream
      Char[]: CharArrayReader, CharArrayWriterString: StringBufferInputStream, StringReader, StringWriter

    • 网络数据流:InputStream, OutputStream, Reader, Writer

  以上也是我们在选择使用IO流时要考虑的因素,除此之外,还需要考虑另外三点:

  1、是否需要转换流?
  是,就使用转换流,从Stream转化为Reader、Writer:InputStreamReader。

  2、是否需要缓冲提高效率

  是,就加上Buffered:BufferedInputStream, BufferedOuputStream, BufferedReader, BufferedWriter

  3、是否需要格式化输出

二、NIO总结

  Java NIO 的三个核心API:

  • Channel(通道-接口)
  • Buffers(缓冲区-抽象类)
  • Selector(选择器-抽象类)

三、IO和NIO的选择

  比较下IO与NIO的主要不同:

IO NIO
面向流 面向缓冲
阻塞IO 非阻塞IO
选择器

  1、面向流与面向缓冲

   Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。

  Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。

  2、阻塞与非阻塞

  Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。

  Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。

  一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。

  3、关于选择器

  Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。

四、NIO和IO如何影响应用程序的设计

  无论选择IO或NIO工具箱,可能会影响您应用程序设计的以下几个方面:

  • 对NIO或IO类的API调用。
  • 数据处理。
  • 用来处理数据的线程数。

  参考文章:http://www.importnew.com/19046.html

  

  

原文地址:https://www.cnblogs.com/bigbigbigo/p/9142022.html

时间: 2024-08-04 01:47:46

Java IO与NIO的总结、比较的相关文章

Java IO模型&NIO

Java IO模型&NIO Java IO模型NIO 楔子 概述 网络服务 经典的服务设计 经典的SocketServer循环阻塞 可伸缩目标 分而治之 事件驱动设计 背景知识AWT 事件 Reactor 模式 Reactor基础模式 Java NIO 支持 Channels Buffers Selectors SelectionKeys Reactor 模式实践 第一步初始化 第二步循环分发 第三步接收者 第四步 Handler设置 第五步请求处理 还有一种状态Handler 多线程版本Rea

分别使用Java IO、NIO、Netty实现的一个Echo Server示例

分别使用Java IO.Java NIO.Netty来实现一个简单的EchoServer(即原样返回客户端的输入信息). Java IO int port = 9000; ServerSocket ss = new ServerSocket(port); while (true) { final Socket socket = ss.accept(); new Thread(new Runnable() { public void run() { while (true) { try { Buf

java IO和NIO 的区别

Java NIO和IO的主要区别 下表总结了Java NIO和IO之间的主要差别. IO                NIO 面向流            面向缓冲 阻塞IO           非阻塞IO 无 选择器 面向流与面向缓冲 Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的. Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方.此外,它不能前后移动流中的数据.如果需要前后移动从流中读取的数据,需要先将它

漫谈Java IO之 NIO那些事儿

前面一篇中已经介绍了基本IO的使用以及最简单的阻塞服务器的例子,本篇就来介绍下NIO的相关内容,前面的分享可以参考目录: 网络IO的基本知识与概念 普通IO以及BIO服务器 NIO的使用与服务器Hello world Netty入门与服务器Hello world Netty深入浅出 NIO,也叫做new-IO或者non-blocking-IO,就暂且理解为非阻塞IO吧. 为什么选择NIO 那么NIO相对于IO来说,有什么优势呢?总结来说: IO是面向流的,数据只能从一端读取到另一端,不能随意读写

java IO、NIO、AIO详解

概述 在我们学习Java的IO流之前,我们都要了解几个关键词 同步与异步(synchronous/asynchronous):同步是一种可靠的有序运行机制,当我们进行同步操作时,后续的任务是等待当前调用返回,才会进行下一步:而异步则相反,其他任务不需要等待当前调用返回,通常依靠事件.回调等机制来实现任务间次序关系 阻塞与非阻塞:在进行阻塞操作时,当前线程会处于阻塞状态,无法从事其他任务,只有当条件就绪才能继续,比如ServerSocket新连接建立完毕,或者数据读取.写入操作完成:而非阻塞则是不

Java IO和NIO文章目录

1.java IO详尽解析 2.深入分析 Java I/O 的工作机制 3.InputStream类详解 4.OutputStream类详解 5.JAVA的节点流和处理流 6.FileInputStream和FileOutputStream详解 7.JAVA IO中的设计模式

Java IO流-NIO简介

2017-11-05 22:09:04 NIO NIO:new IO就是新IO的意思,JDK4开始出现新IO,新IO和传统的IO有相同的目的,都是用于进行输入输出的,但是新IO使用了不同的方式来处理输入输出,采用内存映射文件的方式,将文件或者文件中的一段区域映射到内存中,就可以相访问内存一样来访问文件了,这种方式的效率比旧IO要高很多,但是目前好多地方我们看到还是旧IO为主. 一个小例子: Path:路径 Paths:有一个静态方法返回一个路径       public static Path

Java.nio vs Java.io

Java.nio vs Java.io By Nino Guarnacci on Jun 18, 2009 --- posted by Davide Pisano This document is not a Java.io or a Java.nio manual, or a technical document about Java.io and Java.nio use. It only attempts to compare these two packages, highlightin

Java NIO:IO与NIO的区别

一.概念 NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多.在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO. 二.NIO和IO的主要区别 下表总结了Java IO和NIO之间的主要区别: IO NIO 面向流 面向缓冲 阻塞IO 非阻塞IO 无 选择器 1.面向流与面向缓冲 Java IO和NIO之间第一个最大的区别是,IO是面向流的,NIO是