﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-&lt;font color="red"&gt;JRen&lt;/font&gt;&lt;font color="lightgreen"&gt;大鹏一曰同风起，扶摇直上九万里&lt;/font&gt;-随笔分类-Java</title><link>http://www.blogjava.net/liaojiyong/category/11433.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 05 Jun 2007 06:59:54 GMT</lastBuildDate><pubDate>Tue, 05 Jun 2007 06:59:54 GMT</pubDate><ttl>60</ttl><item><title>能为你的程序锦上添花的几种程序结构（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/06/05/122123.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Tue, 05 Jun 2007 05:26:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/06/05/122123.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/122123.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/06/05/122123.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/122123.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/122123.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一."用到再说"结构.如果有一个类有一个集合成员,可以在为此成员添加元素时再把具体集合建立起来,以免浪费空间和时间.例:&nbsp;1&nbsp;public&nbsp;class&nbsp;Company{&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;List&nbsp;members=null;&nbsp;3&nbsp;&nbsp;...&nbsp;&nbsp;<a href='http://www.blogjava.net/liaojiyong/archive/2007/06/05/122123.html'>阅读全文</a><img src ="http://www.blogjava.net/liaojiyong/aggbug/122123.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-06-05 13:26 <a href="http://www.blogjava.net/liaojiyong/archive/2007/06/05/122123.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java虚拟机运行机制(转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119762.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 24 May 2007 08:46:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119762.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/119762.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/119762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/119762.html</trackback:ping><description><![CDATA[<font face=Verdana>JVM(Java虚拟机)一种用于计算设备的规范，可用不同的方式（软件或硬件）加以实现。编译虚拟机的指令集与编译微处理器的指令集非常类似。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。&nbsp;</font>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上，就能保证经过编译的任何Java代码能够在该系统上运行。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java虚拟机是一个想象中的机器,在实际的计算机上通过软件模拟来实现。Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统。</p>
<p><strong>一、Java虚拟机(JVM)概述</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.为什么要使用Java虚拟机</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.谁需要了解Java虚拟机</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java虚拟机是Java语言底层实现的基础,对Java语言感兴趣的人都应对Java虚拟机有个大概的了解。这有助于理解Java语言的一些性质,也有助于使用Java语言。对于要在特定平台上实现Java虚拟机的软件人员,Java语言的编译器作者以及要用硬件芯片实现Java虚拟机的人来说,则必须深刻理解Java虚拟机的规范。另外,如果你想扩展Java语言,或是把其它语言编译成Java语言的字节码,你也需要深入地了解Java虚拟机。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.Java虚拟机支持的数据类型</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java虚拟机支持Java语言的基本数据类型如下:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte://1字节有符号整数的补码&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;short://2字节有符号整数的补码&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int://4字节有符号整数的补码&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long://8字节有符号整数的补码&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float://4字节IEEE754单精度浮点数&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double://8字节IEEE754双精度浮点数&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char://2字节无符号Unicode字符</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;几乎所有的Java类型检查都是在编译时完成的。上面列出的原始数据类型的数据在Java执行时不需要用硬件标记。操作这些原始数据类型数据的字节码(指令)本身就已经指出了操作数的数据类型,例如iadd、ladd、fadd和dadd指令都是把两个数相加,其操作数类型别是int、long、float和double。虚拟机没有给boolean(布尔)类型设置单独的指令。boolean型的数据是由integer指令,包括integer返回来处理的。boolean型的数组则是用byte数组来处理的。虚拟机使用IEEE754格式的浮点数。不支持IEEE格式的较旧的计算机,在运行Java数值计算程序时,可能会非常慢。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;虚拟机支持的其它数据类型包括:&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;object//对一个Javaobject(对象)的4字节引用&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnAddress//4字节,用于jsr/ret/jsr-w/ret-w指令&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注:Java数组被当作object处理。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;虚拟机的规范对于object内部的结构没有任何特殊的要求。在Sun公司的实现中,对object的引用是一个句柄,其中包含一对指针:一个指针指向该object的方法表,另一个指向该object的数据。用Java虚拟机的字节码表示的程序应该遵守类型规定。Java虚拟机的实现应拒绝执行违反了类型规定的字节码程序。Java虚拟机由于字节码定义的限制似乎只能运行于32位地址空间的机器上。但是可以创建一个Java虚拟机,它自动地把字节码转换成64位的形式。从Java虚拟机支持的数据类型可以看出,Java对数据类型的内部格式进行了严格规定,这样使得各种Java虚拟机的实现对数据的解释是相同的,从而保证了Java的与平台无关性和可&nbsp;<br>移植性。</p>
<p><br><strong>二、Java虚拟机JVM规格描述</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JVM的设计目标是提供一个基于抽象规格描述的计算机模型，为解释程序开发人员提很好的灵活性，同时也确保Java代码可在符合该规范的任何系统上运行。JVM对其实现的某些方面给出了具体的定义，特别是对Java可执行代码，即字节码(Bytecode)的格式给出了明确的规格。这一规格包括操作码和操作数的语法和数值、标识符的数值表示方式、以及Java类文件中的Java对象、常量缓冲池在JVM的存储映象。这些定义为JVM解释器开发人员提供了所需的信息和开发环境。Java的设计者希望给开发人员以随心所欲使用Java的自由。&nbsp;　　　　JVM定义了控制Java代码解释执行和具体实现的五种规格，它们是：&nbsp;　　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*JVM指令系统&nbsp;　　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*JVM寄存器&nbsp;　　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*JVM栈结构&nbsp;　　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*JVM碎片回收堆&nbsp;　　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*JVM存储区&nbsp;</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.1JVM指令系统&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JVM指令系统同其他计算机的指令系统极其相似。Java指令也是由&nbsp;操作码和操作数两部分组成。操作码为8位二进制数，操作数进紧随在操作码的后面，其长度根据需要而不同。操作码用于指定一条指令操作的性质（在这里我们采用汇编符号的形式进行说明），如iload表示从存储器中装入一个整数，anewarray表示为一个新数组分配空间，iand表示两个整数的"与"，ret用于流程控制，表示从对某一方法的调用中返回。当长度大于8位时，操作数被分为两个以上字节存放。JVM采用了"big&nbsp;endian"的编码方式来处理这种情况，即高位bits存放在低字节中。这同&nbsp;Motorola及其他的RISC&nbsp;CPU采用的编码方式是一致的，而与Intel采用的"little&nbsp;endian&nbsp;"的编码方式即低位bits存放在低位字节的方法不同。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java指令系统是以Java语言的实现为目的设计的，其中包含了用于调用方法和监视多先程系统的指令。Java的8位操作码的长度使得JVM最多有256种指令，目前已使用了160多种操作码。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.2JVM指令系统&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所有的CPU均包含用于保存系统状态和处理器所需信息的寄存器组。如果虚拟机定义较多的寄存器，便可以从中得到更多的信息而不必对栈或内存进行访问，这有利于提高运行速度。然而，如果虚拟机中的寄存器比实际CPU的寄存器多，在实现虚拟机时就会占用处理器大量的时间来用常规存储器模拟寄存器，这反而会降低虚拟机的效率。针对这种情况，JVM只设置了4个最为常用的寄存器。它们是：&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc程序计数器&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;optop操作数栈顶指针&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame当前执行环境指针&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vars指向当前执行环境中第一个局部变量的指针&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所有寄存器均为32位。pc用于记录程序的执行。optop,frame和vars用于记录指向Java栈区的指针。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.3JVM栈结构&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作为基于栈结构的计算机，Java栈是JVM存储信息的主要方法。当JVM得到一个Java字节码应用程序后，便为该代码中一个类的每一个方法创建一个栈框架，以保存该方法的状态信息。每个栈框架包括以下三类信息：&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;局部变量&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;执行环境&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;操作数栈</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;局部变量用于存储一个类的方法中所用到的局部变量。vars寄存器指向该变量表中的第一个局部变量。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;执行环境用于保存解释器对Java字节码进行解释过程中所需的信息。它们是：上次调用的方法、局部变量指针和操作数栈的栈顶和栈底指针。执行环境是一个执行一个方法的控制中心。例如：如果解释器要执行iadd(整数加法)，首先要从frame寄存器中找到当前执行环境，而后便从执行环境中找到操作数栈，从栈顶弹出两个整数进行加法运算，最后将结果压入栈顶。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;操作数栈用于存储运算所需操作数及运算的结果。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.4JVM碎片回收堆&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java类的实例所需的存储空间是在堆上分配的。解释器具体承担为类实例分配空间的工作。解释器在为一个实例分配完存储空间后，便开始记录对该实例所占用的内存区域的使用。一旦对象使用完毕，便将其回收到堆中。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Java语言中，除了new语句外没有其他方法为一对象申请和释放内存。对内存进行释放和回收的工作是由Java运行系统承担的。这允许Java运行系统的设计者自己决定碎片回收的方法。在SUN公司开发的Java解释器和Hot&nbsp;Java环境中，碎片回收用后台线程的方式来执行。这不但为运行系统提供了良好的性能，而且使程序设计人员摆脱了自己控制内存使用的风险。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.5JVM存储区&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JVM有两类存储区：常量缓冲池和方法区。常量缓冲池用于存储类名称、方法和字段名称以及串常量。方法区则用于存储Java方法的字节码。对于这两种存储区域具体实现方式在JVM规格中没有明确规定。这使得Java应用程序的存储布局必须在运行过程中确定，依赖于具体平台的实现方式。<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JVM是为Java字节码定义的一种独立于具体平台的规格描述，是Java平台独立性的基础。目前的JVM还存在一些限制和不足，有待于进一步的完善，但无论如何，JVM的思想是成功的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对比分析：如果把Java原程序想象成我们的C++原程序，Java原程序编译后生成的字节码就相当于C++原程序编译后的80x86的机器码（二进制程序文件），JVM虚拟机相当于80x86计算机系统,Java解释器相当于80x86CPU。在80x86CPU上运行的是机器码，在Java解释器上运行的是Java字节码。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java解释器相当于运行Java字节码的&#8220;CPU&#8221;,但该&#8220;CPU&#8221;不是通过硬件实现的，而是用软件实现的。Java解释器实际上就是特定的平台下的一个应用程序。只要实现了特定平台下的解释器程序，Java字节码就能通过解释器程序在该平台下运行，这是Java跨平台的根本。当前，并不是在所有的平台下都有相应Java解释器程序，这也是Java并不能在所有的平台下都能运行的原因，它只能在已实现了Java解释器程序的平台下运行。</p>
<p><br><strong>三、Java虚拟机JVM的体系结构</strong>&nbsp;</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;刚才已经提到，JVM可以由不同的厂商来实现。由于厂商的不同必然导致JVM在实现上的一些不同，然而JVM还是可以实现跨平台的特性，这就要归功于设计JVM时的体系结构了。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们知道，一个JVM实例的行为不光是它自己的事，还涉及到它的子系统、存储区域、数据类型和指令这些部分，它们描述了JVM的一个抽象的内部体系结构，其目的不光规定实现JVM时它内部的体系结构，更重要的是提供了一种方式，用于严格定义实现时的外部行为。每个JVM都有两种机制，一个是装载具有合适名称的类(类或是接口)，叫做类装载子系统；另外的一个负责执行包含在已装载的类或接口中的指令，叫做运行引擎。每个JVM又包括方法区、堆、Java栈、程序计数器和本地方法栈这五个部分，这几个部分和类装载机制与运行引擎机制一起组成的体系结构图为：&nbsp;</p>
<p align=center><img src="http://www.itisedu.com/manage/Upload/image/200642610323548.jpg" border=0><br>图3JVM的体系结构&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JVM的每个实例都有一个它自己的方法域和一个堆，运行于JVM内的所有的线程都共享这些区域；当虚拟机装载类文件的时候，它解析其中的二进制数据所包含的类信息，并把它们放到方法域中；当程序运行的时候，JVM把程序初始化的所有对象置于堆上；而每个线程创建的时候，都会拥有自己的程序计数器和Java栈，其中程序计数器中的值指向下一条即将被执行的指令，线程的Java栈则存储为该线程调用Java方法的状态；本地方法调用的状态被存储在本地方法栈，该方法栈依赖于具体的实现。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面分别对这几个部分进行说明。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;执行引擎处于JVM的核心位置，在Java虚拟机规范中，它的行为是由指令集所决定的。尽管对于每条指令，规范很详细地说明了当JVM执行字节码遇到指令时，它的实现应该做什么，但对于怎么做却言之甚少。Java虚拟机支持大约248个字节码。每个字节码执行一种基本的CPU运算,例如,把一个整数加到寄存器,子程序转移等。Java指令集相当于Java程序的汇编语言。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java指令集中的指令包含一个单字节的操作符,用于指定要执行的操作,还有0个或多个操作数,提供操作所需的参数或数据。许多指令没有操作数,仅由一个单字节的操作符构成。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;虚拟机的内层循环的执行过程如下:&nbsp;</p>
<p>&nbsp;</p>
<p>do{&nbsp;</p>
<p>取一个操作符字节;&nbsp;</p>
<p>根据操作符的值执行一个动作;&nbsp;</p>
<p>}while(程序未结束)&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于指令系统的简单性,使得虚拟机执行的过程十分简单,从而有利于提高执行的效率。指令中操作数的数量和大小是由操作符决定的。如果操作数比一个字节大,那么它存储的顺序是高位字节优先。例如,一个16位的参数存放时占用两个字节,其值为:&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第一个字节*256+第二个字节字节码。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;指令流一般只是字节对齐的。指令tableswitch和lookup是例外,在这两条指令内部要求强制的4字节边界对齐。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于本地方法接口，实现JVM并不要求一定要有它的支持，甚至可以完全没有。Sun公司实现Java本地接口(JNI)是出于可移植性的考虑，当然我们也可以设计出其它的本地接口来代替Sun公司的JNI。但是这些设计与实现是比较复杂的事情，需要确保垃圾回收器不会将那些正在被本地方法调用的对象释放掉。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java的堆是一个运行时数据区,类的实例(对象)从中分配空间，它的管理是由垃圾回收来负责的:不给程序员显式释放对象的能力。Java不规定具体使用的垃圾回收算法,可以根据系统的需求使用各种各样的算法。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java方法区与传统语言中的编译后代码或是Unix进程中的正文段类似。它保存方法代码(编译后的java代码)和符号表。在当前的Java实现中,方法代码不包括在垃圾回收堆中,但计划在将来的版本中实现。每个类文件包含了一个Java类或一个Java界面的编译后的代码。可以说类文件是Java语言的执行代码文件。为了保证类文件的平台无关性,Java虚拟机规范中对类文件的格式也作了详细的说明。其具体细节请参考Sun公司的Java虚拟机规范。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java虚拟机的寄存器用于保存机器的运行状态,与微处理器中的某些专用寄存器类似。Java虚拟机的寄存器有四种:&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc:&nbsp;Java程序计数器；&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;optop:&nbsp;指向操作数栈顶端的指针；&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame:&nbsp;指向当前执行方法的执行环境的指针；。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vars:&nbsp;指向当前执行方法的局部变量区第一个变量的指针。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在上述体系结构图中，我们所说的是第一种，即程序计数器，每个线程一旦被创建就拥有了自己的程序计数器。当线程执行Java方法的时候，它包含该线程正在被执行的指令的地址。但是若线程执行的是一个本地的方法，那么程序计数器的值就不会被定义。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java虚拟机的栈有三个区域:局部变量区、运行环境区、操作数区。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;局部变量区&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;每个Java方法使用一个固定大小的局部变量集。它们按照与vars寄存器的字偏移量来寻址。局部变量都是32位的。长整数和双精度浮点数占据了两个局部变量的空间,却按照第一个局部变量的索引来寻址。(例如,一个具有索引n的局部变量,如果是一个双精度浮点数,那么它实际占据了索引n和n+1所代表的存储空间)虚拟机规范并不要求在局部变量中的64位的值是64位对齐的。虚拟机提供了把局部变量中的值装载到操作数栈的指令,也提供了把操作数栈中的值写入局部变量的指令。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;运行环境区&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在运行环境中包含的信息用于动态链接,正常的方法返回以及异常捕捉。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;动态链接&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;运行环境包括对指向当前类和当前方法的解释器符号表的指针,用于支持方法代码的动态链接。方法的class文件代码在引用要调用的方法和要访问的变量时使用符号。动态链接把符号形式的方法调用翻译成实际方法调用,装载必要的类以解释还没有定义的符号,并把变量访问翻译成与这些变量运行时的存储结构相应的偏移地址。动态链接方法和变量使得方法中使用的其它类的变化不会影响到本程序的代码。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;正常的方法返回&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果当前方法正常地结束了,在执行了一条具有正确类型的返回指令时,调用的方法会得到一个返回值。执行环境在正常返回的情况下用于恢复调用者的寄存器,并把调用者的程序计数器增加一个恰当的数值,以跳过已执行过的方法调用指令,然后在调用者的执行环境中继续执行下去。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;异常捕捉&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;异常情况在Java中被称作Error(错误)或Exception(异常),是Throwable类的子类,在程序中的原因是:①动态链接错,如无法找到所需的class文件。②运行时错,如对一个空指针的引用。程序使用了throw语句。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当异常发生时,Java虚拟机采取如下措施:&nbsp;</p>
<p>&#167;&nbsp;检查与当前方法相联系的catch子句表。每个catch子句包含其有效指令范围,能够处理的异常类型,以及处理异常的代码块地址。&nbsp;</p>
<p>&#167;&nbsp;与异常相匹配的catch子句应该符合下面的条件:造成异常的指令在其指令范围之内,发生的异常类型是其能处理的异常类型的子类型。如果找到了匹配的catch子句,那么系统转移到指定的异常处理块处执行;如果没有找到异常处理块,重复寻找匹配的catch子句的过程,直到当前方法的所有嵌套的catch子句都被检查过。&nbsp;</p>
<p>&#167;&nbsp;由于虚拟机从第一个匹配的catch子句处继续执行,所以catch子句表中的顺序是很重要的。因为Java代码是结构化的,因此总可以把某个方法的所有的异常处理器都按序排列到一个表中,对任意可能的程序计数器的值,都可以用线性的顺序找到合适的异常处理块,以处理在该程序计数器值下发生的异常情况。&nbsp;</p>
<p>&#167;&nbsp;如果找不到匹配的catch子句,那么当前方法得到一个"未截获异常"的结果并返回到当前方法的调用者,好像异常刚刚在其调用者中发生一样。如果在调用者中仍然没有找到相应的异常处理块,那么这种错误将被传播下去。如果错误被传播到最顶层,那么系统将调用一个缺省的异常处理块。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;操作数栈区&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;机器指令只从操作数栈中取操作数,对它们进行操作,并把结果返回到栈中。选择栈结构的原因是:在只有少量寄存器或非通用寄存器的机器(如Intel486)上,也能够高效地模拟虚拟机的行为。操作数栈是32位的。它用于给方法传递参数,并从方法接收结果,也用于支持操作的参数,并保存操作的结果。例如,iadd指令将两个整数相加。相加的两个整数应该是操作数栈顶的两个字。这两个字是由先前的指令压进堆栈的。这两个整数将从堆栈弹出、相加,并把结果压回到操作数栈中。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;每个原始数据类型都有专门的指令对它们进行必须的操作。每个操作数在栈中需要一个存储位置,除了long和double型,它们需要两个位置。操作数只能被适用于其类型的操作符所操作。例如,压入两个int类型的数,如果把它们当作是一个long类型的数则是非法的。在Sun的虚拟机实现中,这个限制由字节码验证器强制实行。但是,有少数操作(操作符dupe和swap),用于对运行时数据区进行操作时是不考虑类型的。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本地方法栈，当一个线程调用本地方法时，它就不再受到虚拟机关于结构和安全限制方面的约束，它既可以访问虚拟机的运行期数据区，也可以使用本地处理器以及任何类型的栈。例如，本地栈是一个C语言的栈，那么当C程序调用C函数时，函数的参数以某种顺序被压入栈，结果则返回给调用函数。在实现Java虚拟机时，本地方法接口使用的是C语言的模型栈，那么它的本地方法栈的调度与使用则完全与C语言的栈相同。&nbsp;</p>
<p><strong>四、Java虚拟机JVM的运行过程</strong>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上面对虚拟机的各个部分进行了比较详细的说明，下面通过一个具体的例子来分析它的运行过程。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;虚拟机通过调用某个指定类的方法main启动，传递给main一个字符串数组参数，使指定的类被装载，同时链接该类所使用的其它的类型，并且初始化它们。例如对于程序：&nbsp;</p>
<p>class&nbsp;HelloApp&nbsp;</p>
<p>{&nbsp;</p>
<p>public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;</p>
<p>{&nbsp;</p>
<p>System.out.println("Hello&nbsp;World!");&nbsp;</p>
<p>for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;args.length;&nbsp;i++&nbsp;)&nbsp;</p>
<p>{&nbsp;</p>
<p>System.out.println(args);&nbsp;</p>
<p>}&nbsp;</p>
<p>}&nbsp;</p>
<p>}&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译后在命令行模式下键入：&nbsp;java&nbsp;HelloApp&nbsp;run&nbsp;virtual&nbsp;machine&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将通过调用HelloApp的方法main来启动java虚拟机，传递给main一个包含三个字符串"run"、"virtual"、"machine"的数组。现在我们略述虚拟机在执行HelloApp时可能采取的步骤。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;开始试图执行类HelloApp的main方法，发现该类并没有被装载，也就是说虚拟机当前不包含该类的二进制代表，于是虚拟机使用ClassLoader试图寻找这样的二进制代表。如果这个进程失败，则抛出一个异常。类被装载后同时在main方法被调用之前，必须对类HelloApp与其它类型进行链接然后初始化。链接包含三个阶段：检验，准备和解析。检验检查被装载的主类的符号和语义，准备则创建类或接口的静态域以及把这些域初始化为标准的默认值，解析负责检查主类对其它类或接口的符号引用，在这一步它是可选的。类的初始化是对类中声明的静态初始化函数和静态域的初始化构造方法的执行。一个类在初始化之前它的父类必须被初始化。整个过程如下：&nbsp;</p>
<p align=center><br><img src="http://www.itisedu.com/manage/Upload/image/200642610233917.jpg" border=0><br>图4：JAVA虚拟机的运行过程&nbsp;</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/119762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-05-24 16:46 <a href="http://www.blogjava.net/liaojiyong/archive/2007/05/24/119762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK6的新特性(转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119684.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 24 May 2007 03:47:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119684.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/119684.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/05/24/119684.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/119684.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/119684.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: SystemTray类在JDK6中 ,AWT新增加了两个类:Desktop和SystemTray,前者可以用来打开系统默认浏览器浏览指定的URL,打开系统默认邮件客户端给指定的邮箱发邮件,用默认应用程序打开或编辑文件(比如,用记事本打开以txt为后缀名的文件),用系统默认的打印机打印文档;后者可以用来在系统托盘区创建一个托盘程序.下面代码演示了Desktop和SystemTray的用法./****...&nbsp;&nbsp;<a href='http://www.blogjava.net/liaojiyong/archive/2007/05/24/119684.html'>阅读全文</a><img src ="http://www.blogjava.net/liaojiyong/aggbug/119684.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-05-24 11:47 <a href="http://www.blogjava.net/liaojiyong/archive/2007/05/24/119684.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求两时间点之间日期差的简洁方法（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/05/16/117843.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 16 May 2007 06:54:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/05/16/117843.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/117843.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/05/16/117843.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/117843.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/117843.html</trackback:ping><description><![CDATA[<p><font size=3>原来以为，求两个时间之日期差应该不是问题，直到有一天...。 我曾经辅导过的一位开发员向我求教，我还不以为很难，尝试用</font><font size=3>Calendar/GregorianCalendar类来计算，看起来代码太复杂，放弃。苦想半小时，最后想出一句话，写出来在MSN上发给他。当时的感觉路子很野</font><font size=3>，上不了台面。这句话也是下面要介绍的简洁方法。<br>再后来，我的一位前同事发来邮件，说起网上一大牛发布的blog，是一个牛人数落Java标准库的，挺有意思。需求很简单：有两个Date型的变量</font><font size=3>(a, b)，如何计算两者相隔的天数？你有简单的解决方案吗？（据这个牛人说，还是很麻烦的哦）<br>看了大牛的方法，暗地思忖：既然Java标准库不能解决，我的方法不是很简单吗？！我的底气腾腾往上涨。</font></p>
<p><font size=3>====<br>我的方法：<br></font></p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;differ(Date&nbsp;date1,&nbsp;Date&nbsp;date2)&nbsp;<br><img id=_44_218_Open_Image onclick="this.style.display='none'; document.getElementById('_44_218_Open_Text').style.display='none'; document.getElementById('_44_218_Closed_Image').style.display='inline'; document.getElementById('_44_218_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_44_218_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_44_218_Closed_Text').style.display='none'; document.getElementById('_44_218_Open_Image').style.display='inline'; document.getElementById('_44_218_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=_44_218_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_44_218_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">return&nbsp;date1.getTime()&nbsp;/&nbsp;(24*60*60*1000)&nbsp;-&nbsp;date2.getTime()&nbsp;/&nbsp;(24*60*60*1000);&nbsp;</span><span style="COLOR: #008000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;date2.getTime()&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">86400000</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;date1.getTime()&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">86400000</span><span style="COLOR: #000000">;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">用立即数，减少乘法计算的开销</span><span style="COLOR: #008000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">&nbsp;</span></div>
</div>
<p>&nbsp;</p>
<p><font size=3>问题分析：求日期差，重要的是时间对象的日期部分，与时分秒没有关系。所以问题的关键是过滤掉时分秒，保留日期部分。干的活象低通滤波器</font><font size=3>，滤掉高频杂波，保留低频信号。<br>解决思路：一天的秒数是24*60*60*1000=86400000=Senconds。时间对象date1.getTime()是自1970年1月1日零点以来的秒数，用它整除以Seconds</font><font size=3>，就得到自1970年1月1日以来的天数。注意这里用的是整除符号，时分秒被过滤掉了。对date2也施行同样的操作，得到date2的天数。date2的天</font><font size=3>数减去date1的天数，所得结果就是日期差。<br>举例来说，用最简单的例子，假设date1等于1970年1月5日15点整，date2等于1970年1月6日14点整。date1整除以seconds的结果是4，date2整除以</font><font size=3>seconds的结果是5，date2与date1相差5-4=1天，与我们的预期相符。</font></p>
<p><font size=3>====<br>我的同事Kun给出了方法：获取二者的milliseconds相减，然后/24/60/60。<br>这个方法应该是不正确的。因为秒数相减，得到的是二者的时间差，并没有滤掉时分秒。<br>计算结果：用刚才的例子验算一下，date2.getTime() - date1.getTime() 等于相当于23小时的秒数，再整除以seconds，结果是0天，与预期的1</font><font size=3>天不相符。<br>Kun的方法与正确方法的区别在于：先做减法，还是先做整除法。</font></p>
<p><br><font size=3>====<br>同事在网上找到的方法：<br></font></p>
<font size=3>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">SimpleDateFormat&nbsp;myFormatter&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;SimpleDateFormat(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">yyyy-MM-dd</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>java.util.Date&nbsp;date</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;myFormatter.parse(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">2003-05-1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>java.util.Date&nbsp;mydate</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;myFormatter.parse(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1899-12-30</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;&nbsp;day</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(date.getTime()</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">mydate.getTime())</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">24</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">60</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">60</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>out.println(day);</span></div>
</div>
<p><br>结果应该是正确的，它根本就没有时分秒，有了时分秒与Kun的方法等价。不过用起来会很麻烦，因为要先得到字符串的日期，才能用它。</p>
<p><font size=3>====<br>最后看看大牛的方法：<br>大牛博客地址：</font><a href="http://blog.csdn.net/rmartin/archive/2006/12/22/1452867.aspx"><font color=#3468a4 size=3><u>http://blog.csdn.net/rmartin/archive/2006/12/22/1452867.aspx</u></font></a></p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><u><font color=#3468a4><img id=_53_456_Open_Image onclick="this.style.display='none'; document.getElementById('_53_456_Open_Text').style.display='none'; document.getElementById('_53_456_Closed_Image').style.display='inline'; document.getElementById('_53_456_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_53_456_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_53_456_Closed_Text').style.display='none'; document.getElementById('_53_456_Open_Image').style.display='inline'; document.getElementById('_53_456_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top></font></u><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;daysBetween(Date&nbsp;now,&nbsp;Date&nbsp;returnDate)&nbsp;</span><span id=_53_456_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_53_456_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;cNow&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Calendar.getInstance();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;cReturnDate&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Calendar.getInstance();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cNow.setTime(now);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cReturnDate.setTime(returnDate);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;setTimeToMidnight(cNow);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;setTimeToMidnight(cReturnDate);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;todayMs&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;cNow.getTimeInMillis();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;returnMs&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;cReturnDate.getTimeInMillis();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;intervalMs&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;todayMs&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;returnMs;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;millisecondsToDays(intervalMs);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img id=_509_561_Open_Image onclick="this.style.display='none'; document.getElementById('_509_561_Open_Text').style.display='none'; document.getElementById('_509_561_Closed_Image').style.display='inline'; document.getElementById('_509_561_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_509_561_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_509_561_Closed_Text').style.display='none'; document.getElementById('_509_561_Open_Image').style.display='inline'; document.getElementById('_509_561_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;millisecondsToDays(</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;intervalMs)&nbsp;</span><span id=_509_561_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_509_561_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)&nbsp;(intervalMs&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">1000</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">86400</span><span style="COLOR: #000000">));<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img id=_616_739_Open_Image onclick="this.style.display='none'; document.getElementById('_616_739_Open_Text').style.display='none'; document.getElementById('_616_739_Closed_Image').style.display='inline'; document.getElementById('_616_739_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_616_739_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_616_739_Closed_Text').style.display='none'; document.getElementById('_616_739_Open_Image').style.display='inline'; document.getElementById('_616_739_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;setTimeToMidnight(Calendar&nbsp;calendar)&nbsp;</span><span id=_616_739_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_616_739_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;calendar.set(Calendar.HOUR_OF_DAY,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;calendar.set(Calendar.MINUTE,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;calendar.set(Calendar.SECOND,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span></div>
</div>
<p>&nbsp;</p>
<p><font size=3>看起来很复杂吧，没有求证过，应该是正确的吧！</font></p>
</font>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/117843.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-05-16 14:54 <a href="http://www.blogjava.net/liaojiyong/archive/2007/05/16/117843.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>代码发现的问题及解决方案（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/05/16/117840.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 16 May 2007 06:48:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/05/16/117840.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/117840.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/05/16/117840.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/117840.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/117840.html</trackback:ping><description><![CDATA[<font size=2>===<br>* 错误代码:* 正确代码：</font>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img id=_31_37_Open_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_31_37_Open_Text').style.display='none'; document.getElementById('_31_37_Closed_Image').style.display='inline'; document.getElementById('_31_37_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_31_37_Closed_Image style="DISPLAY: inline" onclick="this.style.display='none'; document.getElementById('_31_37_Closed_Text').style.display='none'; document.getElementById('_31_37_Open_Image').style.display='inline'; document.getElementById('_31_37_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(((String)rs[</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">]).equals(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">))</span><span id=_31_37_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: inline; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_31_37_Open_Text style="DISPLAY: none"><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #008000">//<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #000000">}</span></span></div>
</div>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img id=_29_35_Open_Image onclick="this.style.display='none'; document.getElementById('_29_35_Open_Text').style.display='none'; document.getElementById('_29_35_Closed_Image').style.display='inline'; document.getElementById('_29_35_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_29_35_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_29_35_Closed_Text').style.display='none'; document.getElementById('_29_35_Open_Image').style.display='inline'; document.getElementById('_29_35_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">.equals((String)rs[</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">]))</span><span id=_29_35_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_29_35_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #008000">//<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #000000">}</span></span></div>
</div>
<p><br>* 原因：rs[4]可能为null值，导致空对象引用，抛出异常。</p>
<p><br><font size=2>===<br>代码优化</font></p>
<p><font size=2>* 原代码：</font><font size=2>* 替换为：<br>cpvo.setProdType(StaticParameters.getProductType(rs[4]));</font></p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img id=_31_60_Open_Image onclick="this.style.display='none'; document.getElementById('_31_60_Open_Text').style.display='none'; document.getElementById('_31_60_Closed_Image').style.display='inline'; document.getElementById('_31_60_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_31_60_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_31_60_Closed_Text').style.display='none'; document.getElementById('_31_60_Open_Image').style.display='inline'; document.getElementById('_31_60_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(((String)rs[</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">]).equals(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">))</span><span id=_31_60_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_31_60_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;cpvo.setProdType(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">通用产品</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img id=_98_127_Open_Image onclick="this.style.display='none'; document.getElementById('_98_127_Open_Text').style.display='none'; document.getElementById('_98_127_Closed_Image').style.display='inline'; document.getElementById('_98_127_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_98_127_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_98_127_Closed_Text').style.display='none'; document.getElementById('_98_127_Open_Image').style.display='inline'; document.getElementById('_98_127_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(((String)rs[</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">]).equals(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">S</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">))</span><span id=_98_127_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_98_127_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;cpvo.setProdType(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">解决方案</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;cpvo.setProdType((String)rs[</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">]);</span></div>
</div>
<p>&nbsp;</p>
<p><font size=2>定义类StaticParameters，参见文件StaticParameters.java。<br>其他静态参数有类似问题，例如：绑定标志。</font></p>
<p><font size=2>* 代码：</font></p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 95%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.util.HashMap;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.util.Map;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;StaticParameters<br><img id=_79_510_Open_Image onclick="this.style.display='none'; document.getElementById('_79_510_Open_Text').style.display='none'; document.getElementById('_79_510_Closed_Image').style.display='inline'; document.getElementById('_79_510_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=_79_510_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_79_510_Closed_Text').style.display='none'; document.getElementById('_79_510_Open_Image').style.display='inline'; document.getElementById('_79_510_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=_79_510_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_79_510_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;Map&nbsp;productTypes&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br><img id=_132_175_Open_Image onclick="this.style.display='none'; document.getElementById('_132_175_Open_Text').style.display='none'; document.getElementById('_132_175_Closed_Image').style.display='inline'; document.getElementById('_132_175_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_132_175_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_132_175_Closed_Text').style.display='none'; document.getElementById('_132_175_Open_Image').style.display='inline'; document.getElementById('_132_175_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span id=_132_175_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_132_175_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">初始化静态参数集合</span><span style="COLOR: #008000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;initProductTypes();&nbsp;&nbsp;&nbsp;&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;initProductTypes()<br><img id=_220_361_Open_Image onclick="this.style.display='none'; document.getElementById('_220_361_Open_Text').style.display='none'; document.getElementById('_220_361_Closed_Image').style.display='inline'; document.getElementById('_220_361_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_220_361_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_220_361_Closed_Text').style.display='none'; document.getElementById('_220_361_Open_Image').style.display='inline'; document.getElementById('_220_361_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</span><span id=_220_361_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_220_361_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(productTypes&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br><img id=_252_357_Open_Image onclick="this.style.display='none'; document.getElementById('_252_357_Open_Text').style.display='none'; document.getElementById('_252_357_Closed_Image').style.display='inline'; document.getElementById('_252_357_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_252_357_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_252_357_Closed_Text').style.display='none'; document.getElementById('_252_357_Open_Image').style.display='inline'; document.getElementById('_252_357_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;</span><span id=_252_357_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_252_357_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;productTypes&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;HashMap();<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;productTypes.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">通用产品</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;productTypes.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">S</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">解决方案</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;String&nbsp;getProductType(String&nbsp;code)<br><img id=_415_508_Open_Image onclick="this.style.display='none'; document.getElementById('_415_508_Open_Text').style.display='none'; document.getElementById('_415_508_Closed_Image').style.display='inline'; document.getElementById('_415_508_Closed_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=_415_508_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; document.getElementById('_415_508_Closed_Text').style.display='none'; document.getElementById('_415_508_Open_Image').style.display='inline'; document.getElementById('_415_508_Open_Text').style.display='inline';" alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</span><span id=_415_508_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">...</span><span id=_415_508_Open_Text><span style="COLOR: #000000">{<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;String&nbsp;value&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(String)&nbsp;productTypes.get(code);&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;value&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;code&nbsp;:&nbsp;value;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top><br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top>&nbsp;<br><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align=top></span></div>
</div>
<br><br>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/117840.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-05-16 14:48 <a href="http://www.blogjava.net/liaojiyong/archive/2007/05/16/117840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>serialVersionUID</title><link>http://www.blogjava.net/liaojiyong/archive/2007/05/16/117831.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 16 May 2007 06:21:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/05/16/117831.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/117831.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/05/16/117831.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/117831.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/117831.html</trackback:ping><description><![CDATA[serialVersionUID&nbsp;用来表明类的不同版本间的兼容性。如果你修改了此类,&nbsp;要修改此值。否则以前用老版本的类序列化的类恢复时会出错。<br>　　<br>　　在JDK中，可以利用JDK的bin目录下的serialver.exe工具产生这个serialVersionUID，对于Test.class，执行命令：serialver&nbsp;Test。
<p>　　为了在反序列化时，确保类版本的兼容性，最好在每个要序列化的类中加入private&nbsp;static&nbsp;final&nbsp;long&nbsp;serialVersionUID这个属性，具体数值自己定义。这样，即使某个类在与之对应的对象已经序列化出去后做了修改，该对象依然可以被正确反序列化。否则，如果不显式定义该属性，这个属性值将由JVM根据类的相关信息计算，而修改后的类的计算结果与修改前的类的计算结果往往不同，从而造成对象的反序列化因为类版本不兼容而失败。</p>
<p>　　不显式定义这个属性值的另一个坏处是，不利于程序在不同的JVM之间的移植。因为不同的编译器实现该属性值的计算策略可能不同，从而造成虽然类没有改变，但是因为JVM不同，出现因类版本不兼容而无法正确反序列化的现象出现。</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/117831.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-05-16 14:21 <a href="http://www.blogjava.net/liaojiyong/archive/2007/05/16/117831.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最弱智的搜索字符串算法</title><link>http://www.blogjava.net/liaojiyong/archive/2007/04/27/114091.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 27 Apr 2007 07:12:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/04/27/114091.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/114091.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/04/27/114091.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/114091.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/114091.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000">&nbsp;liaojiyong.net.blogjava.impl;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_39_77_Open_Image onclick="this.style.display='none'; Codehighlighter1_39_77_Open_Text.style.display='none'; Codehighlighter1_39_77_Closed_Image.style.display='inline'; Codehighlighter1_39_77_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_39_77_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_39_77_Closed_Text.style.display='none'; Codehighlighter1_39_77_Open_Image.style.display='inline'; Codehighlighter1_39_77_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_39_77_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span><span id=Codehighlighter1_39_77_Open_Text><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;</span><span style="COLOR: #808080">@author</span><span style="COLOR: #008000">&nbsp;liaojy<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;*&nbsp;下午03:03:35<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_102_970_Open_Image onclick="this.style.display='none'; Codehighlighter1_102_970_Open_Text.style.display='none'; Codehighlighter1_102_970_Closed_Image.style.display='inline'; Codehighlighter1_102_970_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_102_970_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_102_970_Closed_Text.style.display='none'; Codehighlighter1_102_970_Open_Image.style.display='inline'; Codehighlighter1_102_970_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;FindSubStringImpl</span><span id=Codehighlighter1_102_970_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_102_970_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_147_680_Open_Image onclick="this.style.display='none'; Codehighlighter1_147_680_Open_Text.style.display='none'; Codehighlighter1_147_680_Closed_Image.style.display='inline'; Codehighlighter1_147_680_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_147_680_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_147_680_Closed_Text.style.display='none'; Codehighlighter1_147_680_Open_Image.style.display='inline'; Codehighlighter1_147_680_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;find(String&nbsp;sub,&nbsp;String&nbsp;main)&nbsp;</span><span id=Codehighlighter1_147_680_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_147_680_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">[]&nbsp;s&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;sub.toCharArray();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">[]&nbsp;m&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;main.toCharArray();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;subLength&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;sub.length();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;mainLength&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;main.length();<br><img id=Codehighlighter1_319_664_Open_Image onclick="this.style.display='none'; Codehighlighter1_319_664_Open_Text.style.display='none'; Codehighlighter1_319_664_Closed_Image.style.display='inline'; Codehighlighter1_319_664_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_319_664_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_319_664_Closed_Text.style.display='none'; Codehighlighter1_319_664_Open_Image.style.display='inline'; Codehighlighter1_319_664_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;mainLength;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;</span><span id=Codehighlighter1_319_664_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_319_664_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(m[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;s[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">])<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;mainLength&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;m[i]&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;s[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">])<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br><img id=Codehighlighter1_418_438_Open_Image onclick="this.style.display='none'; Codehighlighter1_418_438_Open_Text.style.display='none'; Codehighlighter1_418_438_Closed_Image.style.display='inline'; Codehighlighter1_418_438_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_418_438_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_418_438_Closed_Text.style.display='none'; Codehighlighter1_418_438_Open_Image.style.display='inline'; Codehighlighter1_418_438_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(i&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;mainLength)&nbsp;</span><span id=Codehighlighter1_418_438_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_418_438_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;t&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i;<br><img id=Codehighlighter1_493_660_Open_Image onclick="this.style.display='none'; Codehighlighter1_493_660_Open_Text.style.display='none'; Codehighlighter1_493_660_Closed_Image.style.display='inline'; Codehighlighter1_493_660_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_493_660_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_493_660_Closed_Text.style.display='none'; Codehighlighter1_493_660_Open_Image.style.display='inline'; Codehighlighter1_493_660_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;&nbsp;j&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;subLength;&nbsp;j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;</span><span id=Codehighlighter1_493_660_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_493_660_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(t&nbsp;</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">&nbsp;mainLength)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img id=Codehighlighter1_589_610_Open_Image onclick="this.style.display='none'; Codehighlighter1_589_610_Open_Text.style.display='none'; Codehighlighter1_589_610_Closed_Image.style.display='inline'; Codehighlighter1_589_610_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_589_610_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_589_610_Closed_Text.style.display='none'; Codehighlighter1_589_610_Open_Image.style.display='inline'; Codehighlighter1_589_610_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;((m[t]&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;s[j])&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;(j&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;subLength&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">))&nbsp;</span><span id=Codehighlighter1_589_610_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_589_610_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;i;<br><img id=Codehighlighter1_637_655_Open_Image onclick="this.style.display='none'; Codehighlighter1_637_655_Open_Text.style.display='none'; Codehighlighter1_637_655_Closed_Image.style.display='inline'; Codehighlighter1_637_655_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_637_655_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_637_655_Closed_Text.style.display='none'; Codehighlighter1_637_655_Open_Image.style.display='inline'; Codehighlighter1_637_655_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;((m[t]&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;s[j]))&nbsp;</span><span id=Codehighlighter1_637_655_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_637_655_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img id=Codehighlighter1_684_777_Open_Image onclick="this.style.display='none'; Codehighlighter1_684_777_Open_Text.style.display='none'; Codehighlighter1_684_777_Closed_Image.style.display='inline'; Codehighlighter1_684_777_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_684_777_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_684_777_Closed_Text.style.display='none'; Codehighlighter1_684_777_Open_Image.style.display='inline'; Codehighlighter1_684_777_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_684_777_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span><span id=Codehighlighter1_684_777_Open_Text><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="COLOR: #808080">@param</span><span style="COLOR: #008000">&nbsp;args<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="COLOR: #808080">@throws</span><span style="COLOR: #008000">&nbsp;InstantiationException<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="COLOR: #808080">@throws</span><span style="COLOR: #008000">&nbsp;IllegalAccessException<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_873_968_Open_Image onclick="this.style.display='none'; Codehighlighter1_873_968_Open_Text.style.display='none'; Codehighlighter1_873_968_Closed_Image.style.display='inline'; Codehighlighter1_873_968_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_873_968_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_873_968_Closed_Text.style.display='none'; Codehighlighter1_873_968_Open_Image.style.display='inline'; Codehighlighter1_873_968_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000">&nbsp;InstantiationException,&nbsp;IllegalAccessException&nbsp;</span><span id=Codehighlighter1_873_968_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_873_968_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(FindSubStringImpl.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">.newInstance().find(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">liao</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">maliaoinjiyong</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/114091.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-04-27 15:12 <a href="http://www.blogjava.net/liaojiyong/archive/2007/04/27/114091.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java1.5泛型指南中文版(Java1.5 Generic Tutorial) （转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/04/25/113577.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Wed, 25 Apr 2007 09:20:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/04/25/113577.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/113577.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/04/25/113577.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/113577.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/113577.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Java1.5泛型指南中文版(Java1.5 Generic Tutorial)英文版pdf下载链接：http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&...&nbsp;&nbsp;<a href='http://www.blogjava.net/liaojiyong/archive/2007/04/25/113577.html'>阅读全文</a><img src ="http://www.blogjava.net/liaojiyong/aggbug/113577.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-04-25 17:20 <a href="http://www.blogjava.net/liaojiyong/archive/2007/04/25/113577.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java文件操作大全（转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105724.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 23 Mar 2007 01:46:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105724.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/105724.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105724.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/105724.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/105724.html</trackback:ping><description><![CDATA[
		<p>文件的建立/检查与删除 <br />&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;文件的建立、检查与删除&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath(""); <br />//out.println(path); <br />File f=new File(path,"File.txt"); <br />//out.println(f); <br />//out.println(f.exists()); </p>
		<p>if(f.exists()){//检查File.txt是否存在 <br />f.delete();//删除File.txt文件 <br />out.println(path + " <a href="file://\\File.txt">\\File.txt</a> 存在，已删除。"); <br />}else{ <br />f.createNewFile();//在当前目录下建立一个名为File.txt的文件 <br />out.println(path + " <a href="file://\\File.txt">\\File.txt</a> 不存在，已建立。");//输出目前所在的目录路径 <br />} <br />%&gt; </p>
		<p>
				<br />　　目录的建立/检查与删除 </p>
		<p>&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;目录的建立/检查与删除&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath(""); <br />path=path + " <a href="file://\\Sub&quot;;//">\\Sub";//</a> 将要建立的目录路径 <br />File d=new File(path);//建立代表Sub目录的File对象，并得到它的一个引用 <br />if(d.exists()){//检查Sub目录是否存在 <br />d.delete(); <br />out.println("Sub目录存在，已删除"); <br />}else{ <br />d.mkdir();//建立Sub目录 <br />out.println("Sub目录不存在，已建立"); <br />} <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; </p>
		<p>
				<br />　　如何在JSP中处理虚拟目录 </p>
		<p>
				<br />&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;JSP中如何处理虚拟目录&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />取得虚拟目录对应的磁盘路径&lt;br&gt; <br />Web站点主目录的位置为&lt;font color=#ff0000&gt;&lt;%=request.getRealPath("/")%&gt;&lt;/font&gt;&lt;br&gt; <br />JSP网页所在的目录位置&lt;font color=#ff0000&gt;&lt;%=request.getRealPath("./")%&gt;&lt;/font&gt;&lt;br&gt; <br />JSP网页所在目录上一层目录的位置&lt;font color=#ff0000&gt;&lt;%=request.getRealPath("../")%&gt;&lt;/font&gt;&lt;br&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; </p>
		<p>
				<br />　文件属性的取得 <br />&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.util.Date,java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;文件属性的取得&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("/"); <br />File f=new File(path,"ReadData.txt"); <br />if(f.exists()){ <br />%&gt; <br />&lt;%=f.getName()%&gt;的属性如下：&lt;br&gt;&lt;br&gt; <br />文件长度为：&lt;%=f.length()%&gt; <br />&lt;%=f.isFile()?"是文件":"不是文件"%&gt;&lt;br&gt; <br />&lt;%=f.isDirectory()?"是目录":"不是目录"%&gt;&lt;br&gt; <br />&lt;%=f.canRead()?"可读取":"不可读取"%&gt;&lt;br&gt; <br />&lt;%=f.canWrite()?"可写入":"不可写入"%&gt;&lt;br&gt; <br />&lt;%=f.isHidden()?"是隐藏文件":"不是隐藏文件"%&gt;&lt;br&gt; <br />文件的最后修改日期为：&lt;%=new Date(f.lastModified())%&gt;&lt;br&gt; <br />&lt;% <br />}else{ <br />f.createNewFile();//在当前目录下建立一个名为ReaData.txt的文件 <br />%&gt; <br />&lt;%=f.getName()%&gt;的属性如下：&lt;br&gt;&lt;br&gt; <br />文件长度为：&lt;%=f.length()%&gt; <br />&lt;%=f.isFile()?"是文件":"不是文件"%&gt;&lt;br&gt; <br />&lt;%=f.isDirectory()?"是目录":"不是目录"%&gt;&lt;br&gt; <br />&lt;%=f.canRead()?"可读取":"不可读取"%&gt;&lt;br&gt; <br />&lt;%=f.canWrite()?"可写入":"不可写入"%&gt;&lt;br&gt; <br />&lt;%=f.isHidden()?"是隐藏文件":"不是隐藏文件"%&gt;&lt;br&gt; <br />文件的最后修改日期为：&lt;%=new Date(f.lastModified())%&gt;&lt;br&gt; <br />&lt;% <br />} <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt;<br /> <br />　　取出目录中文件的方法 </p>
		<p>&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;取出目录中文件的方法--列出目录中的文件&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("/"); <br />File d=new File(path);//建立当前目录中文件的File对象 <br />File list[]=d.listFiles();//取得代表目录中所有文件的File对象数组 <br />out.println("&lt;font color=#ff0000&gt;" + path + "目录下的文件：&lt;/font&gt;&lt;br&gt;"); <br />for(int i=0;i&lt;list.length;i++){ <br />if(list&lt;I&gt;.isFile()){ <br />out.println(list&lt;I&gt;.getName() + "&lt;br&gt;"); <br />} <br />} <br />out.println("&lt;br&gt;&lt;font color=#ff0000&gt;" + path + "目录下的目录：&lt;/font&gt;&lt;br&gt;"); <br />for(int i=0;i&lt;list.length;i++){ <br />if(list&lt;I&gt;.isDirectory()){ <br />out.println(list&lt;I&gt;.getName() + "&lt;br&gt;"); <br />} <br />} <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; </p>
		<p>
				<br />判断是否为空白文件 <br />&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;判断是否为空白文件&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("/"); <br />out.println(path); <br />FileReader fr=new FileReader(path + " <a href="file://\\AtEnd.txt&quot;);//">\\AtEnd.txt");//</a> 建立FileReader对象，并实例化为fr <br />//对FileReader类生成的对象使用read()方法，可以从字符流中读取下一个字符。 <br />if(fr.read()==-1)//判断是否已读到文件的结尾 <br />{ <br />out.print("AtEnd.txt文件中没有数据&lt;br&gt;"); <br />}else{ <br />out.println("AtEnd.txt文件中有数据"); <br />} <br />fr.close(); <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br />    &lt;B&gt;读取所有的文件数据&lt;/B&gt; <br />&lt;ccid_nobr&gt; <br />&lt;table width="400" border="1" cellspacing="0" cellpadding="2" <br />bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center"&gt; <br />&lt;tr&gt; <br />&lt;td bgcolor="e6e6e6" class="code" style="font-size:9pt"&gt; <br />&lt;pre&gt;&lt;ccid_code&gt; &lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*,java.lang.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;读取所有的文件数据&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("."); <br />FileReader fr=new FileReader(path + " <a href="file://\\ReadData.txt">\\ReadData.txt</a> "); <br />//关键在于读取过程中，要判断所读取的字符是否已经到了文件的末尾， <br />并且这个字符是不是文件中的断行符，即判断该字符值是否为13。 <br />int c=fr.read();//从文件中读取一个字符 <br />//判断是否已读到文件结尾 <br />while(c!=-1){ <br />out.print((char)c);//输出读到的数据 <br />c=fr.read();//从文件中继续读取数据 <br />if(c==13){//判断是否为断行字符 <br />out.print("&lt;br&gt;");//输出分行标签 <br />fr.skip(1);//略过一个字符 <br />//c=fr.read();//读取一个字符 <br />} <br />} <br />fr.close(); <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br />　　一行一行读取数据 <br />&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;文件读取&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("");//取得当前目录的路径 <br />FileReader fr=new FileReader(path + " <a href="file://\\file\\inc\\t.txt&quot;);//">\\file\\inc\\t.txt");//</a> 建立FileReader对象，并实例化为fr <br />BufferedReader br=new BufferedReader(fr);//建立BufferedReader对象，并实例化为br <br />String Line=br.readLine();//从文件读取一行字符串 <br />//判断读取到的字符串是否不为空 <br />while(Line!=null){ <br />out.println(Line + "&lt;br&gt;");//输出从文件中读取的数据 <br />Line=br.readLine();//从文件中继续读取一行数据 <br />} <br />br.close();//关闭BufferedReader对象 <br />fr.close();//关闭文件 <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; </p>
		<p>　略过文件中的字符不读取 <br />&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;略过字节不读取&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("."); <br />FileReader fr=new FileReader(path + " <a href="file://\\ReadData.txt">\\ReadData.txt</a> "); <br />fr.skip(2);//跳过2个字节 <br />int c=fr.read();//读取一个字节 <br />while(c!=-1){ <br />out.print((char)c); <br />c=fr.read(); <br />} <br />fr.close(); <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br />　　将数据写入文件 <br />&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;将数据写入文件&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("."); <br />FileWriter fw=new FileWriter(path + " <a href="file://\\WriteData.txt&quot;);//">\\WriteData.txt");//</a> 建立FileWriter对象，并实例化fw <br />//将字符串写入文件 <br />fw.write("大家好！"); <br />fw.write("本书是《JSP编程技巧》"); <br />fw.write("请多多指教！"); <br />fw.write("email:stride@sina.com"); <br />fw.close(); </p>
		<p>FileReader fr=new FileReader(path + " <a href="file://\\WriteData.txt">\\WriteData.txt</a> "); <br />BufferedReader br=new BufferedReader(fr);//建立BufferedReader对象，并实例化为br <br />String Line=br.readLine(); <br />//读取一行数据 <br />out.println(Line + "&lt;br&gt;"); <br />br.close();//关闭BufferedReader对象 <br />fr.close(); <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br />　　将写入文件的数据分行 <br />&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;将写入文件的数据分行&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("."); <br />FileWriter fw=new FileWriter(path + " <a href="file://\\WriteData.txt">\\WriteData.txt</a> "); <br />BufferedWriter bw=new BufferedWriter(fw); <br />bw.write("大家好！"); <br />bw.write("本书是《JSP编程技巧》。"); <br />bw.newLine();//断行 <br />bw.write("请多多指教！"); <br />bw.newLine();//断行 <br />bw.write("email: <a href="mailto:stride@sina.com">stride@sina.com</a> "); <br />bw.flush();//将数据更新至文件 <br />fw.close();//关闭文件流 <br />out.println("写入文件内容为：&lt;br&gt;"); <br />FileReader fr=new FileReader(path + " <a href="file://\\WriteData.txt">\\WriteData.txt</a> "); <br />BufferedReader br=new BufferedReader(fr); <br />String Line=br.readLine();//读取一行数据 <br />while(Line!=null){ <br />out.println(Line + "&lt;br&gt;"); <br />Line=br.readLine(); <br />} <br />fr.close(); <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt; <br />　　如何将数据追加写入到文件 <br />&lt;%@ page contentType="text/html;charset=gb2312"%&gt; <br />&lt;%@ page import="java.io.*"%&gt; <br />&lt;html&gt; <br />&lt;head&gt; <br />&lt;title&gt;将写入文件的数据分行&lt;/title&gt; <br />&lt;/head&gt; <br />&lt;body&gt; <br />&lt;% <br />String path=request.getRealPath("."); <br />RandomAccessFile rf=new RandomAccessFile(path + " <a href="file://\\WriteData.txt&quot;,&quot;rw">\\WriteData.txt","rw</a> "); <br />//定义一个类RandomAccessFile的对象，并实例化 <br />rf.seek(rf.length());//将指针移动到文件末尾 <br />rf.writeBytes("\nAppend a line to the file!"); <br />rf.close();//关闭文件流 <br />out.println("写入文件内容为：&lt;br&gt;"); <br />FileReader fr=new FileReader(path + " <a href="file://\\WriteData.txt">\\WriteData.txt</a> "); <br />BufferedReader br=new BufferedReader(fr);//读取文件的BufferedRead对象 <br />String Line=br.readLine(); <br />while(Line!=null){ <br />out.println(Line + "&lt;br&gt;"); <br />Line=br.readLine(); <br />} <br />fr.close();//关闭文件 <br />%&gt; <br />&lt;/body&gt; <br />&lt;/html&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt;&lt;/I&gt; <br /></p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/105724.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-23 09:46 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/23/105724.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JFreeChat的介绍 （转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105722.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 23 Mar 2007 01:43:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105722.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/105722.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105722.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/105722.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/105722.html</trackback:ping><description><![CDATA[
		<strong>一、简介</strong>
		<br />JFreeChart(<a href="http://www.jfree.org/"><font color="#000000">http://www.jfree.org/</font></a>) 是一个开源的 JAVA 项目，它主要用来开发各种各样的图表，这些图表包括：饼图、柱状图 ( 普通柱状图以及堆栈柱状图 ) 、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。在这些不同式样的图表上可以满足目前商业系统的要求。 JFreeChart 是一种基于 JAVA 语言的图表开发技术。 JFreeChart 可用于 Servlet 、 JSP 、 Applet 、 Java Appication 环境中，通过 JDBC 可动态显示任何数据库数据，结合 Itext 可以输出至 PDF 文件。<br /><strong>二、JFreeChart获取</strong><br />JFreeChart 是JFreeChart公司在开源网站SourceForge.net上的一个项目，该公司的主要产品有如下： <br />1.JFreeReport ：报表解决工具 <br />2.JFreeChart:Java 图形解决方案（Application/Applet/Servlet/Jsp） <br />3.JCommon ：JFreeReport和JFreeChart的公共类库 <br />4.JFreeDesigner ：JFreeReport的报表设计工具 <br />我们可以从jfree官方网站上获取最新版本和相关资料， <br />获取地址：<a href="http://www.jfree.org/"><font color="#000000">http://www.jfree.org/</font></a><br />当前最新版本：jfreechart-1.0.3.zip。<br />三<strong>、JFreeChart配置安装</strong><br />1 、解压jfreechart-1.0.3.zip.到指定位置，其中source是jfreechart的源码，jfreechart-1.0.3-demo.jar 是例子程序，可以先运行一下看看各种效果。 <br />2 、为了配置成功，我们需要关注的文件有如下三个： <br />设置classpath。加入下面三个jar包。 <br />jfreechart-1.0.3.jar 、jcommon-1.0.8.jar、gnujaxp.jar  <br />至此jfreechart的配置就完成了 。<br /><strong>四、JFreeChart功能介绍 </strong><br />JFreeChart 目前是最好的java图形解决方案，基本能够解决目前的图形方面的需求，主要包括如下几个方面： <br />pie charts (2D and 3D) ：饼图（平面和立体） <br />bar charts (regular and stacked, with an optional 3D effect) ：柱状图 <br />line and area charts ：曲线图 <br />scatter plots and bubble charts <br />time series, high/low/open/close charts and candle stick charts ：时序图 <br />combination charts ：复合图 <br />Pareto charts <br />Gantt charts ：甘特图 <br />wind plots, meter charts and symbol charts <br />wafer map charts <br />( 态图表,饼图(二维和三维) , 柱状图 ( 水平,垂直),线图,点图,时间变化图,甘特图, 股票行情图,混和图, 温度计图, 刻度图等常用商用图表) <br />图形可以导出成PNG和JPEG格式，同时还可以与PDF和EXCEL关联 <br />JFreeChart 核心类库介绍： <br />研究jfreechart源码发现源码的主要由两个大的包组成：org.jfree.chart,org.jfree.data。其中前者主要与图形 <br />本身有关，后者与图形显示的数据有关。具体研究如果大家有兴趣的话可以自己研究 。 <br />核心类主要有： <br />org.jfree.chart.JFreeChart ：图表对象，任何类型的图表的最终表现形式都是在该对象进行一些属性的定制。JFreeChart引擎本身提供了一个工厂类用于创建不同类型的图表对象 <br />org.jfree.data.category.XXXDataSet: 数据集对象，用于提供显示图表所用的数据。根据不同类型的图表对应着很多类型的数据集对象类 <br />org.jfree.chart.plot.XXXPlot ：图表区域对象，基本上这个对象决定着什么样式的图表，创建该对象的时候需要Axis、Renderer以及数据集对象的支持 <br />org.jfree.chart.axis.XXXAxis ：用于处理图表的两个轴：纵轴和横轴 <br />org.jfree.chart.render.XXXRender ：负责如何显示一个图表对象 <br />org.jfree.chart.urls.XXXURLGenerator: 用于生成Web图表中每个项目的鼠标点击链接 <br />XXXXXToolTipGenerator: 用于生成图象的帮助提示，不同类型图表对应不同类型的工具提示类 。<br /><br />参考地址：<br /><br /><a href="http://ltc603.javaeye.com/blog/30207"><font color="#000000">http://ltc603.javaeye.com/blog/30207</font></a><br /><a href="http://blog.sina.com.cn/u/405da78d010000ap"><font color="#000000">http://blog.sina.com.cn/u/405da78d010000ap</font></a><br /><a href="/Alpha/archive/2007/01/13/93569.html"><font color="#000000">http://www.blogjava.net/Alpha/archive/2007/01/13/93569.html</font></a> <br /><img src ="http://www.blogjava.net/liaojiyong/aggbug/105722.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-23 09:43 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/23/105722.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>StringTokenizer(字符串分隔解析类型) （转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105720.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 23 Mar 2007 01:41:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105720.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/105720.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/105720.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/105720.html</trackback:ping><description><![CDATA[
		<strong>java.util.StringTokenizer<br /><br />功效:</strong>将字符串以定界符为界，分析为一个个的token（可理解为单词），定界符可以自己指定。 <br /><br /><br /><span style="COLOR: blue">１、构造函数。<br /><br /></span>1. <span style="COLOR: green">StringTokenizer(String str)</span> ：构造一个用来解析str的StringTokenizer对象。java默认的分隔符是“空格”、“制表符(‘\t’)”、“换行符(‘\n’)”、“回车符(‘\r’)”。<br />2. <span style="COLOR: green">StringTokenizer(String str, String delim) </span>：构造一个用来解析str的StringTokenizer对象，并提供一个指定的分隔符。如new StringTokenizer("A|001:B|002:C|003","<font style="BACKGROUND-COLOR: #ff0000">:"</font>);<br />3. <span style="COLOR: green">StringTokenizer(String str, String delim, boolean returnDelims) </span>：构造一个用来解析str的StringTokenizer对象，并提供一个指定的分隔符，同时，指定是否返回分隔符。<br /><span style="COLOR: blue">２、方法。</span><br /><span style="COLOR: red">说明：<br />1. 所有方法均为public；<br />2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）<br /><br /></span>1. <span style="COLOR: green">int countTokens() </span>：返回nextToken方法被调用的次数。如果采用构造函数1和2，返回的就是分隔符数量(例2)。<br />2. <span style="COLOR: green">boolean hasMoreTokens() </span>：返回是否还有分隔符。<br />3. <span style="COLOR: green">boolean hasMoreElements() </span>：结果同2。<br />4. <span style="COLOR: green">String nextToken()</span> ：返回从当前位置到下一个分隔符的字符串。<br />5. <span style="COLOR: green">Object nextElement() </span>：结果同4。<br />6. <span style="COLOR: green">String nextToken(String delim)</span> ：与4类似，以指定的分隔符返回结果。<br /><span style="COLOR: blue">3、例子。() split 与 StringTokenizer 的萧萧区别!<br /></span><br />import java.util.StringTokenizer;<br />public class StringTokenizerDemo<br />{<br />   public static void main(String args[])<br />  {<br />      String str="100|66,55:200|567,90:102|43,54";<br />      String abc="A|B|C|D";<br />      StringTokenizer strToke=new StringTokenizer(str,":");//默认不打印分隔符<br />      //StringTokenizer strToke=new StringTokenizer(str,":",true);//打印分隔符<br />      //StringTokenizer strToke=new StringTokenizer(str,":",false);//不打印分隔符<br />      int size=strToke.countTokens();//3 &amp; 5<br />      System.out.println("strToke count = "+size);<br />     while(strToke.hasMoreElements())<br />    {<br />       System.out.println(strToke.nextToken());<br />       //System.out.println(strToke.nextElement()); //效果同上<br />     }<br />     //String[] str_abc=str.split("<a href="file://\\|&quot;);//" temp_href="file://\\|&quot;);//"><font color="#000000">\\|");//</font></a>结果与StringTokenizer一样<br />     String[] str_abc=str.split("|");//得到不同的结果<br />     for(int i=0;i&lt;str_abc.length;i++)<br />     {<br />        System.out.println(str_abc[i]);<br />     }<br />  }<br />} <img src ="http://www.blogjava.net/liaojiyong/aggbug/105720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-23 09:41 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/23/105720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Java调用存储过程的总结 （转）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105718.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 23 Mar 2007 01:40:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105718.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/105718.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105718.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/105718.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/105718.html</trackback:ping><description><![CDATA[概述： <br />         JDBC中的java.sql.CallableStatement 对象为所有的 DBMS 提供了一种以标准形式调用已储存过程的方法。已储存过程储存在数据库中。对已储存过程的调用是 CallableStatement对象所含的内容。这种调用是用一种换码语法来写的，有两种形式：一种形式带结果参，另一种形式不带结果参数。结果参数是一种输出 (OUT) 参数，是已储存过程的返回值。两种形式都可带有数量可变的输入（IN 参数）、输出（OUT 参数）或输入和输出（INOUT 参数）的参数。问号将用作参数的占位符。 <br />　　在 JDBC 中调用已储存过程的语法如下所示。注意，方括号表示其间的内容是可选项；方括号本身并不是语法的组成部份。 <br /><br />{call 过程名[(?, ?, ...)]} <br /><br /><br />返回结果参数的过程的语法为： <br /><br />{? = call 过程名[(?, ?, ...)]} <br /><br />不带参数的已储存过程的语法类似： <br /><br />{call 过程名} <br /><br />　　通常，创建 CallableStatement 对象的人应当知道所用的 DBMS 是支持已储存过程的，并且知道这些过程都是些什么。然而，如果需要检查，多种DatabaseMetaData 方法都可以提供这样的信息。例如，如果 DBMS 支持已储存过程的调用，则supportsStoredProcedures 方法将返回 true，而getProcedures 方法将返回对已储存过程的描述。CallableStatement 继承 Statement 的方法（它们用于处理一般的 SQL 语句），还继承了 PreparedStatement 的方法（它们用于处理 IN 参）。 <br /><br />　　CallableStatement 中定义的所有方法都用于处理 OUT 参数或 INOUT 参数的输出部分：注册 OUT 参数的 JDBC 类型（一般 SQL 类型）、从这些参数中检索结果，或者检查所返回的值是否为 JDBC NULL。 <br /><br />　　1、创建 CallableStatement 对象 <br /><br />　　CallableStatement 对象是用 Connection 方法 prepareCall 创建的。下例创建 CallableStatement 的实例， 其中含有对已储存过程 getTestData 调用。该过程有两个变量，但不含结果参数： <br /><br />      CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}"); <br /><br />　　其中?占位符为IN、OUT还是INOUT参数，取决于已储存过程getTestData。 <br /><br />　　2、IN和OUT参数 <br /><br />　　将IN参数传给 CallableStatement 对象是通过 setXXX 方法完成的。该方法继承自 PreparedStatement。所传入参数的类型决定了所用的setXXX方法（例如，用 setFloat 来传入 float 值等）。 <br /><br />　　如果已储存过程返回 OUT 参数，则在执行 CallableStatement 对象以前必须先注册每个 OUT 参数的 JDBC 类型（这是必需的，因为某些 DBMS 要求 JDBC 类型）。注册 JDBC 类型是用 registerOutParameter 方法来完成的。语句执行完后，CallableStatement 的 getXXX 方法将取回参数值。正确的 getXXX 方法是为各参数所注册的 JDBC 类型所对应的 Java 类型。换言之， registerOutParameter 使用的是 JDBC 类型（因此它与数据库返回的 JDBC 类型匹配），而 getXXX 将之转换为 Java 类型。 <br /><br />　　作为示例，下述代码先注册