动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.巧妙使用if(true)以及if(false)语.
.Java 相关的编译技术.
.14.7.4 Addition operator.
.JAVA教程 第四讲 Java.
.Java读取文件中含有中文的解决办.
.浅析数据源在JDBC中的应用.
.菜鸟初学Java的备忘录(三).
.SQL&Loader可把文件中的数据装载.
.Java从入门到精通之方法篇.
.多态与面向对象(二).
.调用Java编译器API编译Java.
.Java语言深入:对 java.lang 的研.
.tomcat下中文的彻底解决.
.DOM属性用法速查手册.
.Java源码分析:深入探讨Iterator.
.简析 JAVA 的 XML 编程 (给初学者.
.Java中调用外部命令.
.学习用于异常处理的terminate()函.
.Javascript实例教程(19) 使用HoT.
.屏蔽.NET自定义开发组件中的属性.

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

发表日期:2008-1-5 |



  前些天碰到比尔,你看他皱着眉头,一定又碰到了什么难题。一问,还真让我猜中了。原来,比尔对Java中的一些新概念还不太理解,不知道该怎么用。其实,碰到什么难题,可以去找人问,和别人讨论嘛。于是我把比尔领到了“开发者联盟”,相信他会在那得到“前辈”的帮助.现在,就让我们来看看,比尔究竟碰到了什么难题。
  
  了解Java的人一定对于Java中的I/O APIs很熟悉,这里不想对此多费口舌,而是希望向大家介绍一下JDK1.4中新的I/O APIs,让大家都能了解这些新特性,尽早用最先进的装备来武装自己,以免豪华的法拉利跑车总是跑在痛苦的泥泞路上。
  
  当然阅读本文之前,你最好先了解一下原有的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机制。这使得构建产品级的应用服务更加方便灵活,使你能够轻松应付成千上万个开放的连接,并且可以有效地利用多个处理器。
  
  · 快速缓存(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.
   */
  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
上一篇:JDK1.4中工具有哪些改变 人气:386
下一篇:基于jCOM搭建Java-微软信息桥梁 人气:503
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-10-10 企业网站智能管理系统(TZIMS) v6
2008-10-10 拓文asp.net网站内容管理系统 v6
2008-10-10 动网论坛PHP版 v2.0++ Build 081
2008-10-10 免费时代CMS v5.0
2008-10-10 wodig第四季中文DIGG社区 v4.1 b
2008-10-10 老Y文章管理系统 v2.2 bulid 081
2008-10-10 魔法盒动感相册 ASP+SQL版 v2.0
2008-10-10 Asoft签到管理系统 v3.0 Pack1
2008-10-10 哥特人音乐网潮流留言本 v1.1
2008-9-29 酷狗音乐(原KuGoo)2008 v5.310 正
2008-9-29 QQTab 1.1
2008-9-29 网络传送带 Net Transport 2.64a
2008-9-29 谷歌金山词霸v1.8
2008-9-29 TweakVI 1.0 Build 1090
2008-9-29 ACDSee Pro 2.5 Build 333 汉化绿
2008-9-29 Winamp v5.541(2189) 周明波简体
2008-9-27 CCleaner 2.12.651
2008-9-27 Mozilla Thunderbird 2.0.0.17 英
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号