java NIO和Socket的区别_第1页
java NIO和Socket的区别_第2页
java NIO和Socket的区别_第3页
java NIO和Socket的区别_第4页
java NIO和Socket的区别_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文并非 Java io 或 Java nio 的使用手册 也不是如何使用 Java io 与 Java nio 的技术文 档 这里只是尝试比较这两个包 用最简单的方式突出它们的区别和各自的特性 Java nio 提出了新的流 stream 通讯概念并且加入了新的缓冲 文件流以及 socket 套接 字 特性 java io 概览 这个包通过数据流和序列化机制来实现系统输入和输出 并且支持多种类型的数据流 包 括简单的字节 原生数据类型 地区字符以及对象 流是一个数据的序列 一个程序使用 输入流从一个源头读取数据 这些程序都使用字节流来执行字节的输入和输出 所有涉及字节流的类都是继承自 InputStream 和 OutputStream 关于 InputStream 和 OutputStream 执行 InputStream 和 OutputStream 的操作一般都意味着不断循环的将字节逐一从输入 流读出或写入到输出流 你可以使用缓冲 I O 流来降低 I O 成本 凡是 I O 请求都经常触 发磁盘访问 网络动作或其他一些成本昂贵的操作 缓冲输入流则是从缓冲的内存区域 读取数据 只有缓冲读完才会调用 native input API 不同操作系统提供的本地输入流 API 译者注 同样的 缓冲输出流也将数据写入缓冲 只有缓冲写满才会调用 native output API 这些带缓冲的 API 很好的封装了未缓冲的流操作 BufferedInputStream 和 BufferedOutputStream File I O 上面一节主要是针对数据流 它提供一种数据读取和写入的简单模型 真实的数据流其实 是涉及种类繁多的数据源和目的地 包括磁盘文件 但是 数据流并不支持所有磁盘文件 操作 下面的链接介绍了非数据流的文件 I O File 类可以编写平台无关的检查和处理文件 目录的代码 Random access files 支持非序列化的磁盘文件数据访问 socket 两个在网络上运行的程序之间会建立双向通讯的链接 socket 就是其中一个端点 Socket 相关的类代表着客户端程序和服务端程序之间的连接 包提供了两个类 Socket 和 ServerSocket 它们分别实现了连接的客户端和服务端 客户端知道服务端运行机器的域名 以及服务器监听的端口 它尝试连接到服务器 如果 一切正常 服务器接受并建立连接 当接受连接时 服务器在监听端口上绑定一个新的 socket 并且通知远程端点设置客户端的地址和端口 之所以要建立一个新的 socket 是 为了处理已连接客户端请求的同时还能继续监听原始 socket 上的连接请求 服务器使用阻塞模式等待客户端连接 serverSocket accept 是一个阻塞指令 当服务器 等待接受连接时主线程不能做任何其他操作 由于这个原因 服务器想要达到多任务处理 就只能通过实现一个多线程服务器 每当新建一个 socket 时就必须为它创建一个新线程 NIO API I O 性能经常是一个现代应用的痛处 操作系统持续优化改进 I O 性能 JVM 也提供了一 套运行环境帮助 Java 程序员规避了绝大多数操作系统 I O 之间的差异 这些都让 I O 相 关编码更加高效和简单 但是却隐藏了操作系统的功能特性 想要增强 I O 性能 其实你 可以通过一些特殊的编码直接访问操作系统的底层功能 但是这并不是最佳解决方案 你的代码将必须依赖某个操作系统 Java nio 包应运而生来解决这个难题 它提供了高性 能的 I O 特性 并支持当今大多数常用的商用操作系统 JDK1 4 的 NIO 包介绍了一系列新的 I O 操作的抽象概念 java nio 概览 Java nio 这个新增的包实现了 Java 平台新的 I O API NIO API 包含如下特性 原生类型数据缓冲 字符集的编码器和解码器 基于 Perl 风格正则表达式的模式匹配 通道 Channel 一种新的原生 I O 抽象概念 支持锁和内存映射的文件接口 通过多路复用 非阻塞的 I O 能力实现可伸缩的服务器架构 在 SUN 现 Oracle 的站点上可以找到 java nio 的详细技术文档 这里我将解释一些 nio 的概念 并且和老的 java io 库做下比较 建议不要把 java nio 当作 java io 的替代品 即使它是 java io 的 扩展 Nio 的诞生导致了整个 I O 类和接口的重新修订 详情请看 NIO 中一个最重要的概念是在非阻塞模式下运行 与传统 Java I O 类库完全不同 什么是 非阻塞模式 Non blocking mode 非阻塞模式 一个 I O 流的字节必须序列化的访问 各种设备 打印机端口 网络连接等都是常见的例 子 数据流通常比阻塞式设备慢 而且经常断断续续 大多数操作系统允许将数据流设置为非 阻塞模式 允许进程检查是否流上是否有可用数据 即使没有也不会导致进程阻塞 这种 机制能让进程在输入流空闲等待时执行其他逻辑 但是数据到达时又能及时处理 操作系 统能够观察一堆的数据流并且指示其中哪些处于可用状态 通过观察这些可用状态 一个 进程可以采用常用的编码和单个线程就能同时处理多个活动的数据流 这在网络服务器处 理大量网络连接时被广泛使用 Buffers 缓冲 从简单的入手 首先的改进是一系列 java io 包中新建的缓冲类 这些缓冲提供了一个可以 在内存容器中存储一堆原生类型数据的机制 一个缓冲对象是一个固定容量的容器 容器 中的数据可以被读写 所有的缓冲都是可读的 但并非都是可写的 每个缓冲类都实现了 isReadOnly 方法来表 示缓冲内容是否允许被修改 Channels 缓冲需要配合 Channel 来使用 Channel 是 I O 传输的入口 缓冲则是数据传输的源头 或目的地 在写入时 你想发送的数据首先被放入缓冲 接着被传递至一个 Channel 在 读取时 Channel 负责接收数据 然后寄存至你提供的缓冲中 比如在网络传输时的过 程 用户数据 发送端缓冲 发送端 Channel 网络传输 接收端 Channel 接收端缓冲 用户数据 译者注 Channel 就像一个管道一样 将数据在管道两端的字节缓冲之间进行高效率的传输 它就 像是一个网关 通过它可以用最小的成本来访问操作系统本地的 I O 服务 而缓冲则是在 两端内部的端点 Channel 使用它来发送和接收数据 Channel 能在非阻塞模式下运行 一个非阻塞模式下的 Channel 不会让调用线程睡眠 请求的操作要么立刻完成 要么返回一个结果告知什么都没做 只有面向数据流的 Channel 比如 socket 能够在非阻塞模式下运行 在 java nio 中的 Channel 包括 FileChannel ServerSocketChannel 以及 SocketChannel 这些都是为文件和 socket 管理所提供的特定的 Channel FileChannel FileChannel 是可读可写的 Channel 它必须阻塞 不能用在非阻塞模式中 面向数据流 I O 的非阻塞风格并不适合面向文件的操作 因为文件 I O 有本质上的区别 FileChannel 对象不能被直接创建 一个 FileChannel 实例只能通过在打开的文件对象 RandomAccessFile FileInputStream 或 FileOutputStream 上调用 getChannel 得到 GetChannel 方法返回一个连接到相同文件的 FileChannel 对象 与文件对象拥有 相同的访问权限 FileChannel 对象是线程安全的 多线程能够并发的调用同一个实例上 的方法而不会导致任何问题 但是并非所有操作是支持多线程的 影响 Channel 位置或者 文件大小的操作必须是单线程的 使用 FileChannel 可以让拷贝等操作变成 Channel 到 Channel 的传输 transferTo 和 transferFrom 方法 而且读写操作更易于使用缓冲 SocketChannel SocketChannel 与 FileChannel 不同 新的 Socket Channel 能在非阻塞模式下运行并且 是可选择的 不再需要为每个 socket 连接指派线程了 使用新的 NIO 类 一个或多个线 程能管理成百上千个活动的 socket 连接 只用到很小甚至 0 的性能损失 使用 Selector 对象可以选择可用的 Socket Channel 有 3 个 Socket Channel 类型 SocketChannel ServerSocketChannel 以及 DatagramChannel SocketChannel 和 DatagramChannel 是可读可写的 ServerSocketChannel 监听到来的连接 并且创建新的 SocketChannel 对象 所有这些 SocketChannel 初始化时会创建一个同等的 socket 对象 sockets 这个同等 的 socket 能从 Channel 对象上调用 socket 方法获取 每个 Socket Channel in java nio channels 对象拥有一个相关的 socket 对象 反之并非所有的 socket 对 象拥有相关的 Channel 对象 如果你使用传统方式创建一个 socket 对象 直接初始化它 它将不会拥有一个相关的 Channel 对象 它的 getChannel 方法会返回 null Socket Channel 能在非阻塞模式下运行 传统 Java Socket 阻塞的本性曾经是影响 Java 应用可伸缩性的罪魁祸首之一 而基于非阻塞 I O 则构建了很多复杂巧妙的 高性能的应 用 设置或重置 Channel 的阻塞模式很简单 只要调用 configureBlocking 即可 非阻塞 socket 常在服务器端使用因为它能让同时管理多个 socket 变得简单 Selector 选择器 选择器 Selector 提供了挑选可用状态 Channel 的能力 从而实现多路复用的 I O 我下 面的例子将很好的解释选择器的优势 设想你在一个火车站 non selector 非选择器场景 有 3 个平台 channels 每个平台 都有火车到达 buffer 缓冲 每个平台上都有个管理员管理着到达的列车 worker thread 工作线程 这是非选择器的场景 现在设想下选择器场景 有 3 个平台 channels 每个平台会有火车到达 缓冲 每个平台都有个指示器 比如一个响铃 指示着 火车到达 selection key 在这个场景下只有一个管理员就可以管理所有的 3 个平台 他只需查看指示器 selector select 来判断是否有火车到达然后去处理一下 到达的列车 理解 selector 场景的优势很简单 一个单线程就可以实现多重任务处理的应用 除此之外 使用非阻塞选择器还能得到更多好处 设想火车管理员看着指示器时 他可以等待新的列 车到达而不做其他事 使用 selector select 的阻塞模式 也可以在等待新的列车到达 时 非阻塞模式使用 selector selectNow 去卖车票 这样 selector 就会返回 null 让线 程执行其他代码逻辑 IO vs NIO NIO 使得 I O 比传统 I O 更加高效 在一

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论