﻿<?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-夏天到了-随笔分类-不知道哪里抄来的</title><link>http://www.blogjava.net/oceanqtt/category/2247.html</link><description>雨季过后，是蘑菇生长的季节</description><language>zh-cn</language><lastBuildDate>Thu, 24 Apr 2008 06:39:56 GMT</lastBuildDate><pubDate>Thu, 24 Apr 2008 06:39:56 GMT</pubDate><ttl>60</ttl><item><title>[典故] 明犯强汉者，虽远必诛</title><link>http://www.blogjava.net/oceanqtt/archive/2008/04/24/195446.html</link><dc:creator>蘑菇</dc:creator><author>蘑菇</author><pubDate>Thu, 24 Apr 2008 02:51:00 GMT</pubDate><guid>http://www.blogjava.net/oceanqtt/archive/2008/04/24/195446.html</guid><wfw:comment>http://www.blogjava.net/oceanqtt/comments/195446.html</wfw:comment><comments>http://www.blogjava.net/oceanqtt/archive/2008/04/24/195446.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oceanqtt/comments/commentRss/195446.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oceanqtt/services/trackbacks/195446.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: “臣闻天下之大义，当混为一。匈奴呼韩邪单于已称北藩，唯郅支单于叛逆，未伏其辜，大夏之西，以为强汉不能臣也。郅支单于惨毒行于民，大恶逼于天。臣延寿、臣汤将义兵，行天诛，赖陛下神灵，阴阳并应，陷阵克敌，斩郅支首及名王以下。宜悬头槁于蛮夷邸间，以示万里，明犯强汉者，虽远必诛！” &nbsp;&nbsp;<a href='http://www.blogjava.net/oceanqtt/archive/2008/04/24/195446.html'>阅读全文</a><img src ="http://www.blogjava.net/oceanqtt/aggbug/195446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oceanqtt/" target="_blank">蘑菇</a> 2008-04-24 10:51 <a href="http://www.blogjava.net/oceanqtt/archive/2008/04/24/195446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA中的转义字符</title><link>http://www.blogjava.net/oceanqtt/archive/2008/03/17/186797.html</link><dc:creator>蘑菇</dc:creator><author>蘑菇</author><pubDate>Mon, 17 Mar 2008 08:30:00 GMT</pubDate><guid>http://www.blogjava.net/oceanqtt/archive/2008/03/17/186797.html</guid><wfw:comment>http://www.blogjava.net/oceanqtt/comments/186797.html</wfw:comment><comments>http://www.blogjava.net/oceanqtt/archive/2008/03/17/186797.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oceanqtt/comments/commentRss/186797.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oceanqtt/services/trackbacks/186797.html</trackback:ping><description><![CDATA[<h4 class="TextColor1" style="margin-bottom: 0px">1.八进制转义序列：\ + 1到3位5数字；范围'\000'~'\377'<br />
&nbsp;\0：空字符<br />
2.Unicode转义字符：\u + 四个十六进制数字；0~65535<br />
&nbsp;\u0000：空字符<br />
3.特殊字符：<br />
&nbsp;\"：双引号<br />
&nbsp;\'：单引号<br />
&nbsp;\\：反斜线<br />
4.C0控制字符：<br />
&nbsp;\b：退格<br />
&nbsp;\t：tab<br />
&nbsp;\n：换行<br />
&nbsp;\f：换页<br />
&nbsp;\r：回车</h4>
<img src ="http://www.blogjava.net/oceanqtt/aggbug/186797.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oceanqtt/" target="_blank">蘑菇</a> 2008-03-17 16:30 <a href="http://www.blogjava.net/oceanqtt/archive/2008/03/17/186797.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式--不同工具的语法支持情况</title><link>http://www.blogjava.net/oceanqtt/archive/2008/03/13/185964.html</link><dc:creator>蘑菇</dc:creator><author>蘑菇</author><pubDate>Thu, 13 Mar 2008 03:16:00 GMT</pubDate><guid>http://www.blogjava.net/oceanqtt/archive/2008/03/13/185964.html</guid><wfw:comment>http://www.blogjava.net/oceanqtt/comments/185964.html</wfw:comment><comments>http://www.blogjava.net/oceanqtt/archive/2008/03/13/185964.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oceanqtt/comments/commentRss/185964.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oceanqtt/services/trackbacks/185964.html</trackback:ping><description><![CDATA[<h1>&nbsp;</h1>
<table cellspacing="0" border="1">
    <tbody>
        <tr>
            <td><strong>命令或环境</strong></td>
            <td><strong><tt><font face="Courier New">.</font></tt></strong></td>
            <td><strong><tt><font face="Courier New">[ ]</font></tt></strong></td>
            <td><strong><tt><font face="Courier New">^</font></tt></strong></td>
            <td><strong><tt><font face="Courier New">$</font></tt></strong></td>
            <td><strong><tt><font face="Courier New">\( \)</font></tt></strong></td>
            <td><strong><tt><font face="Courier New">\{ \}</font></tt></strong></td>
            <td><strong><tt><font face="Courier New">?</font></tt></strong></td>
            <td><strong><tt><font face="Courier New">+</font></tt></strong></td>
            <td><strong><tt><font face="Courier New">|</font></tt></strong></td>
            <td><strong><tt><font face="Courier New">( )</font></tt></strong></td>
        </tr>
        <tr>
            <td>vi</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>Visual C++</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>awk</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
        </tr>
        <tr>
            <td>sed</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>Tcl</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
        </tr>
        <tr>
            <td>ex</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>grep</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>egrep</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
        </tr>
        <tr>
            <td>fgrep</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;X&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td>perl</td>
            <td>&nbsp;X</td>
            <td>&nbsp;X</td>
            <td>&nbsp;X</td>
            <td>&nbsp;X</td>
            <td>&nbsp;X</td>
            <td>&nbsp;</td>
            <td>&nbsp;X</td>
            <td>&nbsp;X</td>
            <td>&nbsp;X</td>
            <td>&nbsp;X</td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/oceanqtt/aggbug/185964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oceanqtt/" target="_blank">蘑菇</a> 2008-03-13 11:16 <a href="http://www.blogjava.net/oceanqtt/archive/2008/03/13/185964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式基础--元字符</title><link>http://www.blogjava.net/oceanqtt/archive/2008/03/13/185963.html</link><dc:creator>蘑菇</dc:creator><author>蘑菇</author><pubDate>Thu, 13 Mar 2008 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/oceanqtt/archive/2008/03/13/185963.html</guid><wfw:comment>http://www.blogjava.net/oceanqtt/comments/185963.html</wfw:comment><comments>http://www.blogjava.net/oceanqtt/archive/2008/03/13/185963.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oceanqtt/comments/commentRss/185963.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oceanqtt/services/trackbacks/185963.html</trackback:ping><description><![CDATA[下表列出了所有的元字符和对它们的一个简短的描述。
