<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>林秋枫</title>
    <description>行到山穷处，坐看云起时</description>
    <link>http://b-qiufeng.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
          <item>
        <title>Re: Java开源框架发展的遐想</title>
        <author>林秋枫</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://b-qiufeng.javaeye.com">林秋枫</a>&nbsp;
                    链接：<a href="http://b-qiufeng.javaeye.com/blog/82947" style="color:red;">http://b-qiufeng.javaeye.com/blog/82947</a>&nbsp;
          发表时间: 2007年05月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          [quote=&quot;robbin&quot;]上周末在杭州网侠大会做演讲的时候，我说：Java开源框架的革命浪潮已经结束了，未来几年，将是Java语言级别的革命。说实话，自从03年Hibernate火爆，04年spring流行之后，Java开源领域实在太缺乏亮点了。但是，Java的主流开源框架真的一点改进的余地都没有了吗？ 先来说说Hibernate吧。Hibernate确实功能强悍，但是Hibernate不够易用，而且有一些明显的缺陷：one-to-one必须通过bytecode enhancement才能lazy loading；不支持多态关联；怪异的inverse配置和维护；DetachedCriteria有明显的bug；many-to-one的eager fetch设置不够灵活，让Hibernate的使用者真是又爱又恨，使用起来战战兢兢，如履薄冰阿。Gavin King同学是个很刚愎的人，他似乎从来不觉得这些问题是问题，而且他已经把自己的主要精力放到JBoss Seam产品上面去了，也许我们只好继续忍受了。那么JPA呢？JPA标准就像是Hibernate模子里面刻出来的一样。但是为什么人们总是在忍受Hibernate缺陷的同时，却没有去努力改进这些问题呢？ 我想，问题的关键在于一些缺陷的改进需要对Hibernate整个源代码架构进行伤筋动骨的改动，但是对于Hiberante今天所取得的垄断地位来说，显然Hibernate的开发者们已经缺乏足够改进的勇气和魄力了。 Springframework，简直如日中天，定义了轻量级Java企业应用开发的事实标准。但是spring真的很完美吗？我们已经听到太多对于spring的xml bean配置文件的抱怨。也许配置文件不是太大的问题，spring已经开始尝试引入annotation。但是spring的致命问题是无法方便的对动态创建的bean进行依赖注入。Google Guice的出现让我们看到了其实prototype的bean和动态创建的bean其实也可以很容易的管理。spring自身的缺陷事实上造成了很难进行rich domain model架构的实现。 Rod Johnson创办的interface21公司专职从事spring的咨询，最近已经得到了1000万美元的风险投资，是没有足够的资源去改进spring吗？当然不是。是因为spring今天所取得的垄断地位使得spring的开发者们没用足够的勇气去推翻spring现在的架构，进行重大的改进。 Java的Web框架领域这两年非常令人失望：Tapestry在升级的过程中不断的迷失自己，丧失用户；webwork和struts合并了两年了，结果只搞出来一个完全webwork版本的struts2.0.6，毫无改进；JSF叫嚣的厉害，却没有前途；wicket叫好却不叫座；当年令人眼前一亮的stripes两年来一直小修小补。 web框架没有改进余地了吗？其实我们稍微想一下，就发现web框架大有改进余地。例如以struts2.0为例，完全可以仿照RoR，大量使用annotation和CoC，完全消除action的配置文件，完全消除validations配置文件，但是struts2.0叫嚣了两年的Zero Configuration，却干打雷不下雨。 是的，struts2.0有一个叫做restful的actionmapping，但只是徒有其表。我们想一下，只需要稍微修改一下struts2.0的URL Mapping机制，扩展一下FilterDispatcher，再扩展几个URL的JSP Tag，让Struts2.0完全支持REST架构风格，完全不是什么难事。为什么struts2.0两年以来毫无动静？实在让人无法理解。 所以Java社区其实有很多事情可以做，而且难度也未必很大，但很奇怪的是，为什么社区显得如此沉寂呢？没有创新性的产品出来呢？我也想不明白。 [/quote] 其实楼主最后的疑问自己已经部分回答了。 java开源框架担心在升级的过程中不断的迷失自己，丧失用户。 以Tapestry为例，实际上Tapestry并不是迷失自己。Tapestry5是个跨越性的发展，其作者想用质变的方式做一个优异的开源框架。但不幸的是因为跨越的幅度太大了，所以丧失了用户。很显然hibernate和spring很清楚这种后果，所以不敢对框架做大的改动。 用哲学的道理来看很清楚。量变的发展而导致质变。质变的结果是产生新事物。旧事务必定会对新事物的发展起阻碍作用。但新事物必定会产生，旧事物必定会被抛弃。 所以，再过一年或者两年，spring和hibernate必定会被抛弃。即使保留下来，也只是类似sturts2.0那样的品牌名字而已。
          <br/><br/>
          <span style="color:red;">
            <a href="http://b-qiufeng.javaeye.com/blog/82947#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 25 May 2007 11:14:37 +0800</pubDate>
        <link>http://b-qiufeng.javaeye.com/blog/82947</link>
        <guid>http://b-qiufeng.javaeye.com/blog/82947</guid>
      </item>
          <item>
        <title>Re: 对五笔的炒作</title>
        <author>林秋枫</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://b-qiufeng.javaeye.com">林秋枫</a>&nbsp;
                    链接：<a href="http://b-qiufeng.javaeye.com/blog/82919" style="color:red;">http://b-qiufeng.javaeye.com/blog/82919</a>&nbsp;
          发表时间: 2007年05月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          记得最开始的时候微软想把五笔加入倒windows自带的输入法中，给王永民的专利费用是没出售一套中文windows是10美元。没想倒王永民竟然狮子大开口，要价100美元。微软当然不干了。当时就觉得王永民这个家伙是刚刚从火星回来，而且贪得无厌。 所以觉得什么行业的东西宁可让美国人垄断，也不要让中国的资本家垄断。因为美国早过了垄断资本的时代了，美国对垄断资本有法律制约。中国的资本还处于血腥的掠夺积累阶段，什么东西一占领市场就要把用户的口袋榨光。赤裸裸的掠夺。 当初免费邮箱收费是一个例子。幸亏竞争多。象263这样的垃圾终于有了给淘汰的下场。我当初一直都用263邮箱，一收费马上换163的邮箱。 看看其他行业，比如数字电视。一个叫什么天盛的公司收购了英超的大陆的播放权之后，就要对用户收取每个月188元的费用。真是疯狂了。
          <br/><br/>
          <span style="color:red;">
            <a href="http://b-qiufeng.javaeye.com/blog/82919#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 25 May 2007 10:24:50 +0800</pubDate>
        <link>http://b-qiufeng.javaeye.com/blog/82919</link>
        <guid>http://b-qiufeng.javaeye.com/blog/82919</guid>
      </item>
          <item>
        <title>多核时代已经来临了，ruby还能热下去吗？</title>
        <author>林秋枫</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://b-qiufeng.javaeye.com">林秋枫</a>&nbsp;
                    链接：<a href="http://b-qiufeng.javaeye.com/blog/81860" style="color:red;">http://b-qiufeng.javaeye.com/blog/81860</a>&nbsp;
          发表时间: 2007年05月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">多核时代已经来临了，ruby还能热下去吗？</font></p>
