`
dreamstone
  • 浏览: 288399 次
  • 来自: ...
文章分类
社区版块
存档分类

探索Java NIO的历程

阅读更多

探索Java NIO的历程
前段时间有些时间,打算看看NIO的东西,本来以为很快可以了解的东西,却用了很多时间。
首先Goole NIO可以看到很多的教程,非阻塞,Buffer,内存映射,块读取前三个很快就有所了解
尝试着写了些小程序,学习东西的时候总喜欢写点小例子。
唯独块读取没有找到对应的东西。(在过程中,主要看了IBM 的NIO入门)

首先,IBM NIO入门中的语句
--------------------------------------------------------------------------------
原来的 I/O 库(在 java.io.*中) 与 NIO 最重要的区别是数据打包和传输的方式。正如前面提到的,
原来的 I/O 以流的方式处理数据,而 NIO 以块的方式处理数据。 面向流 的 I/O 系统一次一个字节地处
理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。为流式数据创建过滤器非常容易。链接几个过滤器,以便每个过滤器只负责单个复杂处理机制的一部分,这样也是相对简单的。不利的一面是,面向流的 I/O 通常相当慢。 一个 面向块 的 I/O 系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的 I/O 缺少一些面向流的I/O 所具有的优雅性和简单性。
--------------------------------------------------------------------------------
首先简单的印象是NIO快,所以想写个程序验证一下.如下复制:

 

 1 public   static   void  test2(String name1, String name2)  {
 2          long  start  =  System.currentTimeMillis();
 3          try   {
 4             FileInputStream fis  =   new  FileInputStream(name1);
 5             FileOutputStream fos  =   new  FileOutputStream(name2);
 6              byte [] buf  =   new   byte [ 8129 ];
 7              while  ( true {                
 8                  int  n  =  fis.read(buf);
 9                  if  (n  ==   - 1 {
10                      break ;
11                 }

12                 fos.write(buf, 0 ,n);
13             }

14             fis.close();
15             fos.close();
16         }
  catch  (Exception e)  {
17             e.printStackTrace();
18         }

19          long  end  =  System.currentTimeMillis();
20          long  time  =  end  -  start;
21         System.out.println(time);
22     }

23     
24      public   static   void  test3(String name1, String name2)  {
25          long  start  =  System.currentTimeMillis();
26          try   {
27             FileInputStream in  =   new  FileInputStream(name1);
28             FileOutputStream out  =   new  FileOutputStream(name2);
29             FileChannel fc1  =  in.getChannel();
30             FileChannel fc2  =  out.getChannel();
31             ByteBuffer bb  =  ByteBuffer.allocate( 8129 );
32              while  ( true {
33                 bb.clear();
34                  int  n  =  fc1.read(bb);
35                  if  (n  ==   - 1 {
36                      break ;
37                 }

38                 bb.flip();
39                 fc2.write(bb);
40             }

41             fc1.close();
42             fc2.close();
43         }
  catch  (IOException e)  {
44
45         }

46          long  end  =  System.currentTimeMillis();
47          long  time  =  end  -  start;
48         System.out.println(time);
49     }

本以为可以结束,结果测试结果出乎意料,函数一比函数二要快,就是说Old IO快于NIO ,从此
 也就开始了整个过程:
 为了了解这个问题,仔细搜索并仔细再看IBM 的NIO教程,看到如下这段话
 ---------------------------------------------
 在 JDK 1.4 中原来的 I/O 包和 NIO 已经很好地集成了。 java.io.* 已经以 NIO 为基础重新实现了,
 所以现在它可以利用 NIO 的一些特性。例如, java.io.* 包中的一些类包含以块的形式读写数据的方法,
 这使得即使在更面向流的系统中,处理速度也会更快。 也可以用 NIO 库实现标准 I/O 功能。例如,
 可以容易地使用块 I/O 一次一个字节地移动数据。但是正如您会看到的,NIO 还提供了原 I/O 包中所没有的许多好处。
    ---------------------------------------------
    所以我想,是否因为InputStream中使用了块读取实现了呢,所以进入JDK1.4中的InputStream中
    看看source,首先引起我注意的是read函数,当参数是一个byte数组的时候,直接调用的native实现
    难道是这个,为了验证,下载了一个JDK1.3下来,发现JDK1.3是一样的。
   
    继续,我想是否是JVM底层实现了块读取呢,为了证明这个我用JDK1.3和JDK1.4同时实现了类似的函数,    测试的结果再次出乎意料,性能相差不大.那就不是这个了。
  为此多方查找资料,未果,为此多写几个函数,好好测试一下IO的不同。于是有了如下的一些函数

  1 //  exec
  2      public   static   void  test1(String name1, String name2)  {
  3          long  start  =  System.currentTimeMillis();
  4          try   {
  5             String cmd  =   " cmd /c copy d:\\out1.txt d:\\out2.txt " ;
  6             System.out.println(cmd);
  7             Process p  =  Runtime.getRuntime().exec(cmd);÷
  8             p.waitFor();
  9         }
  catch  (Exception e)  {
 10             e.printStackTrace();
 11         }

 12          long  end  =  System.currentTimeMillis();
 13          long  time  =  end  -  start;
 14         System.out.println(time);
 15     }

 16
 17      //  old io
 18      public   static   void  test2(String name1, String name2)  {
 19          long  start  =  System.currentTimeMillis();
 20          try   {
 21             FileInputStream fis  =   new  FileInputStream(name1);
 22             FileOutputStream fos  =   new  FileOutputStream(name2);
 23              while  ( true {
 24                  byte [] buf  =   new   byte [ 8129 ];
 25                  int  n  =  fis.read(buf);
 26                  if  (n  ==   - 1 {
 27                      break ;
 28                 }

 29                 fos.write(buf);
 30             }

 31             fis.close();
 32             fos.close();
 33         }
  catch  (Exception e)  {
 34             e.printStackTrace();
 35         }

 36          long  end  =  System.currentTimeMillis();
 37          long  time  =  end  -  start;
 38         System.out.println(time);
 39     }

 40
 41      //  new io
 42      public   static   void  test3(String name1, String name2)  {
 43          long  start  =  System.currentTimeMillis();
 44          try   {
 45             FileInputStream in  =   new  FileInputStream(name1);
 46             FileOutputStream out  =   new  FileOutputStream(name2);
 47             FileChannel fc1  =  in.getChannel();
 48             FileChannel fc2  =  out.getChannel();
 49             ByteBuffer bb  =  ByteBuffer.allocate( 8129 );
 50              while  ( true {
 51                 bb.clear();
 52                  int  n  =  fc1.read(bb);
 53                  if  (n  ==   - 1 {
 54                      break ;
 55                 }

 56                 bb.flip();
 57                 fc2.write(bb);
 58             }

 59             fc1.close();
 60             fc2.close();
 61         }
  catch  (IOException e)  {
 62
分享到:
评论
1 楼 jerry 2009-03-31  
LZ为什么不继续呢?

相关推荐

    Java NIO通信框架在电信领域的实践

    本文将着重探讨电信业务应用软件的发展历程和技术变迁,特别是Java NIO框架在这一过程中所扮演的重要角色。 **1.2 华为电信软件的技术演进史** ##### 1.2.1 C和C++主导的第一代架构 在2005年以前,华为电信软件的...

    Java NIO pdf

    ### Java NIO (New Input/Output) 概述与核心概念 #### 一、Java NIO 的引入背景 Java NIO(New Input/Output),即新的输入/输出库,是随 JDK 1.4 一同引入的重要更新。它提供了一种高效、面向块的数据处理方式,...

    基于Java的进程通信.zip

    在Java编程语言中,进程通信(Process Communication)是多进程应用程序之间交换信息的方式。Java提供了多种机制来...通过这个压缩包中的资源,你可以深入探索这些主题,掌握如何在Java应用中有效地实现进程间的通信。

    java发展历程2.zip

    让我们一起探索Java语言的发展脉络。 1. **Java的诞生**:Java起源于1991年Sun Microsystems的一个内部项目,由詹姆斯·高斯林(James Gosling)领导的团队开发。最初命名为“Oak”,后因商标冲突更名为Java,意在...

    java程序员的成长历程

    例如,响应式编程(Reactive Programming)、微服务架构、函数式编程、Kotlin等新兴技术和语言,以及云计算、大数据、人工智能等领域的发展,都值得Java程序员去探索和掌握。 总的来说,一个Java程序员的成长历程是...

    Getting started with new io

    标题:起步于新输入输出(NIO):深入探索Java NIO 描述:本文将全面介绍Java中的新输入输出(NIO),一个自JDK 1.4版本引入的重要库,旨在提供高速、块导向的输入输出处理能力,相较于传统的Java I/O包,NIO通过...

    java7/jdk1.7

    在NIO.2(New IO 2.0)中,Java 7引入了文件系统抽象,提供了`java.nio.file`包,包含诸如`Path`、`Files`和`FileSystems`等类,使文件操作更加方便且与平台无关。此外,还增加了异步I/O操作,如`...

    330 Java Tips(330 JAVA 小技巧)

    - **进程管理**:熟悉如何在Java中启动、控制外部进程。 - **内存管理**:理解Java虚拟机的内存管理机制,如垃圾回收、堆内存调整等。 ### 十一、Servlets & Servers(Servlet与服务器) - **Servlet基础**:学习...

    java Api-1.9 中文

    这极大地提高了开发效率,使得学习和探索Java API变得更加简单。 Java API 1.9中文版的文档详细列出了所有核心库的类和方法,包括集合框架、IO/NIO、网络编程、多线程、反射、异常处理、日期时间API(java.time包)...

    java面试评价表

    - **NIO(New IO)**:解释NIO的基本概念,包括通道(Channel)、缓冲区(Buffer)等,并讨论其适用场景。 - **Java9改进**:比较Java9与Java8的主要差异,重点介绍新特性及优化点。 - **HashMap内部结构**:详解...

    探索Java I/O 模型的演进

    3. **NIO 2(AIO或NIO 2.0)**:Java 7引入了NIO的增强版,支持异步I/O操作,如AsynchronousServerSocketChannel和AsynchronousSocketChannel,使得开发者可以更方便地实现异步I/O。 在选择合适的Java I/O模型时,...

    JAVA 知识大全 PPT

    以上只是Java知识体系的一部分,实际的“JAVA知识大全PPT”可能会包含更丰富的内容,如注解、模块系统、NIO.2、JDBC数据库操作、Spring框架、Maven项目管理、测试工具JUnit等。学习Java是一个不断探索和实践的过程,...

    ITjava工程师序列学习列表

    Java序列化则用于持久化对象,它是网络传输和跨进程通信的重要手段。 除此之外,你还需要关注Java并发编程,理解线程同步、锁机制,以及并发容器如ConcurrentHashMap的使用。Java集合框架的深入理解,如ArrayList、...

    JAVA2 深度历险

    《JAVA2 深度历险》是一本旨在带领读者深入探索Java编程语言的书籍,其目标是提升读者对Java的全面理解和应用能力。在这个压缩包文件中,我们期待找到一系列关于Java2(也称为Java SE 2)的详细教程和实践案例。 ...

    Java网络编程与分布式计算

    学习者将深入理解如何使用Java实现网络连接、处理数据传输,并探索如何构建可扩展、容错性强的分布式计算解决方案。这将涉及到诸如Socket编程、RMI、JMS、Hadoop、NIO以及Spring框架等相关技术。通过这些知识的学习...

    java每月新闻杂志5

    2008年是Java发展历程中的一个重要时期,Java EE 5已经发布,带来了许多改进和简化,比如注解驱动的开发、依赖注入等,极大地提高了开发效率。此外,Groovy和Grails等基于Java平台的新语言也开始崭露头角,为开发...

    JDK1.8源码,包含sun包,java包,org包等,完整的源码

    首先,`java`包是Java语言的核心包,包含了所有基础的类库,如`java.lang`用于基础类型和对象,`java.io`处理输入输出,`java.util`提供各种实用工具类,如集合框架、日期时间等,还有`java.nio`非阻塞I/O,这些都是...

    caozuoxitong.rar_java 操作系统

    Java中的I/O流和NIO(非阻塞I/O)接口可能在这里发挥作用。 5. **中断处理**:中断是硬件向操作系统发送信号的方式,比如键盘输入或硬件故障。在Java中,这可能涉及到事件驱动编程。 6. **设备驱动**:操作系统...

    java学习笔记-老师的课程笔记

    Java学习笔记是初学者探索Java编程世界的宝贵资源。这份由老师精心整理的课程笔记涵盖了Java的基础到进阶知识,旨在帮助新手快速理解并掌握这门强大的面向对象编程语言。笔记内容可能包括但不限于以下方面: 一、...

Global site tag (gtag.js) - Google Analytics