﻿<?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-RomKK-随笔分类-java基础</title><link>http://www.blogjava.net/RomKK/category/24356.html</link><description>关注java技术!</description><language>zh-cn</language><lastBuildDate>Fri, 27 Jul 2007 04:22:08 GMT</lastBuildDate><pubDate>Fri, 27 Jul 2007 04:22:08 GMT</pubDate><ttl>60</ttl><item><title>桌面Java瘦身 注重Ajax特征</title><link>http://www.blogjava.net/RomKK/archive/2007/07/26/132446.html</link><dc:creator>RomKK</dc:creator><author>RomKK</author><pubDate>Thu, 26 Jul 2007 01:49:00 GMT</pubDate><guid>http://www.blogjava.net/RomKK/archive/2007/07/26/132446.html</guid><wfw:comment>http://www.blogjava.net/RomKK/comments/132446.html</wfw:comment><comments>http://www.blogjava.net/RomKK/archive/2007/07/26/132446.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RomKK/comments/commentRss/132446.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RomKK/services/trackbacks/132446.html</trackback:ping><description><![CDATA[<script type="text/javascript"><!--
google_ad_client = "pub-4399204441904216";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text";
//2007-07-25: http://romkk.j5com.cn/blog
google_ad_channel = "8013984535";
google_color_border = "F7F7F7";
google_color_bg = "F7F7F7";
google_color_link = "454545";
google_color_text = "454545";
google_color_url = "454545";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><p align=left><span>为了桌面</span><span>Java</span><span>的未来发展，许多的重大改进正在进行中，对此做了很大的努力</span></p>
<p align=left><span>　　就语言方面来说，出现了</span><span>JavaFX script </span><span>项目。</span><span>JavaFX</span><span>是很灵巧的，它提供了一个高级的脚本接口，运行在</span><span>Java 2D</span><span>的</span><span>API</span><span>上。从用户的角度来看，他们不需要编写</span><span>Java</span><span>代码，不需要深入理解复杂的线程，</span><span>Java 2D</span><span>，</span><span>Swing</span><span>类的层次结构，定时框架结构</span><span>(timing framework)</span><span>等等。相反，他们只是编写脚本语言和描绘出所需要的</span><span>GUI</span><span>，包括活波的音响效果，图形效果，比如说梯度或者音乐，和数据绑定等等，这些都建立在一个基础</span><span>API</span><span>上。</span></p>
<p align=left><span>　　这里有许多的工具帮助你学习</span><span>syntax</span><span>语言，相关资源这个从这个网站获得</span><span>;JavaFX</span><span>研发小组的目标就是提供</span><span>syntax</span><span>语言，和一些关于</span><span>JavaFX</span><span>的用户体验，这些用户包括美术设计员和那些对应用程序可视界面美观感兴趣的民众。当前，</span><span>JavaFX</span><span>某种程度上作为第四步产生的语言在运行，因为首先是解释器将</span><span>FX</span><span>脚本创建成为</span><span>Java</span><span>代码，然后再调用适当的</span><span>Java 2D API</span><span>。该小组长期的目标是将</span><span>FX</span><span>脚本直接编译成字节码。</span></p>
<p align=left><span>　　</span><span>JavaFX</span><span>添加到桌面</span><span>Java</span><span>是一件非常好的事情，但是，这得取决于是否有这样的一种</span><span>JRE</span><span>的存在，它能运行</span><span>JavaFX</span><span>生成的代码。有些人认为</span><span>FX</span><span>已经进军到</span><span>RIA(rich Internet application)</span><span>领域，和</span><span>Adobe</span><span>公司的</span><span> Flex</span><span>一较高下。但是，目前还是有一些难题需要解决，举个例子，如何才能让桌面</span><span>Java</span><span>的安装体验和运行时间性能比得上其它的</span><span>RIA</span><span>框架。还好，这种问题正在被其他的项目解决，这个项目名称就是</span><span>Java kernel</span><span>。</span></p>
<p align=left><span>　　</span><span>Java kernel</span><span>主动承认这么一个事情，即大多数的</span><span>Java</span><span>应用程序都是只有</span><span>JRE</span><span>的部分大小，如</span><span>Limewire(</span><span>一个文件共享的桌面应用程序</span><span>)</span><span>，它只有</span><span>JRE</span><span>的三分之一大小。</span><span>Kernel</span><span>将会对</span><span>JRE</span><span>重新打包，使得只下载应用程序所需要的部分</span><span>JRE</span><span>。每个程序所需要的基本部分将会被下载，作为</span><span>JRE</span><span>启动所需要的最小部分，其他的部分根据需要下载，或者根据</span><span>ClassNotFound</span><span>异常信息，下载缺失的类。这将是一个巨大的好消息帮助桌面</span><span>Java</span><span>应用程序瘦身，同时还能使得桌面</span><span>Java</span><span>应用程序执行的更为有效。除了解决如何下载的问题外，</span><span>kernel</span><span>还非常关注</span><span>Java</span><span>程序的启动性能。</span></p>
<p align=left><span>　　在先前的</span><span>kernel</span><span>几个版本，热启动时间</span><span>(warm start times)</span><span>减少了很多，但是，在应用程序调用</span><span>main(String[])</span><span>前，冷启动</span><span>JRE</span><span>仍然需要延误许多秒的时间。</span><span>Java kernel</span><span>正在尝试有效的处理冷启动，将冷启动转变为热启动，通过一些相关的技术，如预加载</span><span>(pre-loading)JRE</span><span>，从硬盘读入到内存，还有一个操作系统服务，这个服务的功能就是监视可分配的内存来加载</span><span>JRE</span><span>，使得用户获得最佳的性能。出了这些，</span><span>kernel</span><span>还提供了一个新的浏览器插件，提供给</span><span>Web </span><span>开发者更多的关于桌面运行信息，可获得的</span><span>JRE</span><span>水平等等。</span></p>
<span>　　对于桌面</span><span>Java</span><span>来说，</span><span>Java kernel </span><span>和</span><span>Java FX</span><span>两大好消息。说</span><span>Kernel</span><span>是一个非常好的技术，是因为它承认了</span><span>Swing</span><span>已经到了一个非常成熟的阶段，并且帮助开发这如何将他们的</span><span>Java</span><span>应用程序更为快速，更为有效的搬到用户桌面上。说</span><span>FX</span><span>是两外一个非常好的消息，是因为它为</span><span>Java</span><span>开发者打开了新篇章，特别是那些愿意使用脚本语言和做一些高级的，活波的，图形效果的开发者，他们只需要写简单几行代码就可以完成。我相信这两项技术将会使得更多的应用程序用</span><span>Java</span><span>语言编写，运行在用户的机器上，同时，对于用户和开发者来说，应用程序变得更快，更简单。</span><br>
<script type="text/javascript"><!--
google_ad_client = "pub-4399204441904216";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text_image";
//2007-07-25: http://romkk.j5com.cn/blog
google_ad_channel = "8013984535";
google_color_border = "F7F7F7";
google_color_bg = "F7F7F7";
google_color_link = "454545";
google_color_text = "454545";
google_color_url = "454545";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script> <img src ="http://www.blogjava.net/RomKK/aggbug/132446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RomKK/" target="_blank">RomKK</a> 2007-07-26 09:49 <a href="http://www.blogjava.net/RomKK/archive/2007/07/26/132446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于Swing的免费look and feel(有很多哟)</title><link>http://www.blogjava.net/RomKK/archive/2007/07/25/132215.html</link><dc:creator>RomKK</dc:creator><author>RomKK</author><pubDate>Wed, 25 Jul 2007 01:56:00 GMT</pubDate><guid>http://www.blogjava.net/RomKK/archive/2007/07/25/132215.html</guid><wfw:comment>http://www.blogjava.net/RomKK/comments/132215.html</wfw:comment><comments>http://www.blogjava.net/RomKK/archive/2007/07/25/132215.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/RomKK/comments/commentRss/132215.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RomKK/services/trackbacks/132215.html</trackback:ping><description><![CDATA[<script type="text/javascript"><!--
google_ad_client = "pub-4399204441904216";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text";
//2007-07-24: http://romkk.j5com.cn/blog
google_ad_channel = "8013984535";
google_color_border = "F7F7F7";
google_color_bg = "F7F7F7";
google_color_link = "0000FF";
google_color_text = "000000";
google_color_url = "008000";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用java写桌面程序的时候，总是抱怨Swing的页面太难看，而很多的Look and Feel 都是收费的。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天发现一个好东东，全是免费的，效果还不错呀，感兴趣的话赶紧去下吧！<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下载地址： <a href="http://www.javootoo.com/">http://www.javootoo.com/</a>&nbsp; 上有一个free look and feel 栏目<br>
<script type="text/javascript"><!--
google_ad_client = "pub-4399204441904216";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "image";
//2007-07-24: http://romkk.j5com.cn/blog
google_ad_channel = "8013984535";
google_color_border = "F7F7F7";
google_color_bg = "F7F7F7";
google_color_link = "0000FF";
google_color_text = "000000";
google_color_url = "008000";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script> <img src ="http://www.blogjava.net/RomKK/aggbug/132215.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RomKK/" target="_blank">RomKK</a> 2007-07-25 09:56 <a href="http://www.blogjava.net/RomKK/archive/2007/07/25/132215.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>花1K内存实现高效I/O的RandomAccessFile类</title><link>http://www.blogjava.net/RomKK/archive/2007/07/25/132202.html</link><dc:creator>RomKK</dc:creator><author>RomKK</author><pubDate>Wed, 25 Jul 2007 01:32:00 GMT</pubDate><guid>http://www.blogjava.net/RomKK/archive/2007/07/25/132202.html</guid><wfw:comment>http://www.blogjava.net/RomKK/comments/132202.html</wfw:comment><comments>http://www.blogjava.net/RomKK/archive/2007/07/25/132202.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RomKK/comments/commentRss/132202.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RomKK/services/trackbacks/132202.html</trackback:ping><description><![CDATA[<p id=subtitle>通过扩展RandomAccessFile类使之具备Buffer改善I/O性能</p><br><script type="text/javascript"><!--
google_ad_client = "pub-4399204441904216";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text";
//2007-07-24: http://romkk.j5com.cn/blog
google_ad_channel = "8013984535";
google_color_border = "F7F7F7";
google_color_bg = "F7F7F7";
google_color_link = "0000FF";
google_color_text = "000000";
google_color_url = "008000";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br>
<img class=display-img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=1><br>
<blockquote>JAVA的文件随机存取类（RandomAccessFile）的I/O效率较低。通过分析其中原因，提出解决方案。逐步展示如何创建具备缓存读写能力的文件随机存取类，并进行了优化。通过与其它文件访问类的性能对比，证明了其实用价值。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
<p><a name=N1003C><span class=smalltitle><strong><font face=Arial>主体：</font></strong></span></a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 开发人员使用RandomAccessFile类时。其I/O性能较之其它常用开发语言的同类性能差距甚远，严重影响程序的运行效率。开发人员迫切需要提高效率，下面分析RandomAccessFile等文件类的源代码，找出其中的症结所在，并加以改进优化，创建一个"性/价比"俱佳的随机文件访问类BufferedRandomAccessFile。<br></p>
<p><a name=1><span class=atitle>在改进之前先做一个基本测试：逐字节COPY一个12兆的文件（这里牵涉到读和写）。</span></a></p>
<p>
<table width="60%" border=1>
    <tbody>
        <tr>
            <td>读</td>
            <td>写</td>
            <td>耗用时间（秒）</td>
        </tr>
        <tr>
            <td>RandomAccessFile</td>
            <td>RandomAccessFile</td>
            <td>95.848</td>
        </tr>
        <tr>
            <td>BufferedInputStream + DataInputStream</td>
            <td>BufferedOutputStream + DataOutputStream</td>
            <td>2.935</td>
        </tr>
    </tbody>