<p><font face="Arial">关注ruby很久了。看过很多对ruby的赞美之词。可是心里还是抱有很多疑虑的。<br />
最近了解了一下相关了资料，竟然发现ruby不支持多线程，只支持伪线程（不是真正的多线程）。<br />
不支持多线程必定会使ruby的应用受到很大的局限，比如：<br />
1.不能应用在嵌入式系统中；<br />
2.不能应用在桌面系统中；<br />
3.不适合做海量访问的web系统；</font></p>
<p><font face="Arial">真是因为这样，ruby也许只能局限于web编程方面。即使在这方面，功能复杂的企业应用系统和海量访问的大型网站也无法应用。<br />
无法支持多线程，只能通过多进程的方式处理并发的连接。而进程是重量级的，无论怎么优化在性能上也是无法超过轻量级的线程。</font></p>
<p><font face="Arial">现在，多核时代已经到来了。家用pc已经普及了双核的cpu，未来4核、8核甚至是几百核的cpu也并不是一件遥远的事情。在多核时代，支持多线程的语言肯定优于不不支持多线程的语言。随着多核时代的到来，java在性能上核C++的差距会越来越小。ruby的优势还存在么？</font></p>
<p><font face="Arial">说ruby取代java简直是一件笑话。即使在web编程方面，ruby所能取代的，也许仅仅是php而已。<br />
</font></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://b-qiufeng.javaeye.com/blog/81860#comments" style="color:red;">已有 <strong>29</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 May 2007 14:49:22 +0800</pubDate>
        <link>http://b-qiufeng.javaeye.com/blog/81860</link>
        <guid>http://b-qiufeng.javaeye.com/blog/81860</guid>
      </item>
          <item>
        <title>（转）JavaFX Script将终结AJAX？还是另一种选择？</title>
        <author>林秋枫</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://b-qiufeng.javaeye.com">林秋枫</a>&nbsp;
                    链接：<a href="http://b-qiufeng.javaeye.com/blog/78424" style="color:red;">http://b-qiufeng.javaeye.com/blog/78424</a>&nbsp;
          发表时间: 2007年05月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">JavaFX Script将终结AJAX？还是另一种选择？</font></p>
