文档章节

Java 流io和块io

ksfzhaohui
 ksfzhaohui
发布于 2012/12/14 14:17
字数 885
阅读 379
收藏 0

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

在 Java 的早期,JVM 在解释字节码时往往很少或没有运行时优化。这就意味着,Java 程序往往拖得很长,其运行速率大大低于本地编译代码,因而对操作系统I/O 子系统的要求并不太高。 如今在运行时优化方面,JVM 已然前进了一大步。现在 JVM 运行字节码的速率已经接近本地编译代码,借助动态运行时优化,其表现甚至还有所超越。这就意味着,多数 Java 应用程序已不再受 CPU 的束缚(把大量时间用在执行代码上),而更多时候是受 I/O 的束缚(等待数据传输)。 

然而,在大多数情况下,Java 应用程序并非真的受着 I/O 的束缚。操作系统并非不能快速传送数据,让 Java 有事可做;相反,是 JVM 自身在 I/O 方面效率欠佳。 操作系统与 Java 基于流的 I/O模型有些不匹配。操作系统要移动的是大块数据(缓冲区),这往往是在硬件直接存储器存取(DMA)的协助下完成的。而 JVM 的 I/O 类喜欢操作小块数据——单个字节、几行文本。结果,操作系统送来整缓冲区的数据,java.io 的流数据类再花大量时间把它们拆成小块,往往拷贝一个小块就要往返于几层对象。操作系统喜欢整卡车地运来数据,java.io 类则喜欢一铲子一铲子地加工数据。有了 NIO,就可以轻松地把一卡车数据备份到您能直接使用的地方( ByteBuffer 对象)。 

1)面向流I/O的系统:一次处理一个字节的数据。一个输入流每次会读入一个字节的数据,一个输出流同样每次次消费一个字节的数据。对于流式数据,很容易创建过滤器。可以相对简单地把几个过滤器连接在一起,每个过滤器完成自己的工作,也是按字节进行过滤,精细的处理机制。另一方面,面向流I/-O的通信往往比较缓慢。 


2)面向块I/O的系统:以块为单位处理数据。每个操作步骤会生成或消费一个块的数据。以块为单位处理数据,其处理速度远快于以字节流为单位的方式。但是,与面向流I/O的通信相比,面向块I/O的通信缺乏优雅和简洁。 

新的抽象把重点放在了如何缩短抽象与现实之间的距离上面。NIO 抽象与现实中存在的实体有着非常真实直接的交互关系。 

关于何时该采用传统io,何时应该采用nio: 
1) 扩展性考虑:例如在进行Socket编程通信时每一个Socket都应占据一个线程。使用NIO虽然更富有效率,但相对难以编码和扩展。(当然这一现象在不断的被新的设计和NIO库的特性所改善) 
2) 性能考虑:在处理成千上万的连接时,你可能需要更好的传统IO的扩展性;但是如果连接数量较低时,你可能更注重NIO的高吞吐率。 
3) 当使用SSL (Secure Sockets Layer,安全套接字层) 工作时,选择NIO则实现难度很大 

© 著作权归作者所有

ksfzhaohui

ksfzhaohui

粉丝 426
博文 167
码字总数 261352
作品 3
南京
高级程序员
私信 提问
加载中

评论(0)

系统学习 Java IO ---- 目录,概览

Java IO 类的系统教程,原创。主要参考自英文教程 Java IO Tutorial 和 Java Doc。 http://tutorials.jenkov.com/java-io/index.html目的:掌握 Java IO 几乎所有类的基础用法,完全知道什么...

osc_7izxyaq6
2018/11/23
8
0
高级Java工程师必备 ----- 深入分析 Java IO (三)

概述 Java IO即Java 输入输出系统。不管我们编写何种应用,都难免和各种输入输出相关的媒介打交道,其实和媒介进行IO的过程是十分复杂的,这要考虑的因素特别多,比如我们要考虑和哪种媒介进...

osc_nnbkiac5
04/16
14
0
JAVA基础(10)——IO、NIO

转载:http://blog.csdn.net/weitry/article/details/52964948 JAVA基础系列规划: JAVA基础(1)——基本概念 JAVA基础(2)——数据类型 JAVA基础(3)——容器(1)——常用容器分类 JAVA...

osc_cyo2dovg
2018/02/13
8
0
java NIO:IO与NIO的区别

一、概念 NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标...

盼望明天
2018/09/11
148
0
漫话:如何给女朋友解释什么是BIO、NIO和AIO?

周末午后,在家里面进行电话面试,我问了面试者几个关于IO的问题,其中包括什么是BIO、NIO和AIO?三者有什么区别?具体如何使用等问题,但是面试者回答的并不是很满意。于是我在面试评价中写...

漫话编程
2019/07/01
1.3K
0

没有更多内容

加载失败,请刷新页面

加载更多

方法区的回收

方法区中主要回收:1.废弃常量;2.无用的类。 但是判断它们废弃或无用了并不一定会被回收。 1.废弃常量: 对于常量池中的常量a,如果没有任何对象引用该常量的话,就表示它是一个废弃常量。 ...

曦鱼violet
43分钟前
16
0
为什么Android模拟器这么慢? 我们如何加快Android模拟器的速度? [关闭]

问题: Want to improve this post? 想要改善这篇文章吗? Provide detailed answers to this question, including citations and an explanation of why your answer is correct. 提供此问题......

技术盛宴
50分钟前
27
0
功能测试(手工测试)转向软件测试工程师的进阶之路

今天在爱码小哥的知乎上看到一个网友提问说,功能测试(手工测试)想要提升自己应该怎么做,有哪些主要职责,正好今天有时间,明天是周六了。我整理了软件测试进阶各方面的资料。初衷于帮助大...

爱码小哥
51分钟前
21
0
Discourse 如何在首页中显示 Box 的子分类

如下图, 如何在 Discourse 中显示子分类。 discourse-sub-col-01 1207×872 147 KB 你可以在分类的设定中进行设置,这个设定需要在上级目录中设置。 discourse-sub-col-02 556×656 76.3 KB...

honeymoose
今天
27
0
OSChina 周六乱弹 —— 妈妈快看,外面有只人类

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《1万年の时を越えて》- 上松範康 手机党少年们想听歌,请使劲儿戳(这里) @火眼...

小小编辑
今天
43
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部