</table>
<p>我们可以看到两者差距约32倍，RandomAccessFile也太慢了。先看看两者关键部分的源代码，对比分析，找出原因。</p>
<p><strong>1．1．[RandomAccessFile]</strong> </p>
<p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>public class RandomAccessFile implements DataOutput, DataInput {
            public final byte readByte() throws IOException {
            int ch = this.read();
            if (ch &lt; 0)
            throw new EOFException();
            return (byte)(ch);
            }
            public native int read() throws IOException;
            public final void writeByte(int v) throws IOException {
            write(v);
            }
            public native void write(int b) throws IOException;
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>可见，RandomAccessFile每读/写一个字节就需对磁盘进行一次I/O操作。</p>
<p><strong>1．2．[BufferedInputStream]</strong> </p>
<p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>public class BufferedInputStream extends FilterInputStream {
            private static int defaultBufferSize = 2048;
            protected byte buf[]; // 建立读缓存区
            public BufferedInputStream(InputStream in, int size) {
            super(in);
            if (size &lt;= 0) {
            throw new IllegalArgumentException("Buffer size &lt;= 0");
            }
            buf = new byte[size];
            }
            public synchronized int read() throws IOException {
            ensureOpen();
            if (pos &gt;= count) {
            fill();
            if (pos &gt;= count)
            return -1;
            }
            return buf[pos++] &amp; 0xff; // 直接从BUF[]中读取
            }
            private void fill() throws IOException {
            if (markpos &lt; 0)
            pos = 0;  /* no mark: throw away the buffer */
            else if (pos &gt;= buf.length) /* no room left in buffer */
            if (markpos &gt; 0) { /* can throw away early part of the buffer */
            int sz = pos - markpos;
            System.arraycopy(buf, markpos, buf, 0, sz);
            pos = sz;
            markpos = 0;
            } else if (buf.length &gt;= marklimit) {
            markpos = -1; /* buffer got too big, invalidate mark */
            pos = 0; /* drop buffer contents */
            } else {  /* grow buffer */
            int nsz = pos * 2;
            if (nsz &gt; marklimit)
            nsz = marklimit;
            byte nbuf[] = new byte[nsz];
            System.arraycopy(buf, 0, nbuf, 0, pos);
            buf = nbuf;
            }
            count = pos;
            int n = in.read(buf, pos, buf.length - pos);
            if (n &gt; 0)
            count = n + pos;
            }
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br><strong>1．3．[BufferedOutputStream]</strong> </p>
<p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>public class BufferedOutputStream extends FilterOutputStream {
            protected byte buf[]; // 建立写缓存区
            public BufferedOutputStream(OutputStream out, int size) {
            super(out);
            if (size &lt;= 0) {
            throw new IllegalArgumentException("Buffer size &lt;= 0");
            }
            buf = new byte[size];
            }
            public synchronized void write(int b) throws IOException {
            if (count &gt;= buf.length) {
            flushBuffer();
            }
            buf[count++] = (byte)b; // 直接从BUF[]中读取
            }
            private void flushBuffer() throws IOException {
            if (count &gt; 0) {
            out.write(buf, 0, count);
            count = 0;
            }
            }
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>可见，Buffered I/O putStream每读/写一个字节，若要操作的数据在BUF中，就直接对内存的buf[]进行读/写操作；否则从磁盘相应位置填充buf[]，再直接对内存的buf[]进行读/写操作，绝大部分的读/写操作是对内存buf[]的操作。</p>
<p><strong>1．3．小结</strong> </p>
<p>内存存取时间单位是纳秒级（10E-9），磁盘存取时间单位是毫秒级（10E-3），同样操作一次的开销，内存比磁盘快了百万倍。理论上可以预见，即使对内存操作上万次，花费的时间也远少对于磁盘一次I/O的开销。显然后者是通过增加位于内存的BUF存取，减少磁盘I/O的开销，提高存取效率的，当然这样也增加了BUF控制部分的开销。从实际应用来看，存取效率提高了32倍。<br></p>
<p><a name=2><span class=atitle>根据1.3得出的结论，现试着对RandomAccessFile类也加上缓冲读写机制。</span></a></p>
<p>
<p>随机访问类与顺序类不同，前者是通过实现DataInput/DataOutput接口创建的，而后者是扩展FilterInputStream/FilterOutputStream创建的，不能直接照搬。</p>
<p><strong>2．1．开辟缓冲区BUF[默认：1024字节]，用作读/写的共用缓冲区。</strong> </p>
<p><strong>2．2．先实现读缓冲。</strong> </p>
<p>读缓冲逻辑的基本原理：</p>
<p>A 欲读文件POS位置的一个字节。</p>
<p>B 查BUF中是否存在？若有，直接从BUF中读取，并返回该字符BYTE。</p>
<p>C 若没有，则BUF重新定位到该POS所在的位置并把该位置附近的BUFSIZE的字节的文件内容填充BUFFER，返回B。</p>
<p>以下给出关键部分代码及其说明：</p>
<p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>public class BufferedRandomAccessFile extends RandomAccessFile {
            //  byte read(long pos)：读取当前文件POS位置所在的字节
            //  bufstartpos、bufendpos代表BUF映射在当前文件的首/尾偏移地址。
            //  curpos指当前类文件指针的偏移地址。
            public byte read(long pos) throws IOException {
            if (pos &lt; this.bufstartpos || pos &gt; this.bufendpos ) {
            this.flushbuf();
            this.seek(pos);
            if ((pos &lt; this.bufstartpos) || (pos &gt; this.bufendpos))
            throw new IOException();
            }
            this.curpos = pos;
            return this.buf[(int)(pos - this.bufstartpos)];
            }
            // void flushbuf()：bufdirty为真，把buf[]中尚未写入磁盘的数据，写入磁盘。
            private void flushbuf() throws IOException {
            if (this.bufdirty == true) {
            if (super.getFilePointer() != this.bufstartpos) {
            super.seek(this.bufstartpos);
            }
            super.write(this.buf, 0, this.bufusedsize);
            this.bufdirty = false;
            }
            }
            // void seek(long pos)：移动文件指针到pos位置，并把buf[]映射填充至POS
            所在的文件块。
            public void seek(long pos) throws IOException {
            if ((pos &lt; this.bufstartpos) || (pos &gt; this.bufendpos)) { // seek pos not in buf
            this.flushbuf();
            if ((pos &gt;= 0) &amp;&amp; (pos &lt;= this.fileendpos) &amp;&amp; (this.fileendpos != 0))
            {   // seek pos in file (file length &gt; 0)
            this.bufstartpos =  pos * bufbitlen / bufbitlen;
            this.bufusedsize = this.fillbuf();
            } else if (((pos == 0) &amp;&amp; (this.fileendpos == 0))
            || (pos == this.fileendpos + 1))
            {   // seek pos is append pos
            this.bufstartpos = pos;
            this.bufusedsize = 0;
            }
            this.bufendpos = this.bufstartpos + this.bufsize - 1;
            }
            this.curpos = pos;
            }
            // int fillbuf()：根据bufstartpos，填充buf[]。
            private int fillbuf() throws IOException {
            super.seek(this.bufstartpos);
            this.bufdirty = false;
            return super.read(this.buf);
            }
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>至此缓冲读基本实现，逐字节COPY一个12兆的文件（这里牵涉到读和写，用BufferedRandomAccessFile试一下读的速度）：</p>
<p>
<table width="70%" border=1>
    <tbody>
        <tr>
            <td>读</td>
            <td>写</td>
            <td>耗用时间（秒）</td>
        </tr>
        <tr>
            <td>RandomAccessFile</td>
            <td>RandomAccessFile</td>
            <td>95.848</td>
        </tr>
        <tr>
            <td>BufferedRandomAccessFile</td>
            <td>BufferedOutputStream + DataOutputStream</td>
            <td>2.813</td>
        </tr>
        <tr>
            <td>BufferedInputStream + DataInputStream</td>
            <td>BufferedOutputStream + DataOutputStream</td>
            <td>2.935</td>
        </tr>
    </tbody>
</table>
</p>
<p>可见速度显著提高，与BufferedInputStream+DataInputStream不相上下。</p>
<p><strong>2．3．实现写缓冲。</strong> </p>
<p>写缓冲逻辑的基本原理：</p>
<p>A欲写文件POS位置的一个字节。</p>
<p>B 查BUF中是否有该映射？若有，直接向BUF中写入，并返回true。</p>
<p>C若没有，则BUF重新定位到该POS所在的位置，并把该位置附近的 BUFSIZE字节的文件内容填充BUFFER，返回B。</p>
<p>下面给出关键部分代码及其说明：</p>
<p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>// boolean write(byte bw, long pos)：向当前文件POS位置写入字节BW。
            // 根据POS的不同及BUF的位置：存在修改、追加、BUF中、BUF外等情
            况。在逻辑判断时，把最可能出现的情况，最先判断，这样可提高速度。
            // fileendpos：指示当前文件的尾偏移地址，主要考虑到追加因素
            public boolean write(byte bw, long pos) throws IOException {
            if ((pos &gt;= this.bufstartpos) &amp;&amp; (pos &lt;= this.bufendpos)) {
            // write pos in buf
            this.buf[(int)(pos - this.bufstartpos)] = bw;
            this.bufdirty = true;
            if (pos == this.fileendpos + 1) { // write pos is append pos
            this.fileendpos++;
            this.bufusedsize++;
            }
            } else { // write pos not in buf
            this.seek(pos);
            if ((pos &gt;= 0) &amp;&amp; (pos &lt;= this.fileendpos) &amp;&amp; (this.fileendpos != 0))
            { // write pos is modify file
            this.buf[(int)(pos - this.bufstartpos)] = bw;
            } else if (((pos == 0) &amp;&amp; (this.fileendpos == 0))
            || (pos == this.fileendpos + 1)) { // write pos is append pos
            this.buf[0] = bw;
            this.fileendpos++;
            this.bufusedsize = 1;
            } else {
            throw new IndexOutOfBoundsException();
            }
            this.bufdirty = true;
            }
            this.curpos = pos;
            return true;
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p>至此缓冲写基本实现，逐字节COPY一个12兆的文件，（这里牵涉到读和写，结合缓冲读，用BufferedRandomAccessFile试一下读/写的速度）：</p>
<p>
<table width="60%" border=1>
    <tbody>
        <tr>
            <td>读</td>
            <td>写</td>
            <td>耗用时间（秒）</td>
        </tr>
        <tr>
            <td>RandomAccessFile</td>
            <td>RandomAccessFile</td>
            <td>95.848</td>
        </tr>
        <tr>
            <td>BufferedInputStream + DataInputStream</td>
            <td>BufferedOutputStream + DataOutputStream</td>
            <td>2.935</td>
        </tr>
        <tr>
            <td>BufferedRandomAccessFile</td>
            <td>BufferedOutputStream + DataOutputStream</td>
            <td>2.813</td>
        </tr>
        <tr>
            <td>BufferedRandomAccessFile</td>
            <td>BufferedRandomAccessFile</td>
            <td>2.453</td>
        </tr>
    </tbody>
</table>
</p>
<p>可见综合读/写速度已超越BufferedInput/OutputStream+DataInput/OutputStream。</p>
<p><a name=3><span class=atitle>优化BufferedRandomAccessFile。</span></a></p>
<p>
<p>优化原则：</p>
<ul>
    <li>调用频繁的语句最需要优化，且优化的效果最明显。
    <li>多重嵌套逻辑判断时，最可能出现的判断，应放在最外层。
    <li>减少不必要的NEW。 </li>
</ul>
<p>这里举一典型的例子：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>   public void seek(long pos) throws IOException {
            ...
            this.bufstartpos =  pos * bufbitlen / bufbitlen;
            // bufbitlen指buf[]的位长，例：若bufsize=1024，则bufbitlen=10。
            ...
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>seek函数使用在各函数中，调用非常频繁，上面加重的这行语句根据pos和bufsize确定buf[]对应当前文件的映射位置，用"*"、"/"确定，显然不是一个好方法。</p>
<p>优化一：this.bufstartpos = (pos &lt;&lt; bufbitlen) &gt;&gt; bufbitlen;</p>
<p>优化二：this.bufstartpos = pos &amp; bufmask; // this.bufmask = ~((long)this.bufsize - 1);</p>
<p>两者效率都比原来好，但后者显然更好，因为前者需要两次移位运算、后者只需一次逻辑与运算（bufmask可以预先得出）。</p>
<p>至此优化基本实现，逐字节COPY一个12兆的文件，（这里牵涉到读和写，结合缓冲读，用优化后BufferedRandomAccessFile试一下读/写的速度）：</p>
<table width="60%" border=1>
    <tbody>
        <tr>
            <td>读</td>
            <td>写</td>
            <td>耗用时间（秒）</td>
        </tr>
        <tr>
            <td>RandomAccessFile</td>
            <td>RandomAccessFile</td>
            <td>95.848</td>
        </tr>
        <tr>
            <td>BufferedInputStream + DataInputStream </td>
            <td>BufferedOutputStream + DataOutputStream</td>
            <td>2.935</td>
        </tr>
        <tr>
            <td>BufferedRandomAccessFile</td>
            <td>BufferedOutputStream + DataOutputStream</td>
            <td>2.813</td>
        </tr>
        <tr>
            <td>BufferedRandomAccessFile</td>
            <td>BufferedRandomAccessFile</td>
            <td>2.453</td>
        </tr>
        <tr>
            <td>BufferedRandomAccessFile优</td>
            <td>BufferedRandomAccessFile优</td>
            <td>2.197</td>
        </tr>
    </tbody>
</table>
<p>可见优化尽管不明显，还是比未优化前快了一些，也许这种效果在老式机上会更明显。</p>
<p>以上比较的是顺序存取，即使是随机存取，在绝大多数情况下也不止一个BYTE，所以缓冲机制依然有效。而一般的顺序存取类要实现随机存取就不怎么容易了。</p>
<p><a name=4><span class=atitle>需要完善的地方</span></a></p>
<p>
<p>提供文件追加功能：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>    public boolean append(byte bw) throws IOException {
            return this.write(bw, this.fileendpos + 1);
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>提供文件当前位置修改功能：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>    public boolean write(byte bw) throws IOException {
            return this.write(bw, this.curpos);
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>返回文件长度（由于BUF读写的原因，与原来的RandomAccessFile类有所不同）：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>    public long length() throws IOException {
            return this.max(this.fileendpos + 1, this.initfilelen);
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>返回文件当前指针（由于是通过BUF读写的原因，与原来的RandomAccessFile类有所不同）：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>    public long getFilePointer() throws IOException {
            return this.curpos;
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>提供对当前位置的多个字节的缓冲写功能：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>    public void write(byte b[], int off, int len) throws IOException {
            long writeendpos = this.curpos + len - 1;
            if (writeendpos &lt;= this.bufendpos) { // b[] in cur buf
            System.arraycopy(b, off, this.buf, (int)(this.curpos - this.bufstartpos),
            len);
            this.bufdirty = true;
            this.bufusedsize = (int)(writeendpos - this.bufstartpos + 1);
            } else { // b[] not in cur buf
            super.seek(this.curpos);
            super.write(b, off, len);
            }
            if (writeendpos &gt; this.fileendpos)
            this.fileendpos = writeendpos;
            this.seek(writeendpos+1);
            }
            public void write(byte b[]) throws IOException {
            this.write(b, 0, b.length);
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>提供对当前位置的多个字节的缓冲读功能：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>public int read(byte b[], int off, int len) throws IOException {
            long readendpos = this.curpos + len - 1;
            if (readendpos &lt;= this.bufendpos &amp;&amp; readendpos &lt;= this.fileendpos ) {
            // read in buf
            System.arraycopy(this.buf, (int)(this.curpos - this.bufstartpos),
            b, off, len);
            } else { // read b[] size &gt; buf[]
            if (readendpos &gt; this.fileendpos) { // read b[] part in file
            len = (int)(this.length() - this.curpos + 1);
            }
            super.seek(this.curpos);
            len = super.read(b, off, len);
            readendpos = this.curpos + len - 1;
            }
            this.seek(readendpos + 1);
            return len;
            }
            public int read(byte b[]) throws IOException {
            return this.read(b, 0, b.length);
            }
            public void setLength(long newLength) throws IOException {
            if (newLength &gt; 0) {
            this.fileendpos = newLength - 1;
            } else {
            this.fileendpos = 0;
            }
            super.setLength(newLength);
            }
            public void close() throws IOException {
            this.flushbuf();
            super.close();
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>至此完善工作基本完成，试一下新增的多字节读/写功能，通过同时读/写1024个字节，来COPY一个12兆的文件，（这里牵涉到读和写，用完善后BufferedRandomAccessFile试一下读/写的速度）：</p>
<table width="70%" border=1>
    <tbody>
        <tr>
            <td>读</td>
            <td>写</td>
            <td>耗用时间（秒）</td>
        </tr>
        <tr>
            <td>RandomAccessFile</td>
            <td>RandomAccessFile</td>
            <td>95.848</td>
        </tr>
        <tr>
            <td>BufferedInputStream + DataInputStream</td>
            <td>BufferedOutputStream + DataOutputStream</td>
            <td>2.935</td>
        </tr>
        <tr>
            <td>BufferedRandomAccessFile</td>
            <td>BufferedOutputStream + DataOutputStream</td>
            <td>2.813</td>
        </tr>
        <tr>
            <td>BufferedRandomAccessFile</td>
            <td>BufferedRandomAccessFile</td>
            <td>2.453</td>
        </tr>
        <tr>
            <td>BufferedRandomAccessFile优</td>
            <td>BufferedRandomAccessFile优</td>
            <td>2.197</td>
        </tr>
        <tr>
            <td>BufferedRandomAccessFile完</td>
            <td>BufferedRandomAccessFile完</td>
            <td>0.401</td>
        </tr>
    </tbody>
</table>
<p><a name=5><span class=atitle>与JDK1.4类MappedByteBuffer+RandomAccessFile的对比？</span></a></p>
<p>
<p>JDK1.4提供了NIO类 ，其中MappedByteBuffer类用于映射缓冲，也可以映射随机文件访问，可见JAVA设计者也看到了RandomAccessFile的问题，并加以改进。怎么通过MappedByteBuffer+RandomAccessFile拷贝文件呢？下面就是测试程序的主要部分：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>RandomAccessFile rafi = new RandomAccessFile(SrcFile, "r");
            RandomAccessFile rafo = new RandomAccessFile(DesFile, "rw");
            FileChannel fci = rafi.getChannel();
            FileChannel fco = rafo.getChannel();
            long size = fci.size();
            MappedByteBuffer mbbi = fci.map(FileChannel.MapMode.READ_ONLY, 0, size);
            MappedByteBuffer mbbo = fco.map(FileChannel.MapMode.READ_WRITE, 0, size);
            long start = System.currentTimeMillis();
            for (int i = 0; i &lt; size; i++) {
            byte b = mbbi.get(i);
            mbbo.put(i, b);
            }
            fcin.close();
            fcout.close();
            rafi.close();
            rafo.close();
            System.out.println("Spend: "+(double)(System.currentTimeMillis()-start) / 1000 + "s");
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<p>试一下JDK1.4的映射缓冲读/写功能，逐字节COPY一个12兆的文件，（这里牵涉到读和写）：</p>
<table width="60%" border=1>
    <tbody>
        <tr>
            <td>读</td>
            <td>写</td>
            <td>耗用时间（秒）</td>
        </tr>
        <tr>
            <td>RandomAccessFile</td>
            <td>RandomAccessFile</td>
            <td>95.848</td>
        </tr>
        <tr>
            <td>BufferedInputStream + DataInputStream</td>
            <td>BufferedOutputStream + DataOutputStream</td>
            <td>2.935</td>
        </tr>
        <tr>
            <td>BufferedRandomAccessFile</td>
            <td>BufferedOutputStream + DataOutputStream</td>
            <td>2.813</td>
        </tr>
        <tr>
            <td>BufferedRandomAccessFile</td>
            <td>BufferedRandomAccessFile</td>
            <td>2.453</td>
        </tr>
        <tr>
            <td>BufferedRandomAccessFile优</td>
            <td>BufferedRandomAccessFile优</td>
            <td>2.197</td>
        </tr>
        <tr>
            <td>BufferedRandomAccessFile完</td>
            <td>BufferedRandomAccessFile完</td>
            <td>0.401</td>
        </tr>
        <tr>
            <td>MappedByteBuffer+ RandomAccessFile</td>
            <td>MappedByteBuffer+ RandomAccessFile</td>
            <td>1.209</td>
        </tr>
    </tbody>
</table>
<p>确实不错，如果以后采用1.4版本开发软件时，需要对文件进行随机访问，建议采用MappedByteBuffer+RandomAccessFile的方式。但鉴于目前采用JDK1.3及以前的版本开发的程序占绝大多数的实际情况，如果您开发的JAVA程序使用了RandomAccessFile类来随机访问文件，并因其性能不佳，而担心遭用户诟病，请试用本文所提供的BufferedRandomAccessFile类，不必推翻重写，只需IMPORT 本类，把所有的RandomAccessFile改为BufferedRandomAccessFile，您的程序的性能将得到极大的提升，您所要做的就这么简单。</p>
<p><a name=6><span class=atitle>未来的考虑</span></a></p>
<p>
<p>读者可在此基础上建立多页缓存及缓存淘汰机制，以应付对随机访问强度大的应用。</p>
（完整代码见下篇）
<br>
<script type="text/javascript"><!--
google_ad_client = "pub-4399204441904216";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "image";
//2007-07-24: http://romkk.j5com.cn/blog
google_ad_channel = "8013984535";
google_color_border = "F7F7F7";
google_color_bg = "F7F7F7";
google_color_link = "0000FF";
google_color_text = "000000";
google_color_url = "008000";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script> <img src ="http://www.blogjava.net/RomKK/aggbug/132202.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RomKK/" target="_blank">RomKK</a> 2007-07-25 09:32 <a href="http://www.blogjava.net/RomKK/archive/2007/07/25/132202.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个程序员的成长的六个阶段</title><link>http://www.blogjava.net/RomKK/archive/2007/07/24/132155.html</link><dc:creator>RomKK</dc:creator><author>RomKK</author><pubDate>Tue, 24 Jul 2007 14:22:00 GMT</pubDate><guid>http://www.blogjava.net/RomKK/archive/2007/07/24/132155.html</guid><wfw:comment>http://www.blogjava.net/RomKK/comments/132155.html</wfw:comment><comments>http://www.blogjava.net/RomKK/archive/2007/07/24/132155.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RomKK/comments/commentRss/132155.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RomKK/services/trackbacks/132155.html</trackback:ping><description><![CDATA[<script type="text/javascript"><!--
google_ad_client = "pub-4399204441904216";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text";
//2007-07-24: http://romkk.j5com.cn/blog
google_ad_channel = "8013984535";
google_color_border = "F7F7F7";
google_color_bg = "F7F7F7";
google_color_link = "0000FF";
google_color_text = "000000";
google_color_url = "008000";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</br><strong>第一阶段</strong><br>此阶段主要是能熟练地使用某种语言。这就相当于练武中的套路和架式这些表面的东西。<br><strong>第二阶段<br></strong>此阶段能精通基于某种平台的接口（例如我们现在常用的Win 32的API函数）以及所对应语言的自身的库函数。到达这个阶段后，也就相当于可以进行真实散打对练了，可以真正地在实践中做些应用。<br><strong>第三阶段</strong><br>此阶段能深入地了解某个平台系统的底层，已经具有了初级的内功的能力，也就是&#8220;手中有剑，心中无剑&#8221;。<br><strong>第四阶级<br></strong>此阶段能直接在平台上进行比较深层次的开发。基本上，能达到这个层次就可以说是进入了高层次。这时进入了高级内功的修炼。比如能进行VxD或操作系统的内核的修改。<br>这时已经不再有语言的束缚，语言只是一种工具，即使要用自己不会的语言进行开发，也只是简单地熟悉一下，就手到擒来，完全不像是第一阶段的时候学习语言的那种情况。一般来说，从第三阶段过渡到第四阶段是比较困难的。为什么会难呢？这就是因为很多人的思想变不过来。<br><strong>第五阶级<br></strong>此阶段就已经不再局限于简单的技术上的问题了，而是能从全局上把握和设计一个比较大的系统体系结构，从内核到外层界面。可以说是&#8220;手中无剑，心中有剑&#8221;。到了这个阶段以后，能对市面上的任何软件进行剖析，并能按自己的要求进行设计，就算是MS Word这样的大型软件，只要有充足的时间，也一定会设计出来。<br><strong>第六阶级<br></strong>此阶段也是最高的境界，达到&#8220;无招胜有招&#8221;。这时候，任何问题就纯粹变成了一个思路的问题，不是用什么代码就能表示的。也就是&#8220;手中无剑，心中也无剑&#8221;。<br>此时，对于练功的人来说，他已不用再去学什么少林拳，只是在旁看一下少林拳的对战，就能把此拳拿来就用。这就是真正的大师级的人物。这时，Win 32或Linux在你眼里是没有什么差别的。<br>每一个阶段再向上发展时都要按一定的方法。第一、第二个阶段通过自学就可以完成，只要多用心去研究，耐心地去学习。<br>要想从第二个阶段过渡到第三个阶段，就要有一个好的学习环境。例如有一个高手带领或公司里有一个好的练手环境。经过二、三年的积累就能达到第三个阶段。但是，有些人到达第三个阶段后，常常就很难有境界上的突破了。他们这时会产生一种观念，认为软件无非如此，认为自己已无所不能。其实，这时如果遇到大的或难些的软件，他们往往还是无从下手。<br>现在我们国家大部分程序员都是在第二、三级之间。他们大多都是通过自学成才的，不过这样的程序员一般在软件公司也能独当一面，完成一些软件的模块。<br>但是，也还有一大堆处在第一阶段的程序员，他们一般就能玩玩VB，做程序时，去找一堆控件集成一个软件.<br></br>
<script type="text/javascript"><!--
google_ad_client = "pub-4399204441904216";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "image";
//2007-07-24: http://romkk.j5com.cn/blog
google_ad_channel = "8013984535";
google_color_border = "F7F7F7";
google_color_bg = "F7F7F7";
google_color_link = "0000FF";
google_color_text = "000000";
google_color_url = "008000";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>

 <img src ="http://www.blogjava.net/RomKK/aggbug/132155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RomKK/" target="_blank">RomKK</a> 2007-07-24 22:22 <a href="http://www.blogjava.net/RomKK/archive/2007/07/24/132155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微软好员工的十个标准</title><link>http://www.blogjava.net/RomKK/archive/2007/07/24/132154.html</link><dc:creator>RomKK</dc:creator><author>RomKK</author><pubDate>Tue, 24 Jul 2007 14:21:00 GMT</pubDate><guid>http://www.blogjava.net/RomKK/archive/2007/07/24/132154.html</guid><wfw:comment>http://www.blogjava.net/RomKK/comments/132154.html</wfw:comment><comments>http://www.blogjava.net/RomKK/archive/2007/07/24/132154.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RomKK/comments/commentRss/132154.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RomKK/services/trackbacks/132154.html</trackback:ping><description><![CDATA[<script type="text/javascript"><!--
google_ad_client = "pub-4399204441904216";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text";
//2007-07-24: http://romkk.j5com.cn/blog
google_ad_channel = "8013984535";
google_color_border = "F7F7F7";
google_color_bg = "F7F7F7";
google_color_link = "0000FF";
google_color_text = "000000";
google_color_url = "008000";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</br><strong>1、对自己所在公司或部门的产品具有起码的好奇心是极为重要的一点。你必须亲自使用该产品。对于身处计算机行业的人来说,这一点怎么强调都不为过。当然，这一点同样适用于其他知识密集型领域，因为在这些领域内技术与应用发展更新极快，对其技术的掌握很难做到一劳永逸。如果你对这些产品没什么兴趣，你将很快落伍，并被淘汰出局。<br>&nbsp;<br>2、在与客户交谈如何使用产品时，需要以极大的兴趣和传道士般的热情和执着打动客户，了解他们欣赏什么，不喜欢什么。同时必须清醒地知道本公司的产品有哪些不足，或哪里可以改进。<br>&nbsp;&nbsp;<br>3、了解了客户的需求后，必须乐于思考如何让产品更贴近并帮助客户。<br>&nbsp;<br>4、作为一个独立的员工，必须与公司制定的长期计划保持步调一致。员工需要关注其终身的努力方向，如提高自身及同事的能力。<br>&nbsp;&nbsp;<br>5、在对于周遭事物具有高度洞察力的同时，必须掌握某种专业知识和技能。特别是一些大公司，他们要求员工迅速掌握专业技术。没有人能保证他目前拥有的技能仍适用于将来的工作，所以，好学精神是非常关键的。<br>&nbsp;&nbsp;<br>6、非常灵活地利用那些有利于发展的机会。在微软，我们通过一系列方法为每一个人提供许多不同的工作机会。任何热衷参与微软管理的员工，都将被鼓励在不同客户服务部门工作。<br>&nbsp;&nbsp;<br>7、一个好的员工会尽量去学习了解公司业务运作的经济原理，为什么公司的业务会这样运作？公司的业务模式是什么？如何才能盈利？员工必须了解导致本行业中企业盈利或亏损的原因，才能对自己所从事的工作的价值有更深入的理解。<br>&nbsp;&nbsp;<br>8、关注竞争对手的动态。我非常欣赏那些随时注意整个市场动态的员工，他们会分析我们的竞争对手的可借鉴之处，并注意总结，避免重返竞争对手的错误。<br>&nbsp;&nbsp;<br>9、好的员工善于动脑子。分析问题，但并不局限于分析。他们知道如何寻找潜在的平衡点，如何寻找最佳的行动时机。思考还要与实践相结合。好的员工会合理、高效地利用时间，并会为其他部门清楚地提出建议。<br>&nbsp;<br>10、不要忽略了一些必须具备的美德，如诚实、有道德和刻苦，这些都是很重要的，在此无需赘言。</strong></br>
<script type="text/javascript"><!--
google_ad_client = "pub-4399204441904216";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "image";
//2007-07-24: http://romkk.j5com.cn/blog
google_ad_channel = "8013984535";
google_color_border = "F7F7F7";
google_color_bg = "F7F7F7";
google_color_link = "0000FF";
google_color_text = "000000";
google_color_url = "008000";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>

 <img src ="http://www.blogjava.net/RomKK/aggbug/132154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RomKK/" target="_blank">RomKK</a> 2007-07-24 22:21 <a href="http://www.blogjava.net/RomKK/archive/2007/07/24/132154.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>myeclipse5.5GA版的注册码</title><link>http://www.blogjava.net/RomKK/archive/2007/07/24/131972.html</link><dc:creator>RomKK</dc:creator><author>RomKK</author><pubDate>Tue, 24 Jul 2007 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/RomKK/archive/2007/07/24/131972.html</guid><wfw:comment>http://www.blogjava.net/RomKK/comments/131972.html</wfw:comment><comments>http://www.blogjava.net/RomKK/archive/2007/07/24/131972.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/RomKK/comments/commentRss/131972.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/RomKK/services/trackbacks/131972.html</trackback:ping><description><![CDATA[<script type="text/javascript"><!--
google_ad_client = "pub-4399204441904216";
google_ad_width = 728;
google_ad_height = 15;
google_ad_format = "728x15_0ads_al_s";
//2007-07-24: http://romkk.j5com.cn/blog
google_ad_channel = "8013984535";
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><p><br>新免覆盖注册<br>更新说明：不使用覆盖安装法，直接输入注册码即可。<br><br>下面把 5.5 GA 版本的&#8220;注册信息&#8221;&#8220;注册码&#8221;&#8220;破解&#8221;给大家：<br>Subscriber: <a href="http://www.1cn.biz/" target=_blank><font face=Tahoma color=#2f5fa1>www.1cn.biz</font></a><br>Subscriber Code: jLR7ZL-655355-5450755330522962<br><br>时间:20090520</p>
<!-- Begin #sidebar -->
<div id=sidebar>
<div id=sidebar2><script type="text/javascript"><!--
google_ad_client = "pub-4399204441904216";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text";
//2007-07-23: http://romkk.j5com.cn/blog
google_ad_channel = "8013984535";
//-->
</script><script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div>
</div> <img src ="http://www.blogjava.net/RomKK/aggbug/131972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/RomKK/" target="_blank">RomKK</a> 2007-07-24 09:54 <a href="http://www.blogjava.net/RomKK/archive/2007/07/24/131972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>