<p><font face="Arial">　　在JavaOne会议上，Sun负责软件业务的执行副总裁格林公布了JavaFX Script:一种用于编写能够在支持Java的PC和手机上运行的应用软件的更简单的脚本语言。</font></p>
<p><font face="Arial">　　JavaFX script构架图</font></p>
<p><img src="http://images.csdn.net/20070509/490880355_2d1198a262.jpg" alt="" /></p>
<p>&nbsp;</p>
<p><font face="Arial">　　为了解决手机的兼容性问题，格林详细阐述了JavaFX Mobile:一种面向手机厂商、提高Java应用软件在不同手机间兼容性的软件包。</font></p>
<p><font face="Arial">　　Sun官员还计划发布最后一部分的开放源代码的Java，并阐述与Java相关的开放源代码项目的管理规则。</font></p>
<p><font face="Arial">　　Sun计划通过JavaFX Script复兴Java在小型设备和浏览器上的使用。格林说，Java不仅仅面向企业，还面向消费者。我们即将发布的脚本语言将极大地增加能够为这一平台开发内容的人的数量。</font></p>
<p><font face="Arial">　　JavaFX Script是一种在生产效率和易用性方面好于Java的脚本语言，能够与Java紧密集成。开发人员可以利用JavaFX Script编写能够在支持Java的PC和手机上运行的应用软件。</font></p>
<p><font face="Arial">　　Sun希望扩大编写与Java兼容的应用软件的开发人员数量，并利用对所谓富互联网应用软件日益增长的兴趣赚钱。</font></p>
<p><font face="Arial">　　格林说，Sun还在反对这一想法：即它在富互联网应用软件领域已经落后。RedMonk分析师斯蒂芬说，微软、Adobe、许多小公司都在挺进这一领域。</font></p>
<p><font face="Arial">　　Sun计划发布JavaFX Script的源代码，让其它公司利用它开发Web创作工具。格林表示，Sun还计划开发用于内容创作的脚本工具。</font></p>
<p><font face="Arial">　　随着Web开发人员开发包括从媒体发布站点到桌面风格应用软件在内的更复杂的网络应用，富互联网应用已经成为软件开发方面最热门的领域之一。</font></p>
<p><font face="Arial">　　Burton Group分析师理查德说，Java有着庞大的产品和厂商产业链，但它在前端设计方面的应用受到了兼容性和性能问题的影响。JavaFX Script可能会解决这一问题。</font></p>
<p><font face="Arial">　　据Sun称，利用Java平台开发在桌面系统上运行软件的编程人员已经达到了500万。格林说，全球已经有20亿部手机预装有名为Java ME的Java软件。</font></p>
<p><font face="Arial">　　理查德表示，通过JavaFX Script和JavaFX Mobile，Sun和其它Java许可客户将拥有更有吸引力的富互联网应用软件开发工具。</font></p>
<p><font face="Arial">　　在过去两年中，脚本语言在主流应用开发方面越来越流行了。许多Web网站开发者和企业开发人员已经选择脚本语言作为Java或.Net的轻量级替代者。</font></p>
<p><font face="Arial">　　与Ruby、PHP、Python等相比，与Java有关的脚本语言的优势是，Java编程人员能够很方便地利用既有的编程技能。</font></p>
<p><font face="Arial">　　利用JavaFX Script编写的应用软件能够在Java Runtime Environment上运行。格林说，与Adobe的Apollo一样，开发人员可以利用完全相同的工具编写基于Web浏览器的应用软件或跨平台的桌面软件。</font></p>
<p><font face="Arial">　　尽管安装量非常大，不同Java ME实现之间的差异引起了兼容性问题。JavaFX Mobile面向手机运营商和厂商，能够减少这些差异，提供一系列用于完成常见任务的手机应用软件。</font></p>
<p><font face="Arial">　　斯蒂芬表示，推出与Java有关的脚本语言不一定会让人们放弃Ruby、Python、PHP，JavaFX Script主要对已经在使用Java的开发人员有吸引力。<br />
</font></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://b-qiufeng.javaeye.com/blog/78424#comments" style="color:red;">已有 <strong>39</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 May 2007 09:51:53 +0800</pubDate>
        <link>http://b-qiufeng.javaeye.com/blog/78424</link>
        <guid>http://b-qiufeng.javaeye.com/blog/78424</guid>
      </item>
          <item>
        <title>Re: 我恨hibernate</title>
        <author>林秋枫</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://b-qiufeng.javaeye.com">林秋枫</a>&nbsp;
                    链接：<a href="http://b-qiufeng.javaeye.com/blog/74462" style="color:red;">http://b-qiufeng.javaeye.com/blog/74462</a>&nbsp;
          发表时间: 2007年04月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          hibernate出现的问题实际上是关系数据库和面向对象技术的矛盾问题。

