<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://900way.spaces.live.com/mmm2008-07-24_12.50/rsspretty.aspx?rssquery=en-US;http%3a%2f%2f900way.spaces.live.com%2fcategory%2fJava%e6%8a%80%e6%9c%af%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>在路上...: Java技术</title><description /><link>http://900way.spaces.live.com/?_c11_BlogPart_BlogPart=blogview&amp;_c=BlogPart&amp;partqs=catJava%25E6%258A%2580%25E6%259C%25AF</link><language>en-US</language><pubDate>Tue, 23 Sep 2008 08:50:26 GMT</pubDate><lastBuildDate>Tue, 23 Sep 2008 08:50:26 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://900way.spaces.live.com/blog/feed.rss</cf:parentRSS><live:type>blogcategory</live:type><live:identity><live:id>6279604829903914469</live:id><live:alias>900way</live:alias></live:identity><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>高级图像处理图像I/O  API  RC  1.0</title><link>http://900way.spaces.live.com/Blog/cns!5725A352704005E5!222.entry</link><description>&lt;div&gt;如果你对图像处理感兴趣，而且需要使用GIF、JPEG和PNG以外的其它图像格式，或者希望改善JPEG图像处理的性能但不知道到哪里寻找适当的方法，或者需要通过几何运算（包括非线性变换）来处理图像，不必再为此苦恼了，答案就在这里——来自Sun公司的Java高级图像处理API和JAI图像I/O  API  1.0  RC。&lt;br&gt;&lt;br&gt;JAI  API是Java  Media  API的一部分，与之相伴的还包括Java  2D  API、Java  3D  API、Java  Speech  API和其他一些API。Java高级图像处理API是作为Java规范请求（JSP）34的一部分而开发的，是对J2SE  version  1.3+版的扩展，主要用于处理图像。最初发布的版本是1.0，JDC（Java  Developer  Connection）提供了一个预览版1.1.2  beta。（最新进展情况请查阅README.html文件。）与AWT和Java  2D相比，JAI  API提供了更丰富的图像处理，包括对许多通用图像操作的内在支持。&lt;br&gt;&lt;br&gt;不过本文的目的不是讨论JAI  API，而是伴随这些API但分离到它自己的可安装库中的一组图像读写器（codec）类，即Java高级图像处理图像I/O工具1.0  RC。该RC提供了可以插接到J2SE  1.4的图像I/O框架上的一些功能。作为JSR-15一部分而开发的图像I/O  API提供了一个支持不同图像格式的可插拔框架。标准J2SE  1.4版本身支持GIF、JPEG和PNG图像格式，而JAI图像I/O  RC则提供了更多主流图像格式的编码解码器。只要加上针对操作平台的适当版本，以前开发的应用程序就可以处理这些新的图像格式。&lt;br&gt;&lt;br&gt;要理解JAI图像I/O工具的使用，需要首先了解图像I/O库。在安装和介绍图像I/O工具包之前，我们先看一看图像I/O库。&lt;br&gt;图像I/O库&lt;br&gt;&lt;br&gt;图像I/O库是J2SE  1.4的标准API，放在javax.imageio包内。虽然这个包提供了两个接口和9个类，整个API实际上就是ImageIO类。通过这个类可以弄清读写所支持的图像格式并对这些图像进行读写，实际上这也就是整个API的全部内容。&lt;br&gt;&lt;br&gt;由于图像I/O库是一个可插拔的框架，所支持的图像格式集不是固定不变的。尽管随J2SE  1.4发布了一些标准格式，但任何人都可以增加新的支持格式。要查看有哪些格式可用，可以使用下面的代码：&lt;br&gt;&lt;br&gt;import  javax.imageio.*;&lt;br&gt;import  java.util.Arrays;&lt;br&gt;&lt;br&gt;public  class  GetFormats  {&lt;br&gt;       public  static  void  main(String  args[])  {&lt;br&gt;               String  readFormats[]  =  ImageIO.getReaderMIMETypes();&lt;br&gt;               String  writeFormats[]  =  ImageIO.getWriterMIMETypes();&lt;br&gt;               System.out.println(&amp;quot;Readers:  &amp;quot;  +  &lt;br&gt;                               Arrays.asList(readFormats));&lt;br&gt;               System.out.println(&amp;quot;Writers:  &amp;quot;  +  &lt;br&gt;                               Arrays.asList(writeFormats));&lt;br&gt;       }&lt;br&gt;}&lt;br&gt;&lt;br&gt;运行该程序，你会发现这个库支持读取GIF、JPEG和PNG图像，也支持写JPEG和PNG图像，但是不支持写GIF文件。&lt;br&gt;&lt;br&gt;除了与像image/jpeg这样的MIME类型协同工作外，ImageIO类还允许通过getReaderFormatNames和  getWriterFormatNames方法使用JPEG这样的非正式名称。此外，通过getImageReadersBySuffix和  getImageWritersBySuffix还可以了解是否存在针对特定文件扩展名的reader/writer存在。&lt;br&gt;&lt;br&gt;利用ImageIO类，你所要做的事情不过是读javax.imageio.stream.ImageInputStream、  java.io.InputStream、java.io.File或者java.net.URL，结果会得到一个  java.awt.image.BufferedImage。一旦拥有了BufferedImage，你就可以指定需要的格式名把图像写回去。（不仅仅是  BufferImage，任何实现RenderedImage接口的类都可以写。）新的格式既可以与读取的格式相同，也可以是不同的格式以便进行格式转换。如果指定的格式没有可用的writer，那么write方法就返回false，否则如果找到了相应的writer就返回true。&lt;br&gt;&lt;br&gt;String  inputFilename  =  ...;&lt;br&gt;BufferedImage  image  =  ImageIO.read(inputFilename);&lt;br&gt;...&lt;br&gt;String  formatName  =  &amp;quot;jpg&amp;quot;;  //  desired  format&lt;br&gt;String  outputFilename  =  ...;&lt;br&gt;File  outputFile  =  new  File(outputFilename);&lt;br&gt;boolean  writerExists  =  ImageIO.write(image,&lt;br&gt;formatName,  outputFile);&lt;br&gt;&lt;br&gt;为了说明图像I/O库的用法，下面的例子使用JFileChooser提示输入图像文件名。选中文件后再选择目标输出格式，然后按下“Save（保存）”按钮。保存完成后，将重新读取图像并在一个新窗口内显示。&lt;br&gt;&lt;br&gt;import  java.awt.*;&lt;br&gt;import  java.awt.event.*;&lt;br&gt;import  java.awt.image.*;&lt;br&gt;import  javax.swing.*;&lt;br&gt;import  java.io.*;&lt;br&gt;import  java.net.*;&lt;br&gt;import  javax.imageio.*;&lt;br&gt;&lt;br&gt;public  class  Converting  extends  JFrame  {&lt;br&gt;       JLabel  promptLabel;&lt;br&gt;       JTextField  prompt;&lt;br&gt;       JButton  promptButton;&lt;br&gt;       JFileChooser  fileChooser;&lt;br&gt;       JComboBox  comboBox;?&lt;br&gt;       JButton  saveButton;?&lt;br&gt;       public  Converting()  {&lt;br&gt;               super(&amp;quot;Image  Conversion&amp;quot;);&lt;br&gt;               setDefaultCloseOperation(EXIT_ON_CLOSE);&lt;br&gt;               Container  contentPane  =  getContentPane();&lt;br&gt;               JPanel  inputPanel  =  new  JPanel();&lt;br&gt;               promptLabel  =  new  JLabel(&amp;quot;Filename:&amp;quot;);&lt;br&gt;               inputPanel.add(promptLabel);&lt;br&gt;               prompt  =  new  JTextField(20);&lt;br&gt;               inputPanel.add(prompt);&lt;br&gt;               promptButton  =  new  JButton(&amp;quot;Browse&amp;quot;);&lt;br&gt;               inputPanel.add(promptButton);&lt;br&gt;               contentPane.add(inputPanel,  BorderLayout.NORTH);&lt;br&gt;&lt;br&gt;               fileChooser  =  new  JFileChooser();&lt;br&gt;               promptButton.addActionListener(&lt;br&gt;                       new  ActionListener()  {&lt;br&gt;                               public  void  actionPerformed(ActionEvent  e)  {&lt;br&gt;                                       int  returnValue  =  &lt;br&gt;                                                   fileChooser.showOpenDialog(null);&lt;br&gt;                                       if  (returnValue  ==  &lt;br&gt;                                                 JFileChooser.APPROVE_OPTION)  {&lt;br&gt;                                           File  selectedFile  =  &lt;br&gt;                                                       fileChooser.getSelectedFile();&lt;br&gt;                                             if  (selectedFile  !=  null)  {&lt;br&gt;                                                   prompt.setText(selectedFile.getAbsolutePath());&lt;br&gt;                                             }&lt;br&gt;                                       }&lt;br&gt;                               }&lt;br&gt;                       }&lt;br&gt;               );&lt;br&gt;&lt;br&gt;               JPanel  outputPanel  =  new  JPanel();&lt;br&gt;               String  writerFormats[]  =  &lt;br&gt;                               ImageIO.getWriterFormatNames();&lt;br&gt;               ComboBoxModel  comboBoxModel  =  new  &lt;br&gt;                               DefaultComboBoxModel(writerFormats);&lt;br&gt;               comboBox  =  new  JComboBox(comboBoxModel);&lt;br&gt;               outputPanel.add(comboBox);&lt;br&gt;               saveButton  =  new  JButton(&amp;quot;Save&amp;quot;);&lt;br&gt;               outputPanel.add(saveButton);&lt;br&gt;               saveButton.addActionListener(&lt;br&gt;                       new  ActionListener()  {&lt;br&gt;                               public  void  actionPerformed(ActionEvent  e)  {&lt;br&gt;                                       try  {&lt;br&gt;                                       String  name  =  prompt.getText();&lt;br&gt;                                       File  file  =  new  File(name);&lt;br&gt;                                       if  (file.exists())  {&lt;br&gt;                                               BufferedImage  image  =  &lt;br&gt;                                                               ImageIO.read(file.toURL());&lt;br&gt;                                       if  (image  ==  null)  {&lt;br&gt;                                               System.err.println(&amp;quot;Invalid  input  &lt;br&gt;                                                               file  format&amp;quot;);&lt;br&gt;                                       }  else  {&lt;br&gt;                                             String  selection  =  &lt;br&gt;                                                         (String)comboBox.getSelectedItem();&lt;br&gt;                                               String  outputFilename  =  name  +  &lt;br&gt;                                                             &amp;quot;.&amp;quot;  +  selection;&lt;br&gt;                                               File  outputFile  =  new  File(outputFilename);&lt;br&gt;                                               boolean  found  =  ImageIO.write(image,  &lt;br&gt;                                                               selection,  outputFile);&lt;br&gt;                                               if  (found)  {&lt;br&gt;                                                   JDialog  window  =  new  JDialog();&lt;br&gt;                                                   Container  windowContent  =  &lt;br&gt;                                                                     window.getContentPane();&lt;br&gt;                                                   BufferedImage  newImage  =  &lt;br&gt;                                                                     ImageIO.read(outputFile);&lt;br&gt;                                                   JLabel  label  =  new  JLabel(new  &lt;br&gt;                                                                     ImageIcon(newImage));&lt;br&gt;                                                 JScrollPane  pane  =  new  &lt;br&gt;                                                                     JScrollPane(label);&lt;br&gt;                                               windowContent.add(pane,  &lt;br&gt;                                                                 BorderLayout.CENTER);&lt;br&gt;                                               window.setSize(300,  300);&lt;br&gt;                                               window.show();&lt;br&gt;                                       }  else  {&lt;br&gt;                                           System.err.println(&amp;quot;Error  saving&amp;quot;);&lt;br&gt;                                       }&lt;br&gt;                                 }&lt;br&gt;                           }  else  {&lt;br&gt;                                 System.err.println(&amp;quot;Bad  filename&amp;quot;);&lt;br&gt;                           }&lt;br&gt;                     }  catch  (MalformedURLException  mur)  {&lt;br&gt;                           System.err.println(&amp;quot;Bad  filename&amp;quot;);&lt;br&gt;                   }  catch  (IOException  ioe)  {&lt;br&gt;                         System.err.println(&amp;quot;Error  reading  file&amp;quot;);&lt;br&gt;                 }&lt;br&gt;           }&lt;br&gt;       }&lt;br&gt;   );&lt;br&gt;&lt;br&gt;   contentPane.add(outputPanel,  BorderLayout.SOUTH);&lt;br&gt;&lt;br&gt;   }&lt;br&gt;   public  static  void  main(String  args[])  {&lt;br&gt;           JFrame  frame  =  new  Converting();&lt;br&gt;           frame.pack();&lt;br&gt;           frame.show();&lt;br&gt;   }&lt;br&gt;}&lt;br&gt;&lt;br&gt;注意，该程序没有硬编码任何文件类型，而是询问图像I/O框架支持哪些文件类型。安装Java高级图像处理图像I/O工具RC后，还可以重新运行该程序，你将会看到更多的存储格式。读取其它格式的图像基本上无需改变代码也能工作，用户只要选择不同的文件类型就可以了。&lt;br&gt;&lt;br&gt;注意：图像I/O库中的内容比这里说明的要多得多。比方说可以通过写图像的参数设置压缩率，或者用读写进度监视器来监听事件。关于图像I/O用法的更多信息，请参阅Java  Image  I/O  API  Guide。&lt;br&gt;Java高级图像处理图像I/O工具包1.0概览&lt;br&gt;&lt;br&gt;这就引出了本文要讨论的主题，Java高级图像处理图像I/O工具包1.0（RC）。JAI图像I/O工具主要用于为J2SE1.4的图像I/O库提供更多的图像readers/writers（编码解码器codecs）。只要运行时平台安装了该工具，你的程序就能够支持这些新的编码解码器。&lt;br&gt;&lt;br&gt;JAI图像I/O工具提供的新编码解码器包括：&lt;br&gt;&lt;br&gt;       *  支持对位图（BMP）编码解码（MIME类型image/bmp）；&lt;br&gt;       *  通过本机代码加速的JPEG的读写支持（MIME类型image/jpeg），同时也支持无损JPEG（ISO  10918-1）和JPEG-LS（ISO  14495-1），对支持的所有JPEG变体都能处理12位色深；&lt;br&gt;       *  支持对JPEG  2000的编码与解码（MIME类型image/jpeg2000）；&lt;br&gt;       *  用本机代码提高对PNG的编码解码速度（MIME类型image/png）；&lt;br&gt;       *  可移植位图（PNM）编码解码器支持可移植位图（PBM）、可移植灰度位图（PGM）、可移植像素位图（PPM）（MIME类型分别为image/x-  portable-anymap、image/x-portable-bitmap、image/x-portable-graymap、image/x  -portable-pixmap）；&lt;br&gt;       *  原始格式（无MIME类型）；&lt;br&gt;       *  支持TIFF编码解码（MIME类型image/tiff）；&lt;br&gt;       *  支持无线位图（WBMP）编码解码（MIME类型image/vnd.wap.wbmp）。&lt;br&gt;&lt;br&gt;该工具库还使得流插件可以与NIO库一起使用，详情参阅com.sun.media.imageio.stream包中的  FileChannelImageInputStream、FileChannelImageOutputStream和  RawImageInputStream。前两个分别以java.nio.channels.FileChannel作为输入和输出，最后一个供原始格式解码器javax.imageio.ImageReader读取原始数据。同时该工具还支持JAI操作&amp;quot;ImageRead&amp;quot;  和&amp;quot;ImageWrite&amp;quot;  ，这两个操作都包含在包内，分别对应于现有的JAI操作集{&amp;quot;Stream&amp;quot;,  &amp;quot;FileLoad&amp;quot;,  &amp;quot;URL&amp;quot;}和{&amp;quot;Encode&amp;quot;,  &amp;quot;FileStore&amp;quot;}。&lt;br&gt;安装Java高级图像处理图像I/O工具包1.0&lt;br&gt;&lt;br&gt;要使用Java高级图像处理图像I/O工具包，首先必须根据使用的操作系统平台从Early  Access  page  for  the  RC下在适当的版本。支持的操作系统有Solaris  SPARC、Solaris  x86、Linux和Windows，大小也随着版本而异，  Solaris  SPARC版有5MB之多，而其他版本则只有1MB左右。下载页面的README-jai_imageio.html文件提供了有关的下载信息和安装说明，同时还给出了所支持的编码解码插件的版本信息，比如BMP的编码解码器可以读取版本号从3到5的图像，但是只能写版本号3的图像。&lt;br&gt;&lt;br&gt;安装后除了本机库之外还有三个JAR文件。如果安全设置禁止使用，这些本机库就不会发生作用，而回复到仅仅使用内建的纯Java版JPG和PNG格式的状态。&lt;br&gt;&lt;br&gt;如果是安装到Unix机器上，则需要把上述的三个JAR文件安装到jre/lib/ext目录下。对于Solaris-SPARC用户，需要把6个.so文件复制到jre/lib/sparc目录中。Solaris-x86和Linux用户应把libclib_jiio.so文件复制到  jre/lib/i386中。&lt;br&gt;&lt;br&gt;如果要安装到Microsoft  Windows的机器上，同样需要把三个JAR文件复制到jre\lib\ext目录中，另外把clib_jiio.dll文件放到jre\bin下。&lt;br&gt;&lt;br&gt;注意：上述目录都是相对于JRE的根目录而言的。&lt;br&gt;&lt;br&gt;只要把这些文件放到了规定的位置，JAI图像I/O工具包就安装完成了。&lt;br&gt;&lt;br&gt;Java高级图像处理图像I/O工具包1.0的用法&lt;br&gt;&lt;br&gt;安装Java高级图像处理图像I/O工具包并不改变图像I/O库的用法。正确编写的代码无需变更也能正常运行。可能唯一需要改变的就是新的图像格式使用何种扩展名，你可以使用getWriterFormatNames之类的函数所返回的名称，也可以对各种格式进行硬编码。&lt;br&gt;&lt;br&gt;为了说明已有的代码仍能工作，首先重新运行一遍前面的GetFormats程序，就可以看到对新的MIME类型的支持：&lt;br&gt;&lt;br&gt;Readers:  [image/png,  image/x-portable-graymap,  &lt;br&gt;   mage/jpeg,  image/jpeg2000,  image/x-png,  &lt;br&gt;   mage/tiff,  image/vnd.wap.wbmp,  image/x-portable-pixmap,  &lt;br&gt;   mage/x-portable-bitmap,  image/bmp,  image/gif,  &lt;br&gt;   mage/x-portable-anymap,  ]&lt;br&gt;Writers:  [image/png,  image/x-portable-graymap,  image/jpeg,  &lt;br&gt;   mage/jpeg2000,  image/x-png,  image/tiff,  &lt;br&gt;   mage/vnd.wap.wbmp,  image/x-portable-pixmap,  &lt;br&gt;   mage/x-portable-bitmap,  image/bmp,  &lt;br&gt;   mage/x-portable-anymap,  ]&lt;br&gt;&lt;br&gt;然后运行Converting程序，现在可以把图像转换成更多的格式。&lt;br&gt;&lt;br&gt;尽管对于默认的编码解码器而言，那些缺省的读写设置通常已经足够了，但是也许你希望改变新增编码解码器的设置。改变这些设置无需调用ImageIO的  read和write方法，而只要针对指定的MIME类型从ImageIO获得相应的ImageReader或ImageWriter对象，然后改变这些对象的设置就可以了。一旦改变了默认的ImageReadParam或者ImageWriteParam，就可以返回去调用ImageIO的read和  Write方法。否则的话，就只能在ImageReader和ImageWriter中进行读写操作。比如，JPEG的ImageWriter会要求你通知编码器生成优化的图像Huffman表。其它的编码解码器也会提供它们自己的相应设置。&lt;br&gt;结论&lt;br&gt;&lt;br&gt;对Java  平台可用的扩展而言，Java高级图像处理图像I/O工具包1.0  RC是一个受欢迎的增强。一旦通过RC阶段，新增的图像格式支持将是对标准运行时环境的一个令人鼓舞的改进。库的内容分别放在几个  com.sun.media.imageio包内，有一些还是本机代码库。但是所有库的使用都通过J2SE  1.4引入的标准图像I/O框架。只需要把库添加到JRE中就可以使用它们了。&lt;br&gt;资源&lt;br&gt;&lt;br&gt;       *  Java  Media  APIs&lt;br&gt;       *  Java  Advanced  Imaging  API&lt;br&gt;       *  Java  Advanced  Imaging  Image  I/O  API  RC  1.0&lt;br&gt;       *  Java  Advanced  Imaging  Image  I/O  Tools  API  Documentation&lt;br&gt;       *  JSR  15:  Image  I/O  Framework  Specification&lt;br&gt;       *  JSR  34:  Java  Advanced  Imaging  API  1.1&lt;br&gt;       *  Java  Advanced  Imaging  Interest  Group&lt;br&gt;       *  Java  Image  I/O  API  Guide&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6279604829903914469&amp;page=RSS%3a+%e9%ab%98%e7%ba%a7%e5%9b%be%e5%83%8f%e5%a4%84%e7%90%86%e5%9b%be%e5%83%8fI%2fO++API++RC++1.0&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=900way.spaces.live.com&amp;amp;GT1=900way"&gt;</description><comments>http://900way.spaces.live.com/Blog/cns!5725A352704005E5!222.entry#comment</comments><guid isPermaLink="true">http://900way.spaces.live.com/Blog/cns!5725A352704005E5!222.entry</guid><pubDate>Thu, 14 Dec 2006 14:21:16 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://900way.spaces.live.com/blog/cns!5725A352704005E5!222/comments/feed.rss</wfw:commentRss><wfw:comment>http://900way.spaces.live.com/Blog/cns!5725A352704005E5!222.entry#comment</wfw:comment><dcterms:modified>2006-12-14T14:21:16Z</dcterms:modified></item><item><title>Sun Java SE 6 最终版发布 脚本语言任意操作</title><link>http://900way.spaces.live.com/Blog/cns!5725A352704005E5!214.entry</link><description>&lt;div&gt;
&lt;p&gt; 
&lt;p&gt;Sun 宣布&lt;a href="http://java.sun.com/javase/6/"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;Java Standard Edition 6&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; &lt;font face=Arial&gt;的最终正式版发布，同时也在官方提供了正式版本下载。&lt;/font&gt; 
&lt;p&gt;&lt;font face=Arial&gt;很多开发者，在试用此前Release的demo版本，都提到性能提升不少，从5%到24% 。不过，这依赖于你的应用是什么。新版本对桌面应用性能提高不少，但是对Java EE来说，除非是Ria应用，提升并不是特别大。 &lt;/font&gt;
&lt;p&gt;&lt;font face=Arial&gt;无论如何，这一次对JIT的提升是卓有成效的。无论是运行时分析功能，还是用户对性能情况的反馈。&lt;/font&gt;
&lt;p&gt;&lt;font face=Arial&gt;新版本还提供对动态语言的支持，将允许人们操作任意的脚本语言，和使用Java 对象。Java SE 6 中实现了JSR 223。这是一个脚本框架，提供了让脚本语言来访问Java 内部的方法。你可以在运行的时候找到脚本引擎，然后调用这个引擎去执行脚本。这个脚本API 允许你为脚本语言提供Java 支持。另外，Web Scripting Framework允许脚本代码在任何的Servlet容器（例如Tomcat）中生成Web内容。&lt;/font&gt;
&lt;p&gt;&lt;font face=Arial&gt;Java SE 6 中对内存泄漏增强了分析以及诊断能力。当遇到java.lang.OutOfMemory 异常的时候，可以得到一个完整的堆栈信息，并且当堆已经满了的时候，会产生一个Log文件来记录这个致命错误。另外，JVM还添加了一个选项，允许你在堆满的时候运行脚本。（这也就是提供了另外一种方法来诊断错误）&lt;/font&gt;
&lt;p&gt;&lt;font face=Arial&gt;Mustang 还将简化Web services 的开发和发布。XML和Web服务一直都是Mustang的关注重点。Mustang为此引入了JAX-WS(Java Architecture for XML-Web Services) 2.0 以及JAXB(Java Architecture for XML Binding) 2.0。&lt;/font&gt;
&lt;p&gt;&lt;font face=Arial&gt;无论如何，这次最终版本“最终”赶在了圣诞之前发布，是送给全球开发者的圣诞礼物。&lt;/font&gt;
&lt;p&gt;&lt;font face=Arial&gt;对于Java SE 6 的提升和不足，你如何看待？&lt;/font&gt;
&lt;p&gt;&lt;font face=Arial&gt;&lt;/font&gt; &lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6279604829903914469&amp;page=RSS%3a+Sun+Java+SE+6+%e6%9c%80%e7%bb%88%e7%89%88%e5%8f%91%e5%b8%83+%e8%84%9a%e6%9c%ac%e8%af%ad%e8%a8%80%e4%bb%bb%e6%84%8f%e6%93%8d%e4%bd%9c&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=900way.spaces.live.com&amp;amp;GT1=900way"&gt;</description><comments>http://900way.spaces.live.com/Blog/cns!5725A352704005E5!214.entry#comment</comments><guid isPermaLink="true">http://900way.spaces.live.com/Blog/cns!5725A352704005E5!214.entry</guid><pubDate>Thu, 14 Dec 2006 12:00:53 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://900way.spaces.live.com/blog/cns!5725A352704005E5!214/comments/feed.rss</wfw:commentRss><wfw:comment>http://900way.spaces.live.com/Blog/cns!5725A352704005E5!214.entry#comment</wfw:comment><dcterms:modified>2006-12-14T12:00:53Z</dcterms:modified></item><item><title>Jar、Zip文件的存储格式</title><link>http://900way.spaces.live.com/Blog/cns!5725A352704005E5!184.entry</link><description>&lt;div&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ZIP File Format Specification&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt; &lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;a href="http://www.cjsdn.net/user/download/185301/zip45.txt"&gt;http://www.cjsdn.net/user/download/185301/zip45.txt&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt; &lt;/div&gt;
&lt;div&gt;&lt;span&gt;
&lt;div&gt;&lt;span&gt;============================================&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;更多关于ZIP的信息,请访问 &lt;a href="http://www.pkware.com/"&gt;&lt;u&gt;&lt;font color="#0000ff"&gt;http://www.pkware.com&lt;/font&gt;&lt;/u&gt;&lt;/a&gt; &lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt;
&lt;div&gt;&lt;span&gt;其他更多的文件存储格式 &lt;a href="http://www.wotsit.org/search.asp?s=archive"&gt;http://www.wotsit.org/search.asp?s=archive&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;============================================&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt; &lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6279604829903914469&amp;page=RSS%3a+Jar%e3%80%81Zip%e6%96%87%e4%bb%b6%e7%9a%84%e5%ad%98%e5%82%a8%e6%a0%bc%e5%bc%8f&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=900way.spaces.live.com&amp;amp;GT1=900way"&gt;</description><comments>http://900way.spaces.live.com/Blog/cns!5725A352704005E5!184.entry#comment</comments><guid isPermaLink="true">http://900way.spaces.live.com/Blog/cns!5725A352704005E5!184.entry</guid><pubDate>Tue, 05 Dec 2006 11:32:46 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://900way.spaces.live.com/blog/cns!5725A352704005E5!184/comments/feed.rss</wfw:commentRss><wfw:comment>http://900way.spaces.live.com/Blog/cns!5725A352704005E5!184.entry#comment</wfw:comment><dcterms:modified>2006-12-05T11:32:46Z</dcterms:modified></item><item><title>使用JarFile和JarInputStream读取jar的不同</title><link>http://900way.spaces.live.com/Blog/cns!5725A352704005E5!183.entry</link><description>&lt;div&gt;在JarOutputStream.java里有这样一个方法,可以看出这是导致第一个条目增加8个字节的原因&lt;br&gt;&lt;br&gt;public void putNextEntry(ZipEntry ze) throws IOException {&lt;br&gt;  if (firstEntry) { &lt;br&gt;   // Make sure that extra field data for first JAR&lt;br&gt;   // entry includes JAR magic number id.&lt;br&gt;   byte[] edata = ze.getExtra();&lt;br&gt;   &lt;br&gt;   if (edata != null &amp;amp;&amp;amp; !hasMagic(edata)) {&lt;br&gt;    // Prepend magic to existing extra data&lt;br&gt;     byte[] tmp = new byte[edata.length + 4];&lt;br&gt;     System.arraycopy(tmp, 4, edata, 0, edata.length);&lt;br&gt;     edata = tmp;&lt;br&gt;   } else {&lt;br&gt;    edata = new byte[4];&lt;br&gt;   }&lt;br&gt;   set16(edata, 0, JAR_MAGIC); // extra field id&lt;br&gt;   set16(edata, 2, 0); // extra field size&lt;br&gt;   ze.setExtra(edata);&lt;br&gt;   firstEntry = false;&lt;br&gt;  }&lt;br&gt;  super.putNextEntry(ze);&lt;br&gt;}&lt;br&gt;&lt;br&gt;据此实践,得出结论:&lt;br&gt;1、通过JarInputStream和JarOutputStream配合复制jar&lt;br&gt;A)如果源jar是未压缩的,复制后,目的jar会比源jar多8个字节,但是并不影响程序的运行.这个增加量是固定的,原因从上面的代码可以看出来.&lt;br&gt;B)如果源jar是压缩的,目的jar会和源jar大小相同.&lt;br&gt;.&lt;br&gt;.&lt;br&gt;.&lt;br&gt;JarInputStream jarIn = new JarInputStream(new FileInputStream(&amp;quot;inputJar.jar&amp;quot;));&lt;br&gt;JarOutputStream jarOut = new JarOutputStream(new FileOutputStream(&amp;quot;outputJar.jar&amp;quot;));&lt;br&gt;.&lt;br&gt;.&lt;br&gt;.&lt;br&gt;&lt;br&gt;2、如果采用JarFile和JarOutputStream配合复制jar&lt;br&gt;A)如果源jar是未压缩的,复制后,目的jar会比源jar小(即由不压缩便为压缩),而且也不影响程序的运行.减小的大小试源jar大小变化.&lt;br&gt;B)如果源jar是压缩的,目的jar会和源jar大小相同.&lt;br&gt;.&lt;br&gt;.&lt;br&gt;.&lt;br&gt;JarFile jarfile = new JarFile(&amp;quot;inputJar.jar&amp;quot;);&lt;br&gt;JarOutputStream jarOut = new JarOutputStream(new FileOutputStream(&amp;quot;outputJar.jar&amp;quot;));&lt;br&gt;.&lt;br&gt;.&lt;br&gt;.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;其实在使用 JarFile jarfile = new JarFile(&amp;quot;inputJar.jar&amp;quot;); 的时候，没有对jar文件做什么处理。&lt;br&gt;当实际读取条目数据流的时候，才开始做判断。&lt;br&gt;在ZipFile.java中，部分代码如下:&lt;br&gt;&lt;pre&gt;&lt;br&gt;&lt;br&gt;   private InputStream getInputStream(String name) throws IOException {&lt;br&gt;  if (name == null) {&lt;br&gt;      throw new NullPointerException(&amp;quot;name&amp;quot;);&lt;br&gt;  }&lt;br&gt;        long jzentry = 0;&lt;br&gt;        InputStream in = null;&lt;br&gt;        synchronized (this) {&lt;br&gt;            ensureOpen(jzfile);&lt;br&gt;            jzentry = getEntry(jzfile, name);&lt;br&gt;            if (jzentry == 0) {&lt;br&gt;                return null;&lt;br&gt;            }&lt;br&gt;            in = new ZipFileInputStream(jzentry, this);&lt;br&gt;        }&lt;br&gt;  switch (getMethod(jzentry)) {&lt;br&gt;  case STORED:&lt;br&gt;      return in;&lt;br&gt;  case DEFLATED:&lt;br&gt;  .&lt;br&gt;  .&lt;br&gt;  .&lt;br&gt;  &lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;其中，getMethod(jzentry)对应的方法 private static native int getMethod(long jzentry); 是从本地库加载的&lt;br&gt;&lt;pre&gt;&lt;br&gt; static {&lt;br&gt;       AccessController.doPrivileged(  new sun.security.action.LoadLibraryAction(&amp;quot;zip&amp;quot;));&lt;br&gt;       initIDs();&lt;br&gt;    }&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;不知道ZipFile.java中的getMethod(jzentry)具体是如何处理的,这就是使用JarFile和JarInputStream读取jar产生不同效果的地方!&lt;br&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;ZipEntry.java提供了getMethod()方法,也提供了setMethod(int method)方法,可以显式的指定是否压缩处理jar.&lt;br&gt;这是提供给用户的方法,可以结合实际情况使用. &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;span&gt;如果一个ZipEntry条目,没有指定压缩的方法,默认的值为 -1 ,&lt;br&gt;那么使用getMethod()方法得到就是 -1.&lt;br&gt;另外的两个可能的值是 0(不压缩处理)和8(压缩处理)&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;br&gt;    /**&lt;br&gt;     * Compression method for uncompressed entries.&lt;br&gt;     */&lt;br&gt;    public static final int STORED = 0;&lt;br&gt;&lt;br&gt;    /**&lt;br&gt;     * Compression method for compressed (deflated) entries.&lt;br&gt;     */&lt;br&gt;    public static final int DEFLATED = 8;&lt;br&gt;&lt;/pre&gt;&lt;br&gt;&lt;br&gt;在ZipOutputStream.java输出到jar的操作的时候,如果得到的值是-1 ,会以压缩方式处理.既等同与 8 &lt;br&gt;&lt;pre&gt;&lt;br&gt;.&lt;br&gt;.&lt;br&gt;.&lt;br&gt;   private int method = DEFLATED;&lt;br&gt;.&lt;br&gt;.&lt;br&gt;.&lt;br&gt;  if (e.method == -1) {&lt;br&gt;      e.method = method;  // use default method&lt;br&gt;  }&lt;br&gt;.&lt;br&gt;.&lt;br&gt;.&lt;br&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6279604829903914469&amp;page=RSS%3a+%e4%bd%bf%e7%94%a8JarFile%e5%92%8cJarInputStream%e8%af%bb%e5%8f%96jar%e7%9a%84%e4%b8%8d%e5%90%8c&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=900way.spaces.live.com&amp;amp;GT1=900way"&gt;</description><comments>http://900way.spaces.live.com/Blog/cns!5725A352704005E5!183.entry#comment</comments><guid isPermaLink="true">http://900way.spaces.live.com/Blog/cns!5725A352704005E5!183.entry</guid><pubDate>Tue, 05 Dec 2006 11:25:18 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://900way.spaces.live.com/blog/cns!5725A352704005E5!183/comments/feed.rss</wfw:commentRss><wfw:comment>http://900way.spaces.live.com/Blog/cns!5725A352704005E5!183.entry#comment</wfw:comment><dcterms:modified>2006-12-05T11:42:11Z</dcterms:modified></item><item><title>使用java程序复制jar出现的问题</title><link>http://900way.spaces.live.com/Blog/cns!5725A352704005E5!182.entry</link><description>&lt;div&gt;&lt;span&gt;需求：有一个jar，需要动态加入一些文件。&lt;br&gt;方法：使用JarInputStream读取源jar,然后用JarOutputStream输出新的(目的)jar。&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;问题：通过对比，发现源jar和目的jar大小不一致。目的jar总是比源jar多了8个字节！&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;(原来是由于jar程序无法执行，对比文件后，发现是由于源jar的问题;也由此产生对jar文件格式和使用不同的方法生成jar的过程的讨论：原文发布在&lt;a href="http://www.cjsdn.net/"&gt;www.cjsdn.net&lt;/a&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;/span&gt; &lt;/div&gt;
&lt;div&gt;&lt;span&gt;代码如下：&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;public static void cpJar() {&lt;br&gt;   try {&lt;br&gt;       JarInputStream jarIn = new JarInputStream(new FileInputStream(&amp;quot;inputJar.jar&amp;quot;));&lt;br&gt;       JarOutputStream jarOut = new JarOutputStream(new FileOutputStream(&amp;quot;outputJar.jar&amp;quot;));&lt;br&gt;       byte[] buf = new byte[4096];&lt;br&gt;       JarEntry entry;&lt;br&gt;       while ((entry = jarIn.getNextJarEntry()) != null) {&lt;br&gt;              jarOut.putNextEntry(entry); &lt;br&gt;              int read; &lt;br&gt;              while ((read = jarIn.read(buf)) != -1) {&lt;br&gt;                    jarOut.write(buf, 0, read);&lt;br&gt;             }&lt;br&gt;             jarOut.closeEntry();&lt;br&gt;        }&lt;br&gt;        jarOut.flush();&lt;br&gt;       jarOut.close();&lt;br&gt;       jarIn.close();&lt;br&gt;   } catch (Exception e) {&lt;br&gt;       e.printStackTrace();&lt;br&gt;  }&lt;br&gt;}&lt;/span&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6279604829903914469&amp;page=RSS%3a+%e4%bd%bf%e7%94%a8java%e7%a8%8b%e5%ba%8f%e5%a4%8d%e5%88%b6jar%e5%87%ba%e7%8e%b0%e7%9a%84%e9%97%ae%e9%a2%98&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=900way.spaces.live.com&amp;amp;GT1=900way"&gt;</description><comments>http://900way.spaces.live.com/Blog/cns!5725A352704005E5!182.entry#comment</comments><guid isPermaLink="true">http://900way.spaces.live.com/Blog/cns!5725A352704005E5!182.entry</guid><pubDate>Tue, 05 Dec 2006 11:19:46 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://900way.spaces.live.com/blog/cns!5725A352704005E5!182/comments/feed.rss</wfw:commentRss><wfw:comment>http://900way.spaces.live.com/Blog/cns!5725A352704005E5!182.entry#comment</wfw:comment><dcterms:modified>2006-12-05T11:19:46Z</dcterms:modified></item><item><title>RMI实现的例子(实现非远程对象的RMI调用)</title><link>http://900way.spaces.live.com/Blog/cns!5725A352704005E5!120.entry</link><description>&lt;div&gt;//&lt;/div&gt;
&lt;div&gt;//RemoteMethodInterface.java继承远程方法类&lt;/div&gt;
&lt;div&gt;//&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;public interface RemoteMethodInterface        &lt;br&gt; extends java.rmi.Remote &lt;br&gt;{&lt;br&gt;    public String remoteMethod()&lt;br&gt;        throws java.rmi.RemoteException;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;    public TestConnect advRemoteMethod()&lt;br&gt;        throws java.rmi.RemoteException;&lt;/div&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;//&lt;/div&gt;
&lt;div&gt;// ImplRemoteMethodClass.java接口的实现类&lt;/div&gt;
&lt;div&gt;//&lt;/div&gt;
&lt;div&gt;import java.net.*;&lt;/div&gt;
&lt;div&gt;&lt;br&gt;public class ImplRemoteMethodClass   &lt;/div&gt;
&lt;div&gt;  extends java.rmi.server.UnicastRemoteObject&lt;br&gt;    implements  RemoteMethodInterface &lt;br&gt;{&lt;br&gt;    public ImplRemoteMethodClass()&lt;br&gt;        throws java.rmi.RemoteException &lt;br&gt; {&lt;br&gt;        super();&lt;br&gt;    }&lt;br&gt;    public String remoteMethod()&lt;br&gt;        throws java.rmi.RemoteException &lt;br&gt; {&lt;br&gt;  String s=&amp;quot;This is a remote method !&amp;quot;; &lt;br&gt;  return s;&lt;br&gt; }&lt;/div&gt;
&lt;div&gt; public TestConnect advRemoteMethod()&lt;br&gt;        throws java.rmi.RemoteException&lt;br&gt; {&lt;br&gt;        TestConnect test =new TestConnect();&lt;br&gt;        return test;&lt;br&gt; }&lt;/div&gt;
&lt;div&gt;    public void localMethod()&lt;br&gt;        throws java.rmi.RemoteException &lt;br&gt; {&lt;br&gt;    System.out.println(&amp;quot;This is a local method !&amp;quot;);&lt;br&gt; }&lt;br&gt;}&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;//&lt;/div&gt;
&lt;div&gt;// 测试用的非远程类TestConnect.java&lt;/div&gt;
&lt;div&gt;//&lt;br&gt;&lt;/div&gt;
&lt;div&gt;import java.io.*;&lt;br&gt;public class TestConnect implements Serializable{&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;  public String test(){&lt;br&gt;       System.out.println(&amp;quot;*** My name is TestConnect&amp;quot;);&lt;br&gt;       return  &amp;quot;*** My name is TestConnect&amp;quot;;&lt;br&gt;  }&lt;/div&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;//&lt;/div&gt;
&lt;div&gt;// 提供远程调用的服务程序 RemoteMethodServer.java&lt;/div&gt;
&lt;div&gt;//&lt;/div&gt;
&lt;div&gt;import java.rmi.*;&lt;br&gt;import java.rmi.server.*;&lt;br&gt;import java.rmi.registry.*;&lt;br&gt;import java.net.*;&lt;br&gt;public class RemoteMethodServer&lt;br&gt;{&lt;br&gt; public RemoteMethodServer()throws Exception &lt;br&gt; {&lt;br&gt;  RemoteMethodInterface   remoteObject = new ImplRemoteMethodClass();&lt;br&gt;  Naming.rebind(&amp;quot;rmi://192.168.1.112:1099/RemoteService&amp;quot;, remoteObject);&lt;br&gt; }&lt;br&gt; public static void main(String args[])throws Exception &lt;br&gt; {&lt;br&gt;  new RemoteMethodServer();&lt;br&gt; }&lt;br&gt;}&lt;br&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;//&lt;/div&gt;
&lt;div&gt;//远程方法访问的客户端程序 RemoteClient.java&lt;/div&gt;
&lt;div&gt;//&lt;/div&gt;
&lt;div&gt;import java.rmi.*;&lt;br&gt;import java.rmi.server.*;&lt;br&gt;import java.rmi.registry.*;&lt;br&gt;import java.net.*;&lt;/div&gt;
&lt;div&gt;&lt;br&gt;public class RemoteClient &lt;br&gt;{&lt;br&gt;   public static void main(String[] args)throws Exception &lt;br&gt;   {&lt;br&gt;    RemoteMethodInterface remoteObject = (RemoteMethodInterface)Naming.lookup(&amp;quot;rmi://192.168.1.112:1099/RemoteService&amp;quot;);&lt;br&gt;    System.out.println(remoteObject.remoteMethod());&lt;br&gt;    System.out.println(remoteObject.advRemoteMethod().test());&lt;br&gt;  &lt;br&gt;    }&lt;br&gt;}&lt;br&gt;&lt;/div&gt;
&lt;div&gt;保存上述文件。&lt;/div&gt;
&lt;div&gt;编译：&lt;/div&gt;
&lt;div&gt;javac RemoteMethodInterface.java&lt;br&gt;javac ImplRemoteMethodClass.java  &lt;br&gt;javac TestConnect.java&lt;br&gt;javac RemoteMethodServer.java&lt;br&gt;javac RemoteClient.java&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;生成 桩（Stub）和框架（Skeleton）类文件 &lt;/div&gt;
&lt;div&gt;rmic  ImplRemoteMethodClass&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;打开一个终端:&lt;/div&gt;
&lt;div&gt;运行: rmiregistry&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;打开一个终端:&lt;br&gt;运行: java RemoteMethodServer&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;打开一个终端:&lt;br&gt;运行: java RemoteClient&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;其中：&lt;/div&gt;
&lt;div&gt;192.168.1.112可以改成127.0.0.1或者其他Ip&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;这仅仅是一个非常简单的rmi实例。&lt;/div&gt;
&lt;div&gt;在重构的系统中会考虑rmi方式的接口预留,同时会继续考虑更高层的方式，比如：webservice服务的封装和接口的预留。&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=6279604829903914469&amp;page=RSS%3a+RMI%e5%ae%9e%e7%8e%b0%e7%9a%84%e4%be%8b%e5%ad%90(%e5%ae%9e%e7%8e%b0%e9%9d%9e%e8%bf%9c%e7%a8%8b%e5%af%b9%e8%b1%a1%e7%9a%84RMI%e8%b0%83%e7%94%a8)&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=900way.spaces.live.com&amp;amp;GT1=900way"&gt;</description><comments>http://900way.spaces.live.com/Blog/cns!5725A352704005E5!120.entry#comment</comments><guid isPermaLink="true">http://900way.spaces.live.com/Blog/cns!5725A352704005E5!120.entry</guid><pubDate>Fri, 09 Dec 2005 08:55:14 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://900way.spaces.live.com/blog/cns!5725A352704005E5!120/comments/feed.rss</wfw:commentRss><wfw:comment>http://900way.spaces.live.com/Blog/cns!5725A352704005E5!120.entry#comment</wfw:comment><dcterms:modified>2005-12-09T09:13:39Z</dcterms:modified></item></channel></rss>