<p>
<table cellspacing="2" cellpadding="2">
    <tbody>
        <tr valign="baseline">
            <th align="left"><strong><em>元字符</em></strong></th>
            <td>&nbsp;</td>
            <th align="left"><strong><em>描述</em></strong></th>
        </tr>
        <tr>
            <td>
            <hr width="100%" />
            </td>
            <td></td>
            <td>
            <hr width="100%" />
            </td>
        </tr>
        <tr>
            <td valign="top" align="center">
            <center><strong><tt><font face="Courier New"><font size="+1">.</font></font></tt></strong> </center></td>
            <td></td>
            <td>匹配任何单个字符。例如正则表达式<strong><tt>r.t</tt></strong>匹配这些字符串：<em>rat</em>、<em>rut</em>、<em>r t</em>，但是不匹配<em>root</em>。&nbsp;</td>
        </tr>
        <tr>
            <td valign="top">
            <center><strong><tt><font face="Courier New"><font size="+1">$</font></font></tt></strong> </center></td>
            <td></td>
            <td>匹配行结束符。例如正则表达式<strong><tt>weasel$</tt></strong> 能够匹配字符串"<em>He's a weasel</em>"的末尾，但是不能匹配字符串"<em>They are a bunch of weasels.</em>"。&nbsp;</td>
        </tr>
        <tr>
            <td valign="top">
            <center><strong><font size="+1">^</font></strong> </center></td>
            <td></td>
            <td>匹配一行的开始。例如正则表达式<strong><tt>^When in</tt></strong>能够匹配字符串"<em>When in the course of human events</em>"的开始，但是不能匹配"<em>What and When in the"。</em></td>
        </tr>
        <tr>
            <td valign="top">
            <center><strong><tt><font face="Courier New"><font size="+1">*</font></font></tt></strong> </center></td>
            <td></td>
            <td>匹配0或多个正好在它之前的那个字符。例如正则表达式<strong><tt></tt></strong><strong><tt>.*</tt></strong>意味着能够匹配任意数量的任何字符。</td>
        </tr>
        <tr>
            <td valign="top">
            <center><strong><tt><font face="Courier New"><font size="+1">\</font></font></tt></strong> </center></td>
            <td></td>
            <td>这是引用府，用来将这里列出的这些元字符当作普通的字符来进行匹配。例如正则表达式<strong><tt>\$</tt></strong>被用来匹配美元符号，而不是行尾，类似的，正则表达式<tt><strong>\.</strong></tt>用来匹配点字符，而不是任何字符的通配符。</td>
        </tr>
        <tr>
            <td valign="top">
            <center><strong><tt><font face="Courier New"><font size="+1">[ ]&nbsp;</font></font></tt></strong> <br />
            <strong><tt><font face="Courier New"><font size="+1">[c</font><font size="-1">1</font><font size="+1">-c</font><font size="-1">2</font><font size="+1">]</font></font></tt></strong> <br />
            <strong><tt><font face="Courier New"><font size="+1">[^c</font><font size="-1">1</font><font size="+1">-c</font><font size="-1">2</font><font size="+1">]</font></font></tt></strong> </center></td>
            <td></td>
            <td>匹配括号中的任何一个字符。例如正则表达式<strong><tt>r[aou]t</tt></strong>匹配<em>rat</em>、<em>rot</em>和<em>rut</em>，但是不匹配<em>ret</em>。可以在括号中使用连字符-来指定字符的区间，例如正则表达式<strong><tt>[0-9]</tt></strong>可以匹配任何数字字符；还可以制定多个区间，例如正则表达式<strong><tt>[A-Za-z]</tt></strong>可以匹配任何大小写字母。另一个重要的用法是&#8220;排除&#8221;，要想匹配<em>除了</em>指定区间之外的字符——也就是所谓的补集——在左边的括号和第一个字符之间使用^字符，例如正则表达式<strong><tt>[^269A-Z]</tt></strong> 将匹配除了2、6、9和所有大写字母之外的任何字符。</td>
        </tr>
        <tr>
            <td valign="top">
            <center><strong><tt><font face="Courier New"><font size="+1">\&lt; \&gt;</font></font></tt></strong> </center></td>
            <td></td>
            <td>匹配词（<em>word</em>）的开始（\&lt;）和结束（\&gt;）。例如正则表达式<strong><tt><font face="Courier New">\&lt;the</font></tt></strong>能够匹配字符串"<em>for the wise</em>"中的"the"，但是不能匹配字符串"<em>otherwise</em>"中的"the"。<strong>注意</strong>：这个元字符不是所有的软件都支持的。</td>
        </tr>
        <tr>
            <td valign="top">
            <center><strong><tt><font face="Courier New"><font size="+1">\( \)</font></font></tt></strong> </center></td>
            <td></td>
            <td>将 \( 和 \) 之间的表达式定义为&#8220;组&#8221;（<em>group</em>），并且将匹配这个表达式的字符保存到一个临时区域（一个正则表达式中最多可以保存9个），它们可以用 <strong><tt>\1</tt></strong> 到<strong><tt>\9</tt></strong> 的符号来引用。</td>
        </tr>
        <tr>
            <td valign="baseline">
            <center><strong><tt><font face="Courier New"><font size="+1">|</font></font></tt></strong> </center></td>
            <td></td>
            <td>将两个匹配条件进行逻辑&#8220;或&#8221;（<em>Or</em>）运算。例如正则表达式<strong><tt><font face="Courier New">(him|her)</font></tt></strong> 匹配"<em>it belongs to him</em>"和"<em>it belongs to her</em>"，但是不能匹配"<em>it belongs to them.</em>"。<strong>注意</strong>：这个元字符不是所有的软件都支持的。</td>
        </tr>
        <tr valign="baseline">
            <td>
            <center><strong><tt><font face="Courier New"><font size="+1">+</font></font></tt></strong> </center></td>
            <td></td>
            <td>匹配1或多个正好在它之前的那个字符。例如正则表达式<strong><tt></tt></strong><strong><tt></tt></strong><strong><tt>9+</tt></strong>匹配9、99、999等。<strong>注意</strong>：这个元字符不是所有的软件都支持的。</td>
        </tr>
        <tr valign="baseline">
            <td>
            <center><strong><tt><font size="+1">?</font></tt></strong> </center></td>
            <td></td>
            <td>匹配0或1个正好在它之前的那个字符。<strong>注意</strong>：这个元字符不是所有的软件都支持的。</td>
        </tr>
        <tr valign="baseline">
            <td>
            <center><strong><font size="+1"><tt><font face="Courier New">\{</font></tt><em>i</em><tt><font face="Courier New">\}</font></tt></font></strong> <br />
            <strong><font size="+1"><tt><font face="Courier New">\{</font></tt><em>i</em><tt><font face="Courier New">,</font></tt><em>j</em><tt><font face="Courier New">\}</font></tt></font></strong> </center></td>
            <td></td>
            <td valign="baseline">匹配指定数目的字符，这些字符是在它之前的表达式定义的。例如正则表达式<strong><tt><font face="Courier New">A[0-9]\{3\}</font></tt></strong> 能够匹配字符"A"后面跟着正好3个数字字符的串，例如A123、A348等，但是不匹配A1234。而正则表达式<strong><tt><font face="Courier New">[0-9]\{4,6\}</font></tt></strong> 匹配连续的任意4个、5个或者6个数字字符。<strong>注意</strong>：这个元字符不是所有的软件都支持的。</td>
        </tr>
    </tbody>