关系数据库和面向对象技术之间的矛盾是对立统一的，他们之间有一些共性，所以hibernate这种orm框架能很好的利用这一点，这也是hibernate能够广泛应用的一个根本要素。

但是它们之间又有很大的差异性，比如说把一个对象持久化到数据库，实际上只是保持了对象的静态要素（属性），而对象的动态要素（方法）在关系数据库中是无法体现出来的。

因为orm框架这种天生的缺陷导致它不能解决实际应用的所有持久化要求。即使从设计开始就完全按照面向对象进行设计也是无法避免这些问题的，只能使问题减少而已。
          <br/><br/>
          <span style="color:red;">
            <a href="http://b-qiufeng.javaeye.com/blog/74462#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 24 Apr 2007 23:58:42 +0800</pubDate>
        <link>http://b-qiufeng.javaeye.com/blog/74462</link>
        <guid>http://b-qiufeng.javaeye.com/blog/74462</guid>
      </item>
          <item>
        <title>Re: Java Web层的下一个王者是谁？</title>
        <author>林秋枫</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://b-qiufeng.javaeye.com">林秋枫</a>&nbsp;
                    链接：<a href="http://b-qiufeng.javaeye.com/blog/72776" style="color:red;">http://b-qiufeng.javaeye.com/blog/72776</a>&nbsp;
          发表时间: 2007年04月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最不喜欢JSF. 标签和UI组件混用是其致命的缺陷.用IDE拖拉产生的代码是debug和维护的恶梦.从项目管理的角度来看,要做到view层代码的规范化是很难的. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tapestry4.0做了几个系统,感觉其完全贯彻的OO的思想.但其封装得太彻底的,对于新手的开发人员的学习成本很大(特别是没有人指导的情况).比较不好的一点就是Tapestry4.0开发只有一个人,没有大厂商的支持.另外&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tapestry4.0到Tapestry5.0的变化太大了.虽然Tapestry5.0架构更加的优秀.可是由于不兼容,导致了出现断层的现象,刚好这个时候又是web框架争夺市场最激烈的时候.所以对它能否得到广泛的推广还值得验证. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struts1.x一直都在用,做中小项目居多.虽然很多人说落后什么.可是往往只是从理论上说而已.我们都知道宝马汽车当然比捷达好.但是如果你拥有一个出租车公司有N多辆捷达,公司在不同地方都有捷达的维修点.这个时候如果要全部换成宝马似乎不现实.即使新买宝马也值得慎重考虑,要考虑秏油问题,考虑司机驾驶问题,考虑维修成本问题. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; struts2.x还在观望中,不了解,所以也不好评论. </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 现在对spring MVC开始有点兴趣,如果结合FreeMaker,Velocity也是个很好的选择.</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://b-qiufeng.javaeye.com/blog/72776#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 20 Apr 2007 09:33:51 +0800</pubDate>
        <link>http://b-qiufeng.javaeye.com/blog/72776</link>
        <guid>http://b-qiufeng.javaeye.com/blog/72776</guid>
      </item>
          <item>
        <title>比较一下java写文本文件文件的性能</title>
        <author>林秋枫</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://b-qiufeng.javaeye.com">林秋枫</a>&nbsp;
                    链接：<a href="http://b-qiufeng.javaeye.com/blog/72120" style="color:red;">http://b-qiufeng.javaeye.com/blog/72120</a>&nbsp;
          发表时间: 2007年04月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">比较一下java写文本文件文件的性能</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; 最近对以前开发的一个通用数据迁移的软件进行优化。除了用JDK5.0的多线程技术进行的改进之外，也比较了一下java写文件的性能。<br />
