`
vvnet
  • 浏览: 116471 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

JDK1.4新特性之I/O APIs篇

    博客分类:
  • JAVA
阅读更多

当然阅读本文之前,你最好先了解一下原有的Java I/O APIs。
  新在何处
  任何新事物的出现,都是对旧事物的一种修正和改进,从而使其更加方便可用,在J2SE v1.4中出现的新I/O(NIO) APIs亦是如此,主要是针对那些旧的I/O APIs不能解决或者解决起来很麻烦的问题。这些新特性主要体现在以下几个方面:
   · 更加灵活的可伸缩的I/O接口(scalable I/O),包括I/O抽象Channels的出现以及新的多元的(multiplexed),非阻塞(non-blocking)的I/O机制。这使得构 建产品级的应用服务更加方便灵活,使你能够轻松应付成千上万个开放的连接,并且可以有效地利用多个处理器。 [Syue.com]
  
   · 快速缓存(fast buffered)的二进制和字符I/O接口。快速缓存的二进制I/O API使得你可以很容易地编写出操作文件流或者二进制数据流的高性能代码。而快速缓存的字符I/O API使得你可以更加高效地处理字符流和文件,此外它还将正则表达式引入到Java平台中来格式化你的输入输出。
  
  · 字符集的编码器和解码器(Character-set encoders and decoders)。这些字符集转换API使得我们可以直接访问操作系统内置的字符集转换器,同时还支持那些外来的转化器。
  
  · 基于Perl风格正则表达式的模式匹配机制(A pattern-matching facility based on Perl-style regular expressions)。
  
   · 改良的文件系统接口,支持锁定和内存映射(locks and memory mapping)。该特性使得你可以更加容易地处理各种文件系统操作中出现的问题,同时使得你可以更加高效地访问大量的文件属性集。此外如果你确实需要, 你还可以访问与平台相关的一些特性。最后,它还提供对非本地文件系统的支持,比如网络文件系统(network filesystems)。
  
  · 新的I/O违例类可以使你更加有针对性地来处理各种I/O错误,让你能够在各种平台上一致地来对待这些错误。
  
  · 增加了对并发的支持,NIO类中的大部分方法都支持多个并发的线程。 ["岁月联盟"提供]
  新的包(packages),类(classes)和接口(interfaces)
  为了实现上面提到的那些功能,在Java JDK1.4中新增加以下这些部分来提供支持:
  · java.nio包:主要是和Buffers有关的一些类
  · java.nio.channels包:主要包括Channels和selectors
  
  · java.nio.charset包:和字符集有关的类
  
  · java.nio.channels.spi包:提供channels服务的类
  
  · java.nio.charset.spi包:提供charsets服务的类
  
  · java.util.regex包:主要是利用正则表达式进行模式匹配的类
  
  · java.lang.CharSequence接口:主要是为java.util.regex包中的一些方法提供一个统一的接口。类String,StringBuffer,java.nio.CharBuffer都重新实现了该接口。
  
  除了这些新增加的类以外,许多原有的类和接口也做了相应的改变。比如FileInputStream和FileOutputStream类中的getChannel、close方法,RandomAccessFile中的getChannel方法等。(1)
  几点说明
   这些新的I/O APIs的推出,并不意味着原有的I/O APIs的废弃,尽管我们提倡以后尽量使用NIO APIs中的特性。另外,虽然这些NIO APIs都希望做到完全的平台无关性,但是由于I/O工作的特殊性,有些特性还是对操作系统和硬件平台有很大的依赖性,比如可升级的I/O API(scalable I/O API),二进制I/O API(binary I/O API)和新的文件系统接口(new filesystem interface)。所以我们以后在利用这些NIO APIs的时候,应当尽量减少本地代码的部分,做到最大限度的可移植性。

[资源来自"岁月联盟"]


  一些例子
  
  
  介绍完这些 新特性以后,我想大家都迫切希望能够通过具体的实例来看看它们具体的用法,可不能光说不练。但是,要知道整个NIO APIs涵盖太大的范围,要一个个完整地讲解它们可能需要一本厚厚的书。所以我们今天只想通过一个典型的例子来做一个引导性的讲解,更多的工作需要大家以 后在具体的实际编程过程中慢慢学习。
  
  为了方便,我将直接采用Sun Java的例子程序,这个例子包括两个文件:TimeQuery.java和TimeServer.java。前者可以向一系列主机查询时间,后者监听连 接并且告诉呼叫者确切的时间。这是个演示NIO socket channels,缓存管理(buffer handling),字符集和正则表达式的很好的例子。(2)
  
  首先,让我们来看看TimeServer.java(详细代码见清单一)。该程序首先检查参数是否是一个数字串,注意这里模式匹配的用法。
  
  if ((args.length == 1) && Pattern.matches("[0-9]+", args[0]))
   port = Integer.parseInt(args[0]);
  
  
  
   接着在方法setup()中,调用类ServerSocketChannel的静态方法open()建立一个server-socket channel,此时它还并没有和具体的主机和端口绑定起来,此时我们需要利用到相关联的server socket的bind()方法,server socket可以用类ServerSocketChannel的socket()方法得到。 "岁月联盟"
  
  ServerSocketChannel ssc = ServerSocketChannel.open();
  InetSocketAddress isa
   = new InetSocketAddress(InetAddress.getLocalHost(), port);
  ssc.socket().bind(isa);
  
  
  
   最后,监听服务请求的任务在方法serve()中实现。首先,调用类ServerSocketChannel的方法accept()接受连接并返回一个 SocketChannel对象,接着调用该对象的write()方法向channel中写入数据。注意在数据写入之前对它的处理过程。
  
  SocketChannel sc = ssc.accept();
   String now = new Date().toString();
   sc.write(encoder.encode(CharBuffer.wrap(now + "\r\n")));
  /********************清单一:TimeServer.java完整的程序清单********************/
  /*
   * @(#)TimeServer.java 1.3 01/12/13
   * Listen for connections and tell callers what time it is.
   * Demonstrates NIO socket channels (accepting and writing),
   * buffer handling, charsets, and regular expressions.
   *
   * Copyright 2001-2002 Sun Microsystems, Inc. All Rights Reserved.

   */

[Syue.com]


  import java.io.*;
  import java.net.*;
  import java.nio.*;
  import java.nio.channels.*;
  import java.nio.charset.*;
  import java.util.*;
  import java.util.regex.*;
  public class TimeServer
  {
   // We can't use the normal daytime port (unless we're running as root,
   // which is unlikely), so we use this one instead
   private static int PORT = 8013;
   // The port we'll actually use
   private static int port = PORT;
   // Charset and encoder for US-ASCII
   private static Charset charset = Charset.forName("US-ASCII");
   private static CharsetEncoder encoder = charset.newEncoder();
   // Direct byte buffer for writing
   private static ByteBuffer dbuf = ByteBuffer.allocateDirect(1024);
   // Open and bind the server-socket channel
   //
   private static ServerSocketChannel setup() throws IOException
   {
   ServerSocketChannel ssc = ServerSocketChannel.open(); "岁月联盟"提供
   InetSocketAddress isa
   = new InetSocketAddress(InetAddress.getLocalHost(), port);
   ssc.socket().bind(isa);
   return ssc;
   }
   // Service the next request to come in on the given channel
   //
   private static void serve(ServerSocketChannel ssc) throws IOException
   {
   SocketChannel sc = ssc.accept();
   try
   {
   String now = new Date().toString();
   sc.write(encoder.encode(CharBuffer.wrap(now + "\r\n")));
   System.out.println(sc.socket().getInetAddress() + " : " + now);
   sc.close();
   }
   finally
   {
   // Make sure we close the channel (and hence the socket)
   sc.close();
   }
   }
  
   public static void main(String[] args) throws IOException
   {
   if (args.length > 1)
   {
   System.err.println("Usage: java TimeServer [port]");
   return;
   }

"岁月联盟"


  
   // If the first argument is a string of digits then we take that
   // to be the port number
   if ((args.length == 1) && Pattern.matches("[0-9]+", args[0]))
   port = Integer.parseInt(args[0]);
  ServerSocketCh

分享到:
评论

相关推荐

    java-jdk1.4 新特性介绍

    标题与描述均提到了“java-jdk1.4新特性介绍”,这暗示了文章的核心将围绕Java JDK 1.4版本中的新增功能进行探讨。Java作为一款广泛使用的编程语言,其每一次更新都伴随着一系列的新特性和性能提升,而JDK 1.4也不...

    旧版本JDK JDK1.4

    3. **NIO(非阻塞I/O)**:Java 1.4引入了`java.nio`包,提供了非阻塞I/O操作,提高了网络和文件系统I/O性能,尤其适合高并发场景。 4. **集合框架增强**:包括`java.util.concurrent`包的引入,提供了线程安全的...

    JDK1.4老版本

    JDK 1.4引入了NIO(非阻塞I/O),这是一个重要的改进,使得Java应用程序能够更有效地处理I/O操作。NIO允许程序选择多路复用器模型,而非传统的阻塞I/O,这极大地提高了服务器端应用的性能,尤其是处理大量并发连接...

    jdk 1.4 旧版 windows zip压缩包

    其次,JDK 1.4引入了NIO(New I/O)API,即非阻塞I/O,位于`java.nio`包中。这个新API提供了基于通道(Channels)和缓冲区(Buffers)的I/O操作,提高了处理大量并发I/O操作的效率,特别是在网络编程和大数据处理...

    JDK1.4老版本.zip

    首先,JDK1.4中最重要的新特性之一是NIO(New I/O),即非阻塞I/O。NIO提供了一种新的I/O模型,使得应用程序可以在处理I/O操作时不必一直等待,而是可以执行其他任务,提高了程序的并发性能。NIO的核心类位于`java....

    jdk1.4绿色免安装版

    2. **NIO(New I/O)**: 新的I/O API,也称为非阻塞I/O,位于`java.nio`包中,为高性能、低延迟的I/O操作提供了新的选择,特别适合网络编程和大文件处理。 3. **异常链(Exception Chaining)**: 异常链允许一个...

    java 开发工具 jdk 1.4 免安装版

    2. **NIO (New IO)**:非阻塞I/O模型,提供了更高效的I/O操作,适用于处理大量并发连接,如网络服务器。NIO通过选择器(Selector)和通道(Channel)等概念,实现了异步数据传输。 3. **正则表达式**:Java 1.4引入...

    jdk1.4源代码

    JDK1.4在这个版本引入了正则表达式、NIO(New I/O)和异常链等新特性,这些都是Java开发者必须掌握的重要概念。 最后,`org`包通常用于开源组织或者标准组织的类库。在JDK1.4中,`org`可能包含了XML解析器、JUnit...

    jdk1.4安装文件

    JDK 1.4引入了NIO(非阻塞I/O)API,这是对传统Java I/O模型的重大改进。NIO提供了一种高效、低延迟的I/O操作方式,允许在多线程环境下同时处理多个输入和输出流,极大地提高了网络编程的性能。 2. **异常链** ...

    jdk1.4-jdk1.4

    jdk1.4非安装版,可直接在MyEclipse等IDE工具导入jdk相应的版本。希望对你们有用处。

    JDK1.4中文开发手册

    Java 1.4引入了新的I/O模型——New I/O (java.nio),提供了基于通道(Channel)和选择器(Selector)的非阻塞I/O操作,这在处理大量并发连接时非常有用,如服务器端编程。 **4. 改进的异常处理:** 异常处理在1.4版本中...

    jdk1.4绿色版本

    3. **NIO(Non-blocking I/O)**: 新的java.nio包提供了非阻塞I/O操作,极大地提高了网络编程和文件I/O的效率,尤其是在处理大量并发连接时。 4. **JDBC 2.0增强**: JDBC(Java Database Connectivity)API得到了...

    这是jdk1.4

    JDK 1.4是Sun Microsystems在2004年发布的一个重要版本,它是Java历史上的一个关键里程碑,引入了许多新特性、改进和性能优化,极大地提升了Java平台的效率和功能。 **主要特性:** 1. **异常链(Exception ...

    JDK1.4.0.17 for win64

    JDK 1.5(也称为Java 5.0)在JDK 1.4的基础上添加了更多新特性,如泛型、枚举、注解等。 **总结** JDK 1.4.0.17对于需要处理旧代码或低版本Java项目的人来说是一个重要的资源。虽然它的功能相比现代版本可能较为...

    jdk1.4 json包 6个全

    标题提到的"jdk1.4 json包 6个全"指的是为Java 1.4版本提供的一个完整的JSON处理库,包含了六个相关的jar文件。 1. **commons-collections.jar**:这是Apache Commons Collections库,提供了大量的集合框架扩展,...

    jdk1.4压缩包

    1. **NIO (Non-blocking Input/Output)**:JDK 1.4引入了新的I/O模型,称为非阻塞I/O。NIO提供了一种处理大量并发连接的新方式,特别适用于网络服务器和其他高性能应用。它通过Channel、Selector和Buffer等新类,...

    axis2 jdk1.4用jar

    在实际开发中,这可能意味着开发者需要解决兼容性问题,例如处理旧版本的Java类库,或者避免使用新版本JDK中的特定API,以确保代码能在JDK 1.4上正确运行。 至于压缩包子文件的文件名称列表:“axis2”,这可能是...

    jdk1.4和jdk1.7版本

    1. **NIO(New IO)**:非阻塞I/O模型,允许在处理多个输入/输出流时提高效率,特别适用于网络和并发应用程序。 2. **正则表达式**:Java 1.4引入了`java.util.regex`包,使开发者能够方便地进行字符串匹配和处理。...

Global site tag (gtag.js) - Google Analytics