</table>
</p>
<p>&nbsp;</p>
<hr width="100%" />
<p>最简单的元字符是点，它能够匹配任何单个字符（注意<strong>不</strong>包括新行符）。</p>
<img src ="http://www.blogjava.net/oceanqtt/aggbug/185963.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oceanqtt/" target="_blank">蘑菇</a> 2008-03-13 11:13 <a href="http://www.blogjava.net/oceanqtt/archive/2008/03/13/185963.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学好英语的42个经典要诀（在网上看到的）</title><link>http://www.blogjava.net/oceanqtt/archive/2007/01/21/95123.html</link><dc:creator>蘑菇</dc:creator><author>蘑菇</author><pubDate>Sun, 21 Jan 2007 06:03:00 GMT</pubDate><guid>http://www.blogjava.net/oceanqtt/archive/2007/01/21/95123.html</guid><wfw:comment>http://www.blogjava.net/oceanqtt/comments/95123.html</wfw:comment><comments>http://www.blogjava.net/oceanqtt/archive/2007/01/21/95123.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oceanqtt/comments/commentRss/95123.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oceanqtt/services/trackbacks/95123.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第一要诀：收听英语气象报告 <br>有些教学录音带为配合初学者的学习，故意放慢语速，这对英语听力的训练是不够的。如果听语速正常的英语，初学者又会感到力不从心。英语气象报告的速度虽快，但词汇简单固定，内容单纯，重复的可能性大，而且在生活中随时都可以印证，是听力入门的好教材。&nbsp;&nbsp;<a href='http://www.blogjava.net/oceanqtt/archive/2007/01/21/95123.html'>阅读全文</a><img src ="http://www.blogjava.net/oceanqtt/aggbug/95123.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oceanqtt/" target="_blank">蘑菇</a> 2007-01-21 14:03 <a href="http://www.blogjava.net/oceanqtt/archive/2007/01/21/95123.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]深入探讨Iterator模式</title><link>http://www.blogjava.net/oceanqtt/archive/2006/10/23/76794.html</link><dc:creator>蘑菇</dc:creator><author>蘑菇</author><pubDate>Mon, 23 Oct 2006 09:29:00 GMT</pubDate><guid>http://www.blogjava.net/oceanqtt/archive/2006/10/23/76794.html</guid><wfw:comment>http://www.blogjava.net/oceanqtt/comments/76794.html</wfw:comment><comments>http://www.blogjava.net/oceanqtt/archive/2006/10/23/76794.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oceanqtt/comments/commentRss/76794.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oceanqtt/services/trackbacks/76794.html</trackback:ping><description><![CDATA[
		<table style="WORD-BREAK: break-all" cellspacing="0" cellpadding="0" width="700" align="center" border="0">
				<tbody>
						<tr>
								<td align="middle" height="25">
										<font face="黑体" size="4">深入探讨Iterator模式</font>
								</td>
						</tr>
						<tr bgcolor="#f9f9f9">
								<td id="fontzoom" style="LINE-HEIGHT: 200%">
										<p align="center">作者：廖雪峰    来自：SUN</p>
										<p>
										</p>
										<p>java.util包中包含了一系列重要的集合类。本文将从分析源码入手，深入研究一个集合类的内部结构，以及遍历集合的迭代模式的源码实现内幕。</p>
										<p>下面我们先简单讨论一个根接口Collection，然后分析一个抽象类AbstractList和它的对应Iterator接口，并仔细研究迭代子模式的实现原理。</p>
										<p>本文讨论的源代码版本是JDK 1.4.2，因为JDK 1.5在java.util中使用了很多泛型代码，为了简化问题，所以我们还是讨论1.4版本的代码。</p>
										<p><strong>集合类的根接口Collection</strong></p>
										<p>Collection接口是所有集合类的根类型。它的一个主要的接口方法是：</p>
										<p>boolean add(Object c)</p>
										<p>add()方法将添加一个新元素。注意这个方法会返回一个boolean，但是返回值不是表示添加成功与否。仔细阅读doc可以看到，Collection规定：如果一个集合拒绝添加这个元素，无论任何原因，都必须抛出异常。这个返回值表示的意义是add()方法执行后，集合的内容是否改变了（就是元素有无数量，位置等变化），这是由具体类实现的。即：如果方法出错，总会抛出异常；返回值仅仅表示该方法执行后这个Collection的内容有无变化。</p>
										<p>类似的还有：</p>
										<p>boolean addAll(Collection c);<br />boolean remove(Object o);<br />boolean removeAll(Collection c);<br />boolean remainAll(Collection c);</p>
										<p>Object[] toArray()方法很简单，把集合转换成数组返回。Object[] toArray(Object[] a)方法就有点复杂了，首先，返回的Object[]仍然是把集合的所有元素变成的数组，但是类型和参数a的类型是相同的，比如执行：</p>
										<p>String[] o = (String[])c.toArray(new String[0]);</p>
										<p>得到的o实际类型是String[]。</p>
										<p>其次，如果参数a的大小装不下集合的所有元素，返回的将是一个新的数组。如果参数a的大小能装下集合的所有元素，则返回的还是a，但a的内容用集合的元素来填充。尤其要注意的是，如果a的大小比集合元素的个数还多，a后面的部分全部被置为null。</p>
										<p>最后一个最重要的方法是iterator()，返回一个Iterator（迭代子），用于遍历集合的所有元素。</p>
										<p><strong>用Iterator模式实现遍历集合</strong></p>
										<p>Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来，从而避免向客户端暴露集合的内部结构。</p>
										<p>例如，如果没有使用Iterator，遍历一个数组的方法是使用索引：</p>
										<p>for(int i=0; i&lt;array.size(); i++) { ... get(i) ... }</p>
										<p>而访问一个链表（LinkedList）又必须使用while循环：</p>
										<p>while((e=e.next())!=null) { ... e.data() ... }</p>
										<p>以上两种方法客户端都必须事先知道集合的内部结构，访问代码和集合本身是紧耦合，无法将访问逻辑从集合类和客户端代码中分离出来，每一种集合对应一种遍历方法，客户端代码无法复用。</p>
										<p>更恐怖的是，如果以后需要把ArrayList更换为LinkedList，则原来的客户端代码必须全部重写。</p>
										<p>为解决以上问题，Iterator模式总是用同一种逻辑来遍历集合：</p>
										<p>for(Iterator it = c.iterater(); it.hasNext(); ) { ... }</p>
										<p>奥秘在于客户端自身不维护遍历集合的"指针"，所有的内部状态（如当前元素位置，是否有下一个元素）都由Iterator来维护，而这个Iterator由集合类通过工厂方法生成，因此，它知道如何遍历整个集合。</p>
										<p>客户端从不直接和集合类打交道，它总是控制Iterator，向它发送"向前"，"向后"，"取当前元素"的命令，就可以间接遍历整个集合。</p>
										<p>首先看看java.util.Iterator接口的定义：</p>
										<p>public interface Iterator {<br />    boolean hasNext();<br />    Object next();<br />    void remove();<br />}</p>
										<p>依赖前两个方法就能完成遍历，典型的代码如下：</p>
										<p>for(Iterator it = c.iterator(); it.hasNext(); ) {<br />        Object o = it.next();<br />        // 对o的操作...<br />    }</p>
										<p>在JDK1.5中，还对上面的代码在语法上作了简化：</p>
										<p>    // Type是具体的类型，如String。<br />    for(Type t : c) {<br />        // 对t的操作...<br />    }</p>
										<p>每一种集合类返回的Iterator具体类型可能不同，Array可能返回ArrayIterator，Set可能返回SetIterator，Tree可能返回TreeIterator，但是它们都实现了Iterator接口，因此，客户端不关心到底是哪种Iterator，它只需要获得这个Iterator接口即可，这就是面向对象的威力。</p>
										<p><strong>Iterator源码剖析</strong></p>
										<p>让我们来看看AbstracyList如何创建Iterator。首先AbstractList定义了一个内部类（inner class）：</p>
										<p>    private class Itr implements Iterator {<br />        ...<br />    }</p>
										<p>而iterator()方法的定义是：</p>
										<p>    public Iterator iterator() {<br />        return new Itr();<br />    }</p>
										<p>因此客户端不知道它通过Iterator it = a.iterator();所获得的Iterator的真正类型。</p>
										<p>现在我们关心的是这个申明为private的Itr类是如何实现遍历AbstractList的：</p>
										<p>    private class Itr implements Iterator {<br />        int cursor = 0;<br />        int lastRet = -1;<br />        int expectedModCount = modCount;<br />    }</p>
										<p>Itr类依靠3个int变量（还有一个隐含的AbstractList的引用）来实现遍历，cursor是下一次next()调用时元素的位置，第一次调用next()将返回索引为0的元素。lastRet记录上一次游标所在位置，因此它总是比cursor少1。</p>
										<p>变量cursor和集合的元素个数决定hasNext()：</p>
										<p>    public boolean hasNext() {<br />        return cursor != size();<br />    }</p>
										<p>方法next()返回的是索引为cursor的元素，然后修改cursor和lastRet的值：</p>
										<p>    public Object next() {<br />        checkForComodification();<br />        try {<br />            Object next = get(cursor);<br />            lastRet = cursor++;<br />            return next;<br />        } catch(IndexOutOfBoundsException e) {<br />            checkForComodification();<br />            throw new NoSuchElementException();<br />        }<br />    }</p>
										<p>expectedModCount表示期待的modCount值，用来判断在遍历过程中集合是否被修改过。AbstractList包含一个modCount变量，它的初始值是0，当集合每被修改一次时（调用add，remove等方法），modCount加1。因此，modCount如果不变，表示集合内容未被修改。</p>
										<p>Itr初始化时用expectedModCount记录集合的modCount变量，此后在必要的地方它会检测modCount的值：</p>
										<p>    final void checkForComodification() {<br />        if (modCount != expectedModCount)<br />            throw new ConcurrentModificationException();<br />    }</p>
										<p>如果modCount与一开始记录在expectedModeCount中的值不等，说明集合内容被修改过，此时会抛出ConcurrentModificationException。</p>
										<p>这个ConcurrentModificationException是RuntimeException，不要在客户端捕获它。如果发生此异常，说明程序代码的编写有问题，应该仔细检查代码而不是在catch中忽略它。</p>
										<p>但是调用Iterator自身的remove()方法删除当前元素是完全没有问题的，因为在这个方法中会自动同步expectedModCount和modCount的值：</p>
										<p>    public void remove() {<br />        ...<br />        AbstractList.this.remove(lastRet);<br />        ...<br />        // 在调用了集合的remove()方法之后重新设置了expectedModCount：<br />        expectedModCount = modCount;<br />        ...<br />    }</p>
										<p>要确保遍历过程顺利完成，必须保证遍历过程中不更改集合的内容（Iterator的remove()方法除外），因此，确保遍历可靠的原则是只在一个线程中使用这个集合，或者在多线程中对遍历代码进行同步。</p>
										<p>最后给个完整的示例：</p>
										<p>    Collection c = new ArrayList();<br />    c.add("abc");<br />    c.add("xyz");<br />    for(Iterator it = c.iterator(); it.hasNext(); ) {<br />        String s = (String)it.next();<br />        System.out.println(s);<br />    }</p>
										<p>如果你把第一行代码的ArrayList换成LinkedList或Vector，剩下的代码不用改动一行就能编译，而且功能不变，这就是针对抽象编程的原则：对具体类的依赖性最小。</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/oceanqtt/aggbug/76794.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oceanqtt/" target="_blank">蘑菇</a> 2006-10-23 17:29 <a href="http://www.blogjava.net/oceanqtt/archive/2006/10/23/76794.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux文件查找命令find,xargs详述</title><link>http://www.blogjava.net/oceanqtt/archive/2006/04/12/40672.html</link><dc:creator>蘑菇</dc:creator><author>蘑菇</author><pubDate>Wed, 12 Apr 2006 08:11:00 GMT</pubDate><guid>http://www.blogjava.net/oceanqtt/archive/2006/04/12/40672.html</guid><wfw:comment>http://www.blogjava.net/oceanqtt/comments/40672.html</wfw:comment><comments>http://www.blogjava.net/oceanqtt/archive/2006/04/12/40672.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oceanqtt/comments/commentRss/40672.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oceanqtt/services/trackbacks/40672.html</trackback:ping><description><![CDATA[
		<table class="zhi14" style="HEIGHT: 38px" height="38" cellspacing="0" cellpadding="0" width="620" align="center" border="0">
				<tbody>
						<tr>
								<td width="648" height="20">
										<p>
												<font id="00" size="4">
														<b>前言：关于find命令</b>
												</font>
										</p>
										<p>由于find具有强大的功能，所以它的选项也很多，其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统( NFS)，find命令在该文件系统中同样有效，只你具有相应的权限。</p>
										<p>在运行一个非常消耗资源的find命令时，很多人都倾向于把它放在后台执行，因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。</p>
										<p>
												<font id="1" size="4">
														<b>一、find 命令格式<br /></b>
												</font>
												<font id="1.1" size="3">
														<b>
																<br />1、find命令的一般形式为；<br /></b>
												</font>
												<code>
														<font face="新宋体">
																<br />find pathname -options [-print -exec -ok ...]</font>
												</code>
										</p>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>
												<font id="1.2" size="3">
														<b>2、find命令的参数；<br /></b>
												</font>
												<code>
														<font face="新宋体">
																<br />pathname: find命令所查找的目录路径。例如用.来表示当前目录，用/来表示系统根目录。<br />-print： find命令将匹配的文件输出到标准输出。<br />-exec： find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;，注意{ }和\；之间的空格。<br />-ok： 和-exec的作用相同，只不过以一种更为安全的模式来执行该参数所给出的shell命令，在执行每一个命令之前，都会给出提示，让用户来确定是否执行。</font>
												</code>
										</p>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>
												<font id="1.3" size="3">
														<b>3、find命令选项<br /></b>
												</font>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">-name <br />按照文件名查找文件。<br />-perm<br />按照文件权限来查找文件。<br />-prune<br />使用这一选项可以使find命令不在当前指定的目录中查找，如果同时使用-depth选项，那么-prune将被find命令忽略。<br />-user<br />按照文件属主来查找文件。<br />-group<br />按照文件所属的组来查找文件。<br />-mtime -n +n<br />按照文件的更改时间来查找文件， - n表示文件更改时间距现在n天以内，+ n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项，但它们都和-m time选项。<br />-nogroup<br />查找无有效所属组的文件，即该文件所属的组在/etc/groups中不存在。<br />-nouser<br />查找无有效属主的文件，即该文件的属主在/etc/passwd中不存在。<br />-newer file1 ! file2 <br />查找更改时间比文件file1新但比文件file2旧的文件。<br />-type <br />查找某一类型的文件，诸如：<br />b - 块设备文件。<br />d - 目录。<br />c - 字符设备文件。<br />p - 管道文件。<br />l - 符号链接文件。<br />f - 普通文件。<br />-size n：[c] 查找文件长度为n块的文件，带有c时表示文件长度以字节计。<br />-depth：在查找文件时，首先查找当前目录中的文件，然后再在其子目录中查找。<br />-fstype：查找位于某一类型文件系统中的文件，这些文件系统类型通常可以在配置文件/etc/fstab中找到，该配置文件中包含了本系统中有关文件系统的信息。<br />-mount：在查找文件时不跨越文件系统mount点。<br />-follow：如果find命令遇到符号链接文件，就跟踪至链接所指向的文件。<br />-cpio：对匹配的文件使用cpio命令，将这些文件备份到磁带设备中。</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>另外,下面三个的区别:<br /></p>
										<div class="codeblock">
												<code>
														<font face="新宋体">   -amin n<br />　　查找系统中最后N分钟访问的文件<br />　　-atime n<br />　　查找系统中最后n*24小时访问的文件<br />　　-cmin n<br />　　查找系统中最后N分钟被改变文件状态的文件<br />　　-ctime n<br />　　查找系统中最后n*24小时被改变文件状态的文件<br />   　-mmin n<br />　　查找系统中最后N分钟被改变文件数据的文件<br />　　-mtime n<br />　　查找系统中最后n*24小时被改变文件数据的文件</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>
												<font id="1.4" size="3">
														<b>4、使用exec或ok来执行shell命令<br /></b>
												</font>
												<br />使用find时，只要把想要的操作写在一个文件里，就可以用exec来配合find查找，很方便的</p>
										<p>在有些操作系统中只允许-exec选项执行诸如l s或ls -l这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行rm命令删除文件之前，最好先用ls命令看一下，确认它们是所要删除的文件。</p>
										<p>exec选项后面跟随着所要执行的命令或脚本，然后是一对儿{ }，一个空格和一个\，最后是一个分号。为了使用exec选项，必须要同时使用print选项。如果验证一下find命令，会发现该命令只输出从当前路径起的相对路径及文件名。</p>
										<p>例如：为了用ls -l命令列出所匹配到的文件，可以把ls -l命令放在find命令的-exec选项中</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体"># find . -type f -exec ls -l { } \;<br />-rw-r--r-- 1 root root 34928 2003-02-25 ./conf/httpd.conf<br />-rw-r--r-- 1 root root 12959 2003-02-25 ./conf/magic<br />-rw-r--r-- 1 root root 180 2003-02-25 ./conf.d/README</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>上面的例子中，find命令匹配到了当前目录下的所有普通文件，并在-exec选项中使用ls -l命令将它们列出。<br />在/logs目录中查找更改时间在5日以前的文件并删除它们：</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find logs -type f -mtime +5 -exec rm { } \;</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>
												<b>记住：</b>在shell中用任何方式删除文件之前，应当先查看相应的文件，一定要小心！当使用诸如mv或rm命令时，可以使用-exec选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。</p>
										<p>在下面的例子中， find命令在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件，并删除它们，只不过在删除之前先给出提示。</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find . -name "*.conf" -mtime +5 -ok rm { } \;<br />&lt; rm ... ./conf/httpd.conf &gt; ? n</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>按y键删除文件，按n键不删除。</p>
										<p>任何形式的命令都可以在-exec选项中使用。</p>
										<p>在下面的例子中我们使用grep命令。find命令首先匹配所有文件名为“ passwd*”的文件，例如passwd、passwd.old、passwd.bak，然后执行grep命令看看在这些文件中是否存在一个sam用户。</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体"># find /etc -name "passwd*" -exec grep "sam" { } \;<br />sam:x:501:501::/usr/sam:/bin/bash</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>
												<font id="2" size="4">
														<b>二、find命令的例子；<br /></b>
												</font>
												<font id="2.1" size="3">
														<b>
																<br />1、查找当前用户主目录下的所有文件：<br /></b>
												</font>
												<br />下面两种方法都可以使用</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find $HOME -print<br />$ find ~ -print</font>
												</code>
										</div>
										<br />
										<font id="2.2" size="3">
												<b>
														<br />2、让当前目录中文件属主具有读、写权限，并且文件所属组的用户和其他用户具有读权限的文件；<br /></b>
										</font>
										<p>
										</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find . -type f -perm 644 -exec ls -l { } \;</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>
												<font id="2.3" size="3">
														<b>3、为了查找系统中所有文件长度为0的普通文件，并列出它们的完整路径；<br /></b>
												</font>
												<code>
														<font face="新宋体">
																<br />$ find / -type f -size 0 -exec ls -l { } \;</font>
												</code>
										</p>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>
												<font id="2.4" size="3">
														<b>4、查找/var/logs目录中更改时间在7日以前的普通文件，并在删除之前询问它们；<br /></b>
												</font>
												<code>
														<font face="新宋体">
																<br />$ find /var/logs -type f -mtime +7 -ok rm { } \;</font>
												</code>
										</p>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>
												<font id="2.5" size="3">
														<b>5、为了查找系统中所有属于root组的文件；<br /></b>
												</font>
												<code>
														<font face="新宋体">
																<br />$find . -group root -exec ls -l { } \;<br />-rw-r--r-- 1 root root 595 10月 31 01:09 ./fie1</font>
												</code>
										</p>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>
												<font id="2.6" size="3">
														<b>6、find命令将删除当目录中访问时间在7日以来、含有数字后缀的admin.log文件。<br /></b>
												</font>
												<br />该命令只检查三位数字，所以相应文件的后缀不要超过999。先建几个admin.log*的文件 ，才能使用下面这个命令</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find . -name "admin.log[0-9][0-9][0-9]" -atime -7 -ok<br />rm { } \;<br />&lt; rm ... ./admin.log001 &gt; ? n<br />&lt; rm ... ./admin.log002 &gt; ? n<br />&lt; rm ... ./admin.log042 &gt; ? n<br />&lt; rm ... ./admin.log942 &gt; ? n</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>
												<font id="2.7" size="3">
														<b>7、为了查找当前文件系统中的所有目录并排序；<br /></b>
												</font>
												<code>
														<font face="新宋体">
																<br />$ find . -type d | sort</font>
												</code>
										</p>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>
												<font id="2.8" size="3">
														<b>8、为了查找系统中所有的rmt磁带设备；<br /></b>
												</font>
												<code>
														<font face="新宋体">
																<br />$ find /dev/rmt -print</font>
												</code>
										</p>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>
												<font id="3" size="4">
														<b>三、xargs<br /></b>
												</font>
												<br />xargs - build and execute command lines from standard input</p>
										<p>在使用find命令的-exec选项处理匹配到的文件时， find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制，这样在find命令运行几分钟之后，就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在，特别是与find命令一起使用。</p>
										<p>find命令把匹配到的文件传递给xargs命令，而xargs命令每次只获取一部分文件而不是全部，不像-exec选项那样。这样它可以先处理最先获取的一部分文件，然后是下一批，并如此继续下去。</p>
										<p>在有些系统中，使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程，并非将匹配到的文件全部作为参数一次执行；这样在有些情况下就会出现进程过多，系统性能下降的问题，因而效率不高；</p>
										<p>而使用xargs命令则只有一个进程。另外，在使用xargs命令时，究竟是一次获取所有的参数，还是分批取得参数，以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。</p>
										<p>来看看xargs命令是如何同find命令一起使用的，并给出一些例子。</p>
										<p>下面的例子查找系统中的每一个普通文件，然后使用xargs命令来测试它们分别属于哪类文件</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">#find . -type f -print | xargs file<br />./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text<br />./.kde/Autostart/.directory: ISO-8859 text\<br />......</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>在整个系统中查找内存信息转储文件(core dump) ，然后把结果保存到/tmp/core.log 文件中：</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find / -name "core" -print | xargs echo "" &gt;/tmp/core.log</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>上面这个执行太慢，我改成在当前目录下查找</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">#find . -name "file*" -print | xargs echo "" &gt; /temp/core.log<br /># cat /temp/core.log<br />./file6</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>在当前目录下查找所有用户具有读、写和执行权限的文件，并收回相应的写权限：</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体"># ls -l<br />drwxrwxrwx 2 sam adm 4096 10月 30 20:14 file6<br />-rwxrwxrwx 2 sam adm 0 10月 31 01:01 http3.conf<br />-rwxrwxrwx 2 sam adm 0 10月 31 01:01 httpd.conf<br /># find . -perm -7 -print | xargs chmod o-w<br /># ls -l<br />drwxrwxr-x 2 sam adm 4096 10月 30 20:14 file6<br />-rwxrwxr-x 2 sam adm 0 10月 31 01:01 http3.conf<br />-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>用grep命令在所有的普通文件中搜索hostname这个词：</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体"># find . -type f -print | xargs grep "hostname"<br />./httpd1.conf:# different IP addresses or hostnames and have them handled by the<br />./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames<br />on your</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>用grep命令在当前目录下的所有普通文件中搜索hostnames这个词：</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体"># find . -name \* -type f -print | xargs grep "hostnames"<br />./httpd1.conf:# different IP addresses or hostnames and have them handled by the<br />./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames<br />on your</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>注意，在上面的例子中， \用来取消find命令中的*在shell中的特殊含义。</p>
										<p>find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。</p>
										<p>
												<font id="4" size="4">
														<b>四、find 命令的参数<br /></b>
												</font>
												<br />下面是find一些常用参数的例子，有用到的时候查查就行了，像上面前几个贴子，都用到了其中的的一些参数，也可以用man或查看论坛里其它贴子有find的命令手册</p>
										<p>
												<font id="4.1" size="3">
														<b>1、使用name选项<br /></b>
												</font>
												<br />文件名选项是find命令最常用的选项，要么单独使用该选项，要么和其他选项一起使用。</p>
										<p>可以使用某种文件名模式来匹配文件，记住要用引号将文件名模式引起来。</p>
										<p>不管当前路径是什么，如果想要在自己的根目录$HOME中查找文件名符合*.txt的文件，使用~作为 'pathname'参数，波浪号~代表了你的$HOME目录。</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find ~ -name "*.txt" -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>想要在当前目录及子目录中查找所有的‘ *.txt’文件，可以用：</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find . -name "*.txt" -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>想要的当前目录及子目录中查找文件名以一个大写字母开头的文件，可以用：</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find . -name "[A-Z]*" -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>想要在/etc目录中查找文件名以host开头的文件，可以用：</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find /etc -name "host*" -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>想要查找$HOME目录中的文件，可以用：</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find ~ -name "*" -print 或find . -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>要想让系统高负荷运行，就从根目录开始查找所有的文件。</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find / -name "*" -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>如果想在当前目录查找文件名以两个小写字母开头，跟着是两个数字，最后是.txt的文件，下面的命令就能够返回名为ax37.txt的文件：</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$find . -name "[a-z][a-z][0--9][0--9].txt" -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>
												<font id="4.2" size="3">
														<b>2、用perm选项<br /></b>
												</font>
												<br />按照文件权限模式用-perm选项,按文件权限模式来查找文件的话。最好使用八进制的权限表示法。</p>
										<p>如在当前目录下查找文件权限位为755的文件，即文件属主可以读、写、执行，其他用户可以读、执行的文件，可以用：</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find . -perm 755 -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>还有一种表达方法：在八进制数字前面要加一个横杠-，表示都匹配，如-007就相当于777，-006相当于666</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体"># ls -l<br />-rwxrwxr-x 2 sam adm 0 10月 31 01:01 http3.conf<br />-rw-rw-rw- 1 sam adm 34890 10月 31 00:57 httpd1.conf<br />-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf<br />drw-rw-rw- 2 gem group 4096 10月 26 19:48 sam<br />-rw-rw-rw- 1 root root 2792 10月 31 20:19 temp<br /># find . -perm 006<br /># find . -perm -006<br />./sam<br />./httpd1.conf<br />./temp</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>-perm mode:文件许可正好符合mode</p>
										<p>-perm +mode:文件许可部分符合mode</p>
										<p>-perm -mode: 文件许可完全符合mode</p>
										<p>
												<font id="4.3" size="3">
														<b>3、忽略某个目录<br /></b>
												</font>
												<br />如果在查找文件时希望忽略某个目录，因为你知道那个目录中没有你所要查找的文件，那么可以使用-prune选项来指出需要忽略的目录。在使用-prune选项时要当心，因为如果你同时使用了-depth选项，那么-prune选项就会被find命令忽略。</p>
										<p>如果希望在/apps目录下查找文件，但不希望在/apps/bin目录下查找，可以用：</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find /apps -path "/apps/bin" -prune -o -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>
												<font id="4.4" size="3">
														<b>
																<br />4、使用find查找文件的时候怎么避开某个文件目录<br /></b>
												</font>
										</p>
										<p>比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">find /usr/sam -path "/usr/sam/dir1" -prune -o -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">find [-path ..] [expression] 在路径列表的后面的是表达式</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>-path "/usr/sam" -prune -o -print 是 -path "/usr/sam" -a -prune -o<br />-print 的简写表达式按顺序求值, -a 和 -o 都是短路求值，与 shell 的 &amp;&amp; 和 || 类似如果 -path "/usr/sam" 为真，则求值 -prune , -prune 返回真，与逻辑表达式为真；否则不求值 -prune，与逻辑表达式为假。如果 -path "/usr/sam" -a -prune 为假，则求值 -print ，-print返回真，或逻辑表达式为真；否则不求值 -print，或逻辑表达式为真。</p>
										<p>这个表达式组合特例可以用伪码写为</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">if -path "/usr/sam" then<br />          -prune<br />else<br />          -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>避开多个文件夹</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">find /usr/sam \( -path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>圆括号表示表达式的结合。<br /></p>
										<div class="codeblock">
												<code>
														<font face="新宋体">\ 表示引用，即指示 shell 不对后面的字符作特殊解释，而留给 find 命令去解释其意义。</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>查找某一确定文件，-name等选项加在-o 之后</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">#find /usr/sam \(-path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -name "temp" -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>
												<font id="4.5" size="3">
														<b>
																<br />5、使用user和nouser选项<br /></b>
												</font>
										</p>
										<p>按文件属主查找文件，如在$HOME目录中查找文件属主为sam的文件，可以用：</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find ~ -user sam -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>在/etc目录下查找文件属主为uucp的文件：</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find /etc -user uucp -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>为了查找属主帐户已经被删除的文件，可以使用-nouser选项。这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时，不必给出用户名； find命令能够为你完成相应的工作。</p>
										<p>例如，希望在/home目录下查找所有的这类文件，可以用：<br /></p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find /home -nouser -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>
												<font id="4.6" size="3">
														<b>
																<br />6、使用group和nogroup选项<br /></b>
												</font>
										</p>
										<p>就像user和nouser选项一样，针对文件所属于的用户组， find命令也具有同样的选项，为了在/apps目录下查找属于gem用户组的文件，可以用：</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find /apps -group gem -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>要查找没有有效所属用户组的所有文件，可以使用nogroup选项。下面的find命令从文件系统的根目录处查找这样的文件</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find / -nogroup-print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>
												<font id="4.7" size="3">
														<b>
																<br />7、按照更改时间或访问时间等查找文件<br /></b>
												</font>
										</p>
										<p>如果希望按照更改时间来查找文件，可以使用mtime,atime或ctime选项。如果系统突然没有可用空间了，很有可能某一个文件的长度在此期间增长迅速，这时就可以用mtime选项来查找这样的文件。</p>
										<p>用减号-来限定更改时间在距今n日以内的文件，而用加号+来限定更改时间在距今n日以前的文件。</p>
										<p>希望在系统根目录下查找更改时间在5日以内的文件，可以用：</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find / -mtime -5 -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>为了在/var/adm目录下查找更改时间在3日以前的文件，可以用：</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find /var/adm -mtime +3 -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>
												<font id="4.8" size="3">
														<b>8、查找比某个文件新或旧的文件<br /></b>
												</font>
												<br />如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件，可以使用-newer选项。它的一般形式为：</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">newest_file_name ! oldest_file_name</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>其中，！是逻辑非符号。</p>
										<p>查找更改时间比文件sam新但比文件temp旧的文件：</p>
										<p>例：有两个文件</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">-rw-r--r-- 1 sam adm 0 10月 31 01:07 fiel<br />-rw-rw-rw- 1 sam adm 34890 10月 31 00:57 httpd1.conf<br />-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf<br />drw-rw-rw- 2 gem group 4096 10月 26 19:48 sam<br />-rw-rw-rw- 1 root root 2792 10月 31 20:19 temp<br /># find -newer httpd1.conf ! -newer temp -ls<br />1077669 0 -rwxrwxr-x 2 sam adm 0 10月 31 01:01 ./httpd.conf<br />1077671 4 -rw-rw-rw- 1 root root 2792 10月 31 20:19 ./temp<br />1077673 0 -rw-r--r-- 1 sam adm 0 10月 31 01:07 ./fiel</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>查找更改时间在比temp文件新的文件：</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find . -newer temp -print</font>
												</code>
										</div>
										<br />
										<font id="4.9" size="3">
												<b>
														<br />9、使用type选项<br /></b>
										</font>
										<p>
										</p>
										<p>在/etc目录下查找所有的目录，可以用：</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find /etc -type d -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>在当前目录下查找除目录以外的所有类型的文件，可以用：<br /></p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find . ! -type d -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>在/etc目录下查找所有的符号链接文件，可以用<br /></p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find /etc -type l -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>
												<font id="4.10" size="3">
														<b>
																<br />10、使用size选项<br /></b>
												</font>
										</p>
										<p>可以按照文件长度来查找文件，这里所指的文件长度既可以用块（block）来计量，也可以用字节来计量。以字节计量文件长度的表达形式为N c；以块计量文件长度只用数字表示即可。</p>
										<p>在按照文件长度查找文件时，一般使用这种以字节表示的文件长度，在查看文件系统的大小，因为这时使用块来计量更容易转换。<br />在当前目录下查找文件长度大于1 M字节的文件：<br /></p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find . -size +1000000c -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>在/home/apache目录下查找文件长度恰好为100字节的文件：</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find /home/apache -size 100c -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>在当前目录下查找长度超过10块的文件（一块等于512字节）： </p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find . -size +10 -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>
												<font id="4.11" size="3">
														<b>11、使用depth选项<br /></b>
												</font>
												<br />在使用find命令时，可能希望先匹配所有的文件，再在子目录中查找。使用depth选项就可以使find命令这样做。这样做的一个原因就是，当在使用find命令向磁带上备份文件系统时，希望首先备份所有的文件，其次再备份子目录中的文件。</p>
										<p>在下面的例子中， find命令从文件系统的根目录开始，查找一个名为CON.FILE的文件。</p>
										<p>它将首先匹配所有的文件然后再进入子目录中查找。</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find / -name "CON.FILE" -depth -print</font>
												</code>
										</div>
										<p>
												<font face="新宋体">
												</font>
										</p>
										<p>
												<font id="4.12" size="3">
														<b>
																<br />12、使用mount选项<br /></b>
												</font>
										</p>
										<p>在当前的文件系统中查找文件（不进入其他文件系统），可以使用find命令的mount选项。</p>
										<p>从当前目录开始查找位于本文件系统中文件名以XC结尾的文件：</p>
										<p>
										</p>
										<div class="codeblock">
												<code>
														<font face="新宋体">$ find . -name "*.XC" -mount -print</font>
												</code>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/oceanqtt/aggbug/40672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oceanqtt/" target="_blank">蘑菇</a> 2006-04-12 16:11 <a href="http://www.blogjava.net/oceanqtt/archive/2006/04/12/40672.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>composition（复合）</title><link>http://www.blogjava.net/oceanqtt/archive/2006/04/06/39636.html</link><dc:creator>蘑菇</dc:creator><author>蘑菇</author><pubDate>Thu, 06 Apr 2006 09:20:00 GMT</pubDate><guid>http://www.blogjava.net/oceanqtt/archive/2006/04/06/39636.html</guid><wfw:comment>http://www.blogjava.net/oceanqtt/comments/39636.html</wfw:comment><comments>http://www.blogjava.net/oceanqtt/archive/2006/04/06/39636.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oceanqtt/comments/commentRss/39636.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oceanqtt/services/trackbacks/39636.html</trackback:ping><description><![CDATA[composition（复合）是在一个类型的对象包含另一个类型的对象时，类型之间的关系。<br />例如：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_14_20_Open_Image" onclick="this.style.display='none'; Codehighlighter1_14_20_Open_Text.style.display='none'; Codehighlighter1_14_20_Closed_Image.style.display='inline'; Codehighlighter1_14_20_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_14_20_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_14_20_Closed_Text.style.display='none'; Codehighlighter1_14_20_Open_Image.style.display='inline'; Codehighlighter1_14_20_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Address </span><span id="Codehighlighter1_14_20_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_14_20_Open_Text"><span style="COLOR: #000000">{ <img src="http://www.blogjava.net/images/dot.gif" /> }</span></span><span style="COLOR: #000000">; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> where someone lives</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_65_71_Open_Image" onclick="this.style.display='none'; Codehighlighter1_65_71_Open_Text.style.display='none'; Codehighlighter1_65_71_Closed_Image.style.display='inline'; Codehighlighter1_65_71_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_65_71_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_65_71_Closed_Text.style.display='none'; Codehighlighter1_65_71_Open_Image.style.display='inline'; Codehighlighter1_65_71_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> PhoneNumber </span><span id="Codehighlighter1_65_71_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_65_71_Open_Text"><span style="COLOR: #000000">{ <img src="http://www.blogjava.net/images/dot.gif" /> }</span></span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_88_252_Open_Image" onclick="this.style.display='none'; Codehighlighter1_88_252_Open_Text.style.display='none'; Codehighlighter1_88_252_Closed_Image.style.display='inline'; Codehighlighter1_88_252_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_88_252_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_88_252_Closed_Text.style.display='none'; Codehighlighter1_88_252_Open_Image.style.display='inline'; Codehighlighter1_88_252_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Person </span><span id="Codehighlighter1_88_252_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_88_252_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　<img src="http://www.blogjava.net/images/dot.gif" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　std::string name; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> composed object</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">　　Address address; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ditto</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">　　PhoneNumber voiceNumber; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ditto</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">　　PhoneNumber faxNumber; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ditto</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;</span></div>composition（复合）有两个含意。composition（复合）既意味着 "has-a"（有一个），又意味着 "is-implemented-in-terms-of"（是根据……实现的）。这是因为你要在你的软件中处理两个不同的领域。你程序中的一些 objects对应你所模拟的世界里的东西，例如，people,vehicles,video frames等等。这样的 objects是 application domain（应用领域）的部分。另外的 objects纯粹是 implementation artifacts（实现的产物），例如，buffers（<a class="bluekey" href="http://www.yesky.com/key/2284/582284.html" target="_blank">缓冲区</a>），mutexes（互斥体），search trees（搜索树）等等。这些各类 objects定义应你的软件的 implementation domain（实现领域）。当 composition（复合）发生在 application domain（应用领域）的 objects之间，它表达一个 has-a（有一个）的关系，当它发生在 implementation domain（实现领域），它表达一个 is-implemented-in-terms-of（是根据……实现的）的关系<br /><font size="1"><br />来自：<a href="http://dev.yesky.com">http://dev.yesky.com</a></font><img src ="http://www.blogjava.net/oceanqtt/aggbug/39636.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oceanqtt/" target="_blank">蘑菇</a> 2006-04-06 17:20 <a href="http://www.blogjava.net/oceanqtt/archive/2006/04/06/39636.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>煲耳机</title><link>http://www.blogjava.net/oceanqtt/archive/2005/07/22/8198.html</link><dc:creator>蘑菇</dc:creator><author>蘑菇</author><pubDate>Fri, 22 Jul 2005 09:59:00 GMT</pubDate><guid>http://www.blogjava.net/oceanqtt/archive/2005/07/22/8198.html</guid><wfw:comment>http://www.blogjava.net/oceanqtt/comments/8198.html</wfw:comment><comments>http://www.blogjava.net/oceanqtt/archive/2005/07/22/8198.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oceanqtt/comments/commentRss/8198.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oceanqtt/services/trackbacks/8198.html</trackback:ping><description><![CDATA[<DIV>如今越来越多的人开始注重对音质的要求，配一副好耳机也是理所当然的事。可是大家买回来一使用发现，并没有其它人谈论的那么好。便开始怀疑自己买到的是不是假货。其实不然，真正的好耳机是需要一个听的过程，这个过程也就是我们常说的“煲”。 
<P>许多人可能不明白耳机为什么要煲。其实这就好比汽车刚买的时候需要磨合一样。耳机振膜本身在制造过程中就存在内部应力，在粘结音圈和固定在骨架上时又产生了装配应力，我们所说的煲耳机就是使这些应力逐步消失，使振膜逐步顺化发出好声的过程。 如果一开始就好好的“煲”一下耳塞，那么就会把它的震膜逐渐弄松，这样再听音乐时，震膜震动起来就会非常的自如，音质也较先前提高不少。所以煲耳机是很有必要的。</P>
<P>煲耳机需要时间和一定的技巧。首先，你需要一个可用来长时间放音的音源。其次音源中要有频响范围很宽、动态效果舒缓、层次清晰、高中低音各成分适中的音乐有这样效果的音乐要比一般音乐“煲”起来效果更明显。还有一点就是音源输出功率一定要够大，比如要“煲”DT880就不能用普通随身听，DT880是250欧的，不配耳放根本就带不起来，还怎么让震膜松动呢？一般来说，随身听只适合耳塞和一些低阻抗耳机使用。一般而言，如用计算机声卡和收音机“煲”耳塞的话，需要比较长一点的时间。而用输出功率很大的CD随身听来“煲”，时间要短一些。用调频褒也算是最方便的。</P>
<P>在这里给大家推荐几种煲的方法：</P>
<P>使用调频收音机，把收音机调到一个没有信号的频道，音量控制在20以下。这个时候所发出的兹兹的声音相当于我们通常煲机所用的白噪音的碟。新耳机买回来大概需要每天煲上8个小时，持续一周到二周。虽然这种方法褒的方法比较慢，但是比较安全的。起码不至于因为操作不当把耳机煲坏。</P>
<P>使用CD机或者MP3播放不同风格的音乐，一般来用CD机播放需要10几个小时左右，这样长的播放时间容易降低CD机的寿命。而如果用MP3播放由于其本身构造的优势，便可以长时间的播放曲子。很适合煲耳机。刚开始用轻柔一些的音乐，在较低音量下让耳机先舒缓10-30小时，然后用普通的音乐（摇滚、舞曲除外）在中等音量状态褒100-200小时；如果这时你听着高音不刺耳了，变得圆润自然，中音温暖亲切，低频再也不是混成一团的轰隆隆，而充满细节，那基本上是大功告成了。</P>
<P>另外还有些人褒耳机喜欢用音频设备，例如计算机音响等。虽然这样可以使用一些特定的软件和特定的音碟。煲耳机煲的比较专业。但小编不推荐初学者使用这方法。因为现在返修的很多耳机都是在褒机的时候方法不当坏掉的。如果你身边有比较专业的人士，那你到可以尝试这类方法。一般就是用白噪音的碟和粉红噪音的碟来交替煲。还有些是用一些特定的频率发生器来煲的。用这种方法褒的好处就是可以使耳机快速进入状态。缺点当然是如果操作不当就容易把耳机煲坏。</P>
<P>在这给大家推荐一些音乐。在人声来说。蔡琴的和王菲的声音都不错。推荐曲目有 渡口 ， 天空 。色拉.布莱曼《月亮女神》恩雅的音乐也不错。另外腾格尔的人声中气十足、爆发力极强也很适合煲机推荐曲目有天堂。类似老鹰的加洲旅馆比较经典的曲子也很合适。阎学敏《炎黄第一鼓》也是煲机的好碟，另外像惠威的试音碟曲目覆盖面很广 也非常合适用来煲耳机。</P></DIV><img src ="http://www.blogjava.net/oceanqtt/aggbug/8198.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oceanqtt/" target="_blank">蘑菇</a> 2005-07-22 17:59 <a href="http://www.blogjava.net/oceanqtt/archive/2005/07/22/8198.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>改变一生的五句话</title><link>http://www.blogjava.net/oceanqtt/archive/2005/07/21/8130.html</link><dc:creator>蘑菇</dc:creator><author>蘑菇</author><pubDate>Thu, 21 Jul 2005 07:02:00 GMT</pubDate><guid>http://www.blogjava.net/oceanqtt/archive/2005/07/21/8130.html</guid><wfw:comment>http://www.blogjava.net/oceanqtt/comments/8130.html</wfw:comment><comments>http://www.blogjava.net/oceanqtt/archive/2005/07/21/8130.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oceanqtt/comments/commentRss/8130.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oceanqtt/services/trackbacks/8130.html</trackback:ping><description><![CDATA[<P align=left>改变一生的五句话<BR><BR><BR>第一句话是：优秀是一种习惯。&nbsp;<BR></P>
<DIV>　　这句话是古希腊哲学家亚里士多德说的。如果说优秀是一种习惯，那么懒惰也是一种习惯。人出生的时候，除了脾气会因为天性而有所不同，其他的东西基本都是后天形成的，是家庭影响和教育的结果。所以，我们的一言一行都是日积月累养成的习惯。我们有的人形成了很好的习惯，有的人形成了很坏的习惯。所以我们从现在起就要把优秀变成一种习惯，使我们的优秀行为习以为常，变成我们的第二天性。让我们习惯性地去创造性思考，习惯性地去认真做事情，习惯性地对别人友好，习惯性地欣赏大自然。 <BR><BR>注解：要会装，要持续的、不间断的装，装久了就成了真的了，就成了习惯了，比如准时到会，每次都按时到会，你装装看，你装30年看看，装的时间长了就形成了习惯。&nbsp;<BR>&nbsp;<BR><BR>第二句话是：生命是一种过程。 <BR><BR>　　事情的结果尽管重要，但是做事情的过程更加重要，因为结果好了我们会更加快乐，但过程使我们的生命充实。人的生命最后的结果一定是死亡，我们不能因此说我们的生命没有意义。世界上很少有永恒。大学生谈恋爱，每天都在信誓旦旦地说我会爱你一辈子，这实际上是不真实的。统计数据表明，大学生谈恋爱的100对里有90对最后会分手，最后结婚了的还有一半会离婚。你说爱情能永恒吗？所以最真实的说法是：我今天，此时此刻正在真心地爱着你。明天也许你会失恋，失恋后我们会体验到失恋的痛苦。这种体验也是丰富你生命的一个过程。&nbsp;<BR></DIV>
<DIV>注解：生命本身其实是没有任何意义的，只是你自己赋予你的生命一种你希望实现的意义，因此享受生命的过程就是一种意义所在。 <BR></DIV>
<DIV>第三句话是：两点之间最短的距离并不一定是直线。 <BR></DIV>
<DIV>　　在人与人的关系以及做事情的过程中，我们很难直截了当就把事情做好。我们有时需要等待，有时需要合作，有时需要技巧。我们做事情会碰到很多困难和障碍，有时候我们并不一定要硬挺、硬冲，我们可以选择有困难绕过去，有障碍绕过去，也许这样做事情更加顺利。大家想一想，我们和别人说话还得想想哪句话更好听呢。尤其在中国这个比较复杂的社会中，大家要学会想办法谅解别人，要让人觉得你这个人很成熟，很不错，你才能把事情做成。 <BR></DIV>
<DIV>注解：如果你在考数学试题，一定要答两点之间直线段最短，如果你在走路，从A到B，明明可以直接过去，但所以人都不走，你最好别走，因为有陷阱。在中国办事情，直线性思维在很多地方要碰壁，这是中国特色的中国处事智慧。 <BR></DIV>
<DIV>第四句话是：只有知道如何停止的人才知道如何加快速度。 <BR></DIV>
<DIV>　　我在滑雪的时候，最大的体会就是停不下来。我刚开始学滑雪时没有请教练，看着别人滑雪，觉得很容易，不就是从山顶滑到山下吗？于是我穿上滑雪板，哧溜一下就滑下去了，结果我从山顶滑到山下，实际上是滚到山下，摔了很多个跟斗。我发现根本就不知道怎么停止、怎么保持平衡。最后我反复练习怎么在雪地上、斜坡上停下来。练了一个星期，我终于学会了在任何坡上停止、滑行、再停止。这个时候我就发现自己会滑雪了，就敢从山顶高速地往山坡下冲。因为我知道只要我想停，一转身就能停下来。只要你能停下来，你就不会撞上树、撞上石头、撞上人，你就不会被撞死。因此，只有知道如何停止的人，才知道如何高速前进。 <BR></DIV>
<DIV>注解：用汽车来比喻，宝马可以上200公里，奇瑞却只能上120公里，为什么？发动机估计不相上下，差距在刹车系统，上了200公里刹不了车，呵呵，我的天！ <BR></DIV>
<DIV>第五句话是：放弃是一种智慧，缺陷是一种恩惠。 <BR></DIV>
<DIV>　　当你拥有六个苹果的时候，千万不要把它们都吃掉，因为你把六个苹果全都吃掉，你也只吃到了六个苹果，只吃到了一种味道，那就是苹果的味道。如果你把六个苹果中的五个拿出来给别人吃，尽管表面上你丢了五个苹果，但实际上你却得到了其他五个人的友情和好感。以后你还能得到更多，当别人有了别的水果的时候，也一定会和你分享，你会从这个人手里得到一个橘子，那个人手里得到一个梨，最后你可能就得到了六种不同的水果，六种不同的味道，六种不同的颜色，六个人的友谊。人一定要学会用你拥有的东西去换取对你来说更加重要和丰富的东西。所以说，放弃是一种智慧。 <BR></DIV>
<DIV>注解：我的个人原则是，每一次放弃都必须是一次升华，否则就不要放弃；每一次选择都必须是一次升华，否则不要选择。做人最大的乐趣在于通过奋斗去获得我们想要的东西，所以有缺点意味着我们可以进一步完美，有匮乏之处意味着我们可以进一步努力。美国有一部电视片，讲的是一位富翁给后代留下了用不尽的遗产，结果他的后代全都变成了吸毒的、自杀的、进监狱的，或者精神病患者。为什么会这样呢？因为这位富翁给自己后代留下的钱太多了，以致他们不需要劳动就可以继承一大笔财产。继承一大笔财富，就几乎什么都能买到。所以，当一个人什么都不缺的时候，他的生存空间就被剥夺掉了。如果我们每天早上醒过来，感到自己今天缺点儿什么，感到自己还需要更加完美，感到自己还有追求，那是一件多么值得高兴的事情啊！</DIV><img src ="http://www.blogjava.net/oceanqtt/aggbug/8130.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oceanqtt/" target="_blank">蘑菇</a> 2005-07-21 15:02 <a href="http://www.blogjava.net/oceanqtt/archive/2005/07/21/8130.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>