&nbsp;&nbsp;&nbsp; 在java写文件中，通常会使用FileOutputStream和FileWriter，FileWriter只能写文本文件。FileOutputStream也经常结合BufferedOutputStream。因为实际应用中写文本文件的情况占了大多数。所以下面测试用不同的方式生成一个相同行数、大小相同的文件的三种不同方式。<br />
&nbsp;&nbsp;&nbsp; <br />
import java.io.File;<br />
import java.io.FileOutputStream;<br />
import java.io.*;</font></p>
<p><font face="Arial">public class FileTest {<br />
&nbsp;&nbsp;&nbsp; public FileTest() {<br />
&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileOutputStream out = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileOutputStream outSTr = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedOutputStream Buff=null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileWriter fw = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int count=1000;//写文件行数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out = new FileOutputStream(new File(&quot;C:/add.txt&quot;));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long begin = System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; count; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.write(&quot;测试java 文件操作\r\n&quot;.getBytes());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long end = System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;FileOutputStream执行耗时:&quot; + (end - begin) + &quot; 豪秒&quot;);</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outSTr = new FileOutputStream(new File(&quot;C:/add0.txt&quot;));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Buff=new BufferedOutputStream(outSTr);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long begin0 = System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; count; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Buff.write(&quot;测试java 文件操作\r\n&quot;.getBytes());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Buff.flush();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Buff.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long end0 = System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;BufferedOutputStream执行耗时:&quot; + (end0 - begin0) + &quot; 豪秒&quot;);</font></p>
<font face="Arial">
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fw = new FileWriter(&quot;C:/add2.txt&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long begin3 = System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; count; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fw.write(&quot;测试java 文件操作\r\n&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fw.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long end3 = System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;FileWriter执行耗时:&quot; + (end3 - begin3) + &quot; 豪秒&quot;);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fw.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Buff.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outSTr.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</p>
<p><br />
}&nbsp;&nbsp;&nbsp; </p>
<p>以下结果经过多次执行，取常出现的数据，由于只是简单比较，不做详细统计。</p>
<p>1.当count＝1000的，即写文件1000行的时候，写出的文件大小为18.5KB：<br />
FileOutputStream执行耗时:46 豪秒<br />
BufferedOutputStream执行耗时:31 豪秒<br />
FileWriter执行耗时:15 豪秒</p>
<p><br />
2.当count＝10000的，即写文件10000行的时候，写出的文件大小为185KB：<br />
FileOutputStream执行耗时:188 豪秒<br />
BufferedOutputStream执行耗时:32 豪秒<br />
FileWriter执行耗时:16 豪秒</p>
<p>&nbsp;</p>
<p>3.当count＝100000的，即写文件100000行的时候，写出的文件大小为1856KB：<br />
FileOutputStream执行耗时:1266 豪秒<br />
BufferedOutputStream执行耗时:125 豪秒<br />
FileWriter执行耗时:93 豪秒</p>
<p>&nbsp;</p>
<p>4.当count＝1000000的，即写文件1000000行的时候，写出的文件大小为18555KB：<br />
FileOutputStream执行耗时:12063 豪秒<br />
BufferedOutputStream执行耗时:1484 豪秒<br />
FileWriter执行耗时:969 豪秒</p>
<p><br />
&nbsp;&nbsp;&nbsp; 由以上数据可以看到，如果不用缓冲流BufferedOutputStream，FileOutputStream写文件的鲁棒性是很不好的。当写1000000行的文件的时候，FileOutputStream比FileWriter要慢11094毫秒（11秒），BufferedOutputStream比FileWriter慢515毫秒。<br />
&nbsp;&nbsp;&nbsp; 不要小看这几秒的时间。当操作的数据量很大的时候，这点性能的差距就会很大了。在通用数据迁移工具导出数据库2千万条记录生成sql脚本文件的时候，性能性能相差10分钟以上。<br />
&nbsp;&nbsp;&nbsp; 下次有时间再写单线程和多线程对性能的影响。</p>
</font>
          <br/><br/>
          <span style="color:red;">
            <a href="http://b-qiufeng.javaeye.com/blog/72120#comments" style="color:red;">已有 <strong>3</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 18 Apr 2007 10:05:36 +0800</pubDate>
        <link>http://b-qiufeng.javaeye.com/blog/72120</link>
        <guid>http://b-qiufeng.javaeye.com/blog/72120</guid>
      </item>
      </channel>
</rss>