﻿<?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-afrag-随笔分类-Java 技术</title><link>http://www.blogjava.net/afrag/category/4237.html</link><description>记录学习和成长的历程</description><language>zh-cn</language><lastBuildDate>Sun, 28 Mar 2010 21:01:28 GMT</lastBuildDate><pubDate>Sun, 28 Mar 2010 21:01:28 GMT</pubDate><ttl>60</ttl><item><title>Java SE 7文件操作之Path的基本操作</title><link>http://www.blogjava.net/afrag/archive/2010/03/27/316727.html</link><dc:creator>afrag</dc:creator><author>afrag</author><pubDate>Sat, 27 Mar 2010 14:45:00 GMT</pubDate><guid>http://www.blogjava.net/afrag/archive/2010/03/27/316727.html</guid><wfw:comment>http://www.blogjava.net/afrag/comments/316727.html</wfw:comment><comments>http://www.blogjava.net/afrag/archive/2010/03/27/316727.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/afrag/comments/commentRss/316727.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/afrag/services/trackbacks/316727.html</trackback:ping><description><![CDATA[<a title="开发者的天空" href="http://www.developersky.net">转自开发者的天空</a><br />
在上面的一篇文章中，我们已经说过了<span href="http://www.developersky.net/tag.php?name=Path" onclick="tagshow(event)" class="t_tag">Path</span>类的操作主要有两种：对路径的操作和对文件的操
作。这篇文章中我们就来了解一下对路径的操作。<br />
<strong><font size="2">创建Path实例</font></strong><br />
Path实例包含了指定文件或目录位置的信息，在实例化Path类时，需要指定一个或多个目录或文件名。路径的根目录不是必须的；路径信息可能仅仅是一个
目录或文件的名称。<br />
最简单的创建Path实例的方式就是使用Paths（注意这里有一个s）类的get方法：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Path&nbsp;p1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Paths.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">/tmp/foo</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
Path&nbsp;p2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Paths.get(args[</span><span style="color: #000000;">0</span><span style="color: #000000;">]);<br />
Path&nbsp;p3&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Paths.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">file:///Users/joe/FileTest.java</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span></div>
<br />
Path类接受String或URI作为参数。<br />
<br />
<strong><font size="2">获取路径信息</font></strong><br />
前面我们已经说过了，File
System一般是树形结构，因此我们可以把Path理解为按顺序存储的一系列的名称（目录名称和文件名称）。目录结构中最高一层的目录名就是序列中
index为0的那一个，目录结构中最低一层的目录名或者文件名就是序列中index为n-1的那一个（这里n是路径中层次的数目）。Path类提供方法
来通过index获取序列中的一个元素或一个子序列。<br />
随后的例子中我们使用的目录结构如下图：<br />
<span style="position: absolute; display: none;" id="attach_6" onmouseover="showMenu({'ctrlid':this.id,'pos':'13'})"><img src="http://www.developersky.net/images/satiling/attachimg.gif" border="0"  alt="" /></span>
<img src="http://www.developersky.net/attachments/month_1003/1003171457014e945c74ff7806.jpg" file="attachments/month_1003/1003171457014e945c74ff7806.jpg" id="aimg_6" onmouseover="showMenu({'ctrlid':this.id,'pos':'12'})" alt="io-dirStructure.JPG" width="469" />
<div class="t_attach" id="aimg_6_menu" style="position: absolute; display: none;">
<a href="http://www.developersky.net/attachment.php?aid=NnwzMGE3MjY0Y3wxMjY5Njk5ODM0fDNlNTJrZFNieFEwRDUzMmNwN241K0xyU1p3S2Y5dnNFeG9RaWZLOUF4UTlhNVA4&amp;nothumb=yes" title="io-dirStructure.JPG" target="_blank"><strong>下载</strong></a>
(18.96 KB)<br />
<div class="t_smallfont">2010-3-17 14:57</div>
</div>
<br />
<br />
&nbsp; &nbsp;
下面的代码定义了一个Path对象并获取其中的信息。要注意的是这些代码中除了isHidden方法外，其他的方法并不需要指定的目录或文件存在；如果不
存在，isHidden方法会抛出异常。<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Path&nbsp;path&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Paths.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">C:\\home\\joe\\foo</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Microsoft&nbsp;Windows&nbsp;syntax<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">Path&nbsp;path&nbsp;=&nbsp;Paths.get("/home/joe/foo");&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Solaris&nbsp;syntax</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">System.out.format(</span><span style="color: #000000;">"</span><span style="color: #000000;">toString:&nbsp;%s%n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;path.toString());<br />
System.out.format(</span><span style="color: #000000;">"</span><span style="color: #000000;">getName:&nbsp;%s%n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;path.getName());<br />
System.out.format(</span><span style="color: #000000;">"</span><span style="color: #000000;">getName(0):&nbsp;%s%n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;path.getName(</span><span style="color: #000000;">0</span><span style="color: #000000;">));<br />
System.out.format(</span><span style="color: #000000;">"</span><span style="color: #000000;">getNameCount:&nbsp;%d%n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;path.getNameCount());<br />
System.out.format(</span><span style="color: #000000;">"</span><span style="color: #000000;">subpath(0,2):&nbsp;%d%n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;path.subpath(</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">));<br />
System.out.format(</span><span style="color: #000000;">"</span><span style="color: #000000;">getParent:&nbsp;%s%n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;path.getParent());<br />
System.out.format(</span><span style="color: #000000;">"</span><span style="color: #000000;">getRoot:&nbsp;%s%n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;path.getRoot());<br />
System.out.format(</span><span style="color: #000000;">"</span><span style="color: #000000;">isHidden:&nbsp;%s%n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;path.isHidden());</span></div>
<br />
下面是这段代码的输出情况<br />
<table class="t_table" style="width: 98%;" bgcolor="paleturquoise" cellspacing="0">
    <tbody>
        <tr>
            <td>方法</td>
            <td>Solaris下的输出 </td>
            <td>Windows下的
            输出 </td>
            <td>备注 </td>
        </tr>
        <tr>
            <td>toString</td>
            <td>/home/joe/foo</td>
            <td>C:\home\joe\foo</td>
            <td><br />
            </td>
        </tr>
        <tr>
            <td>getName</td>
            <td>foo</td>
            <td>foo</td>
            <td>获
            取名称序列中的最后一个，也就是最底层的目录或文件名</td>
        </tr>
        <tr>
            <td>getName(0)</td>
            <td>home</td>
            <td>home</td>
            <td>获
            取名称序列中的第一个，也就是最靠近根目录的那一层。注意根目录不在名称序列中</td>
        </tr>
        <tr>
            <td>getNameCount</td>
            <td>3</td>
            <td>3</td>
            <td>获
            取名称序列的元素个数</td>
        </tr>
        <tr>
            <td>subpath(0,2)</td>
            <td>home/joe</td>
            <td>home\joe</td>
            <td>获
            取从指定的开始点到指定的结束点的子路径。注意这里包括开始点，但不包括结束点。</td>
        </tr>
        <tr>
            <td>getParent</td>
            <td>/home/joe</td>
            <td>\home\joe</td>
            <td>返
            回Path指定的目录或文件的父目录</td>
        </tr>
        <tr>
            <td>getRoot</td>
            <td>/</td>
            <td>C:\</td>
            <td>返
            回根目录</td>
        </tr>
        <tr>
            <td>isHidden</td>
            <td>false</td>
            <td>false</td>
            <td>如果文件是
            隐藏文件，或者目录是隐藏目录，返回true。因为要访问文件的属性，所以如果Path指定的目录或者文件不存在，会抛出异常。</td>
        </tr>
    </tbody>
</table>
<br />
<br />
上面的代码中我们创建Path时使用的是绝对路径，下面我们来看看创建路径时使用相对路径时，这段代码的执行结果<em><br />
</em>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Path&nbsp;path&nbsp;=&nbsp;Paths.get("sally/bar");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Solaris&nbsp;syntax</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;path&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Paths.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">sally\\bar</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Microsoft&nbsp;Windows&nbsp;syntax</span></div>
<em><br />
</em>大
家可以自行去实验一下具体的输出是什么。<br />
<br />
<strong><font size="2">去除Path中的冗余</font></strong><br />
在很多文件系统中我们使用'.'来代表当前目录，使用'..'代表父目录。在有些情况下我们创建的路径中会有冗余的路径信息，例如：<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;/home/./joe/foo<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;/home/sally/../joe/foo<br />
方法normalize会去除这些冗余信息，包括'.'或'directory/..'。上面的两个例子在去除冗余信息后都是/home/joe
/foo。<br />
要注意的是normalize方法并不去检查文件系统，它只是简单的进行语法操作。在第二个例子中，如果sally是一个指向其他的目录的符号链接，那么
去除了sally/..后可能导致Path不在指向原来的文件或目录。<br />
如果你需要清除冗余信息，又要保证结果仍然指向正确的文件或目录，可以使用toRealPath方法。在下面我们会讲到这个方法。<br />
<strong><font size="2">转换Path</font></strong><br />
有3个方法用来转换Path。<br />
<ul>
    <li>toUri方法<br />
    如果你需要将Path转换为可以在浏览器中打开的字符串格式，可以使用toUri方法，例如：</li>
</ul>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;p1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Paths.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">/home/logfile</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.format(</span><span style="color: #000000;">"</span><span style="color: #000000;">%s%n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;p1.toUri());&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;结果是&nbsp;file:</span><span style="color: #008000;">//</span><span style="color: #008000;">/home/logfile</span></div>
注意在这里即使/home/logfile'指向的目录或文件不存在，这段代码同样能够执行成功。
<ul>
    <li>toAbsolutePath
    方法<br />
    该方法将路径转换为绝对路径。如果原来的Path已经是绝对路径，该方法直接返回原有的Path对象。<br />
    我们来看看下面的例子：
    <div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
    <br />
    Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
    http://www.CodeHighlighter.com/<br />
    <br />
    --><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;path&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Paths.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">home\\joe\\foo</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;absolutePath&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;path.toAbsolutePath();<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(path&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;absolutePath);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">结果是false</span><span style="color: #008000;"><br />
    </span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;Path&nbsp;path2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Paths.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">c:\\home\\joe\\foo&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;absolutePath2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;path2.toAbsolutePath();<br />
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(path2&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;absolutePath2);</span><span style="color: #008000;">//</span><span style="color: #008000;">结果是true</span></div>
    <em></em></li>
</ul>
<em></em>同样的，toAbsolutePath方法并不需要
Path所指向的文件或目录存在。
<ul>
    <li>toRealPath方法<br />
    这个方法会返回一个已经存在的文件或目录的真实路径（如果文件或目录不存在或无法访问，该方法会抛出异常）。该方法会执行以下的操作：<br />
    如果传入的参数是true并且文件系统支持符号链接，则解析路径中存在的符号链接（如果有的话）。<br />
    如果原来的Path是相对路径，将其转换成绝对路径。<br />
    如果路径中含有冗余信息，返回的Path中这些冗余信息会被去除。</li>
</ul>
<br />
<strong><font size="2">连接两个Path</font></strong><br />
可以使用resolve方法来将两个Path连接起来。该方法的参数是一个字符串。如果该字符串代表的是一个相对路径，那么这个路径会被扩展到原来的路径
后。如果传入的字符串是一个绝对路径，那么返回的值就是传入的这个绝对路径。例如：<em><br />
</em>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;p1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Paths.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">C:\\home\\joe\\foo</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.format(</span><span style="color: #000000;">"</span><span style="color: #000000;">%s%n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;p1.resolve(</span><span style="color: #000000;">"</span><span style="color: #000000;">bar</span><span style="color: #000000;">"</span><span style="color: #000000;">));&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;结果是&nbsp;C:\home\joe\foo\bar</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Paths.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">foo</span><span style="color: #000000;">"</span><span style="color: #000000;">).resolve(</span><span style="color: #000000;">"</span><span style="color: #000000;">c:\\home\joe</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;结果是&nbsp;&nbsp;C:\home\joe</span></div>
<br />
<em><br />
</em><strong><font size="2">创建两个路径之间的路径<br />
</font></strong>这个功能说起来有些绕口，实际的功能就是创建两个指定的目录或文件之间的相对路径。例如：<em><br />
</em>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;p1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Paths.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">joe/foo</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;p2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Paths.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">sally</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span></div>
在这个例子中，由于两个路径都是相对路径，没有其他的
信息，我们会认为这两个joe和sally是同一级的兄弟目录，因此有以下的结果<em onclick="copycode($('code7'));"><br />
<br />
</em>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;p1_to_p2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p1.relativize(p2);&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;结果是&nbsp;../../sally</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;p2_to_p1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p2.relativize(p1);&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;结果是&nbsp;../joe/foo</span></div>
让我们看看另外一个例子<em><br />
</em>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;p1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Paths.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">home</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;p3&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Paths.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">home/sally/bar</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;p1_to_p3&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p1.relativize(p3);&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;结果是&nbsp;sally/bar</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;p3_to_p1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;p3.relativize(p1);&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;结果是&nbsp;../..</span></div>
在这个例子中，两个路径共享同一个节点-home，
所以结果并不是../home/sally/bar和../../../home.<br />
如果两个路径中有一个是绝对路径，另外一个是相对路径，relative方法会抛出异常。如果两个路径都是绝对路径，那么relative方法的行为和系
统相关，不同的系统可能不同。<br />
我在Windows操作系统下实验了一下，如果两个路径属于同一个硬盘，那么可以执行成功，否则会抛出异常。<em><br />
</em>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Path&nbsp;path1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Paths.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">c:\\abcd\\efg</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
Path&nbsp;path2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Paths.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">c:\\temp</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
System.out.println(path1.relativize(path2));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">结果是..\..\temp</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">System.out.println(path2.relativize(path1));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">结果是..\abcd\efg</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
Path&nbsp;path3&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Paths.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">c:\\abcd\\efg</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
Path&nbsp;path4&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Paths.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">d:\\temp</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
System.out.println(path3.relativize(path4));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">抛出异常</span></div>
<br />
<em><br />
</em><strong><font size="2">Path
的比较</font></strong><br />
Path提供<span href="http://www.developersky.net/tag.php?name=equals" onclick="tagshow(event)" class="t_tag">equals</span>方法来检查两个Path是否相等。但是这里
要注意的是比较的并不是两个Path是否指向同一个目录或者文件。请看下面的例子：<em><br />
</em>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">Path&nbsp;path1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Paths.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">abcd\\123</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
Path&nbsp;path2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Paths.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">abcd\\123</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
Path&nbsp;path3&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Paths.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">abcd\\.\\123</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
System.out.println(path1.equals(path2));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">true</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">System.out.println(path1.equals(path3));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">false</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">System.out.println(path1.equals(path3.normalize()));&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">true</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">System.out.println(path1.equals(path1.toAbsolutePath()));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">false</span></div>
<br />
Path
类还提供了startsWith和endsWith方法，这两个方法用来检查路径是否以指定的字符串开始或者结束，例如：<em><br />
</em>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;path&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;otherPath&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;beginning&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Paths.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">/home</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;ending&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Paths.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">foo</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(path.equals(otherPath))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">equality&nbsp;logic&nbsp;here</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(path.startsWith(beginning))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">path&nbsp;begins&nbsp;with&nbsp;"/home"</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(path.endsWith(ending))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">path&nbsp;ends&nbsp;with&nbsp;"foo"</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
Path类实现了Iterable接口，iterator方法会返回一个Iterator对象，该对象中的第一个元素就是原
路径中最上层（最靠近根节点）的目录。下面是使用这个方法的例子：<em><br />
</em>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;path&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(Path&nbsp;name:&nbsp;path)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
Path类还实现了Comparable接口，因此可以使用compareTo来比较两个Path。比较的算法和结果是和文
件系统的提供者和系统平台相关的。大家在使用之前，最后先实验一下。<br />
Path类还提供了一个方法isSameFile来检查两个Path是否指向同一个目录或文件。如果作为参数的Path为null，那么会直接返回
false，不会去检查Path指向的文件是否存在。如果两Path来自不同的文件系统提供者，那么也会直接返回false，不会去检查文件或目录是否存
在。如果两个Path执行equals方法的返回结果为true，那么这个方法直接返回true，也不会去检查文件或目录是否存在。其他的情况下是否会去
打开或访问Path指向的文件或目录是与具体的实现相关的，也就是说不同的JDK/JRE可能会有不同的行为。<br />
<strong><font size="2">验证文件或目录是否存在<br />
</font></strong>上面所介绍的很多方法都不会去验证Path指向的文件或目录是否存在，只是操作Path实例自身。但是在有些情况下，你
需要访问文件系统来验证文件、目录存在与否，这时你可以使用exists和notExists方法。需要注意的是!path.exists()并不等于
path.notExists()。当你调用这两个方法时，有以下3中情况：<br />
<ul>
    <li>文件或者目录被证实存在</li>
    <li>文件或者目录被证实不存在</li>
    <li>不知道文件或目录是否存在。当程序没有访问这个文
    件或目录的权限的时候这个情况会发生。</li>
</ul>
<br />
如果exists()和notExists()都返回false，说明无法验证该文件是否存在。<br />
<br />
在下面一篇文章中，我们会介绍怎样进行文件的操作。
<img src ="http://www.blogjava.net/afrag/aggbug/316727.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/afrag/" target="_blank">afrag</a> 2010-03-27 22:45 <a href="http://www.blogjava.net/afrag/archive/2010/03/27/316727.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java SE 7 文件操作特性之Path概念</title><link>http://www.blogjava.net/afrag/archive/2010/03/25/316607.html</link><dc:creator>afrag</dc:creator><author>afrag</author><pubDate>Thu, 25 Mar 2010 15:34:00 GMT</pubDate><guid>http://www.blogjava.net/afrag/archive/2010/03/25/316607.html</guid><wfw:comment>http://www.blogjava.net/afrag/comments/316607.html</wfw:comment><comments>http://www.blogjava.net/afrag/archive/2010/03/25/316607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/afrag/comments/commentRss/316607.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/afrag/services/trackbacks/316607.html</trackback:ping><description><![CDATA[<strong>转载自<a href="http://www.developersky.net">开发者的天空</a><br />
1. <span href="http://www.developersky.net/tag.php?name=Path" onclick="tagshow(event)" class="t_tag">Path</span>的概念</strong><br />
文件系统会把文件进行组织并存放在媒介上，通常是一个或多个硬盘上。目前使用的大多数的文件系统是以树形的方式来存储文件的。在树的顶端是一个（或多个）
根节点，在根节点之下是文件和目录，目录下又可以包含文件和目录。理论上可以这样一层层的一直嵌套下去（当然实际中是不可能的，例如Windows系统对
路径的长度有限制）。<br />
下面的图中展示了一个包含一个根节点的目录树。（在Windows系统中支持多个根节点，例如C:\和D:\分别是一个根节点。）<br />
<span style="position: absolute; display: none;" id="attach_4" onmouseover="showMenu({'ctrlid':this.id,'pos':'13'})"><img src="http://www.developersky.net/images/default/attachimg.gif" alt="" border="0" /></span>
<img src="http://www.developersky.net/attachments/month_1003/1003162257bb4d64c624889530.jpg" file="attachments/month_1003/1003162257bb4d64c624889530.jpg" id="aimg_4" onmouseover="showMenu({'ctrlid':this.id,'pos':'12'})" alt="io-dirStructure.JPG" width="469" />
<div class="t_attach" id="aimg_4_menu" style="position: absolute; z-index: 301; opacity: 1; left: 220.5px; top: 391.2px; display: none;">
<a href="http://www.developersky.net/attachment.php?aid=NHwwOTU4Y2U5N3wxMjY5NTI5MjI3fGEwOWJPbnZobjBxcis2K2hTT0k5WmpwZE9WM1JSb0E2Nm1SUXBIbjZXc2hwcXo0&amp;nothumb=yes" title="io-dirStructure.JPG" target="_blank"><strong>下载</strong></a>
(18.96 KB)<br />
<div class="t_smallfont">2010-3-16 22:57</div>
</div>
<br />
Path能够唯一的标识文件系统中的某一个文件。例如上面图中的statusReport文件在Windows系统中就可以使用以下的Path来标识：<br />
c:\home\sally\statusReport<br />
在solaris系统中，其path为<br />
/home/sally/statusReport.<br />
Path中的分隔符在不同的文件系统中是不同的，例如在Windows系统中使用\，在Solaris系统中使用/。<br />
Path又可以分为绝对路径和相对路径。绝对路径总是含有根节点和用来定位文件的完整的目录列表。例如/home/sally/statusReport
就是绝对路径。相对路径需要和另外的路径结合在一起才能够确定一个文件。例如加哦加哦哦joe/foo就是一个相对路径，如果没有其他的信息，程序就没有
办法定位这个文件。我们必须说这个是相对/home的相对路径，这样我们才能够找到它。<br />
除了我们熟悉的目录和文件之外，有一些文件系统中还支持符号链接（symbolic link),也称为symlink或soft
link。一个符号链接是一个特殊的文件，它实际上是另外一个链接的引用。在大多数情况下符号链接对应用程序是透明的，对符号链接的操作会自动的重定向到
链接所指向的目的地，除非操作是删除这个符号链接、重命名这个符号链接或修改符号链接的目的地。<br />
在下面的图中，logFile对于用户来说就是一个常规的文件，但是实际上是一个符号链接，链接到dir/logs/HomeLogFile文件。
HomeLogFile是这个链接的目的地。<br />
<span style="position: absolute; display: none;" id="attach_5" onmouseover="showMenu({'ctrlid':this.id,'pos':'13'})"><img src="http://www.developersky.net/images/default/attachimg.gif" alt="" border="0" /></span>
<img src="http://www.developersky.net/attachments/month_1003/1003162257480cd0472b91b97d.jpg" file="attachments/month_1003/1003162257480cd0472b91b97d.jpg" class="zoom" onclick="zoom(this, this.src)" id="aimg_5" onmouseover="showMenu({'ctrlid':this.id,'pos':'12'})" alt="io-symlink.jpg" width="600" />
<div class="t_attach" id="aimg_5_menu" style="position: absolute; z-index: 301; opacity: 1; left: 220.5px; top: 1010px; display: none;">
<a href="http://www.developersky.net/attachment.php?aid=NXwwZDRkNGQ4MXwxMjY5NTI5MjI3fGEwOWJPbnZobjBxcis2K2hTT0k5WmpwZE9WM1JSb0E2Nm1SUXBIbjZXc2hwcXo0&amp;nothumb=yes" title="io-symlink.jpg" target="_blank"><strong>下载</strong></a> (23.49
KB)<br />
<div class="t_smallfont">2010-3-16 22:57</div>
</div>
<br />
不恰当的使用符号链接会导致循环引用，例如目录A是一个符号链接，指向目录B，目录B下有一个子目录是符号链接，指向目录A的父目录。这样，当程序企图递
归的遍历整个目录树时，就会出问题。幸运的是，这个问题已经被发现了，并且不会导致程序的死循环。<br />
<hr class="solidline" />
<br />
<strong>2.Path类</strong><br />
Path类是JDK7新引入的一个类，该类是java.io.file包的基石。<br />
和类的名称所展示的一样，Path类就是文件系统中path概念的程序表现。Path对象包含了文件名和目录列表，这些信息可以用来创建path，并且用
来检验、定位和操作文件。<br />
Path实例是和底层操作系统相关的。在Solaris系统中，Path使用Solaris的句法(/home/joe/foo)；在Window操作系
统中，Path会使用Window的句法(C:\home\joe\foo)。因此Path不是操作系统无关的。你不能够比较一个来自Solaris文件
系统的Path和一个来自Windows文件系统的Path并期望它们相等，在目录结构和文件完全一样的时候也不行。<br />
Path对应的文件或者目录可以不存在。我们可以以不同的方式创建Path实例并操作它：扩展路径、抽取路径的一部分、和其他的Path比较。我们也可以
检查Path对应的目录或文件是否存在、<span href="http://www.developersky.net/tag.php?name=%E5%88%9B%E5%BB%BA%E6%96%87%E4%BB%B6" onclick="tagshow(event)" class="t_tag">创建文件</span>或目录、打开或删除文件、修改许可权限等。<br />
Path类是能够区分符号链接的。所有的Path的方法要么会检测是否是符号链接并执行不同的操作，或者提供了一个选择来使用户能够配置当遇到符号链接的
时候执行什么操作。<br />
Path类提供了很多易于使用的特性，Path类的方法可以分成两类：<br />
<ul><br />
    <li>路径操作—返回路径的一部分如根节点、名称、父目录的方法或者其他操作路径的方法。<br />
    </li>
    <li><span href="http://www.developersky.net/tag.php?name=%E6%96%87%E4%BB%B6%E6%93%8D%E4%BD%9C" onclick="tagshow(event)" class="t_tag">文件操作</span>—创建文件、打开文件、创建目录、删除文件、
    拷贝文件等操作的方法。<br />
    </li>
</ul>
在下一篇文章中，我们会具体介绍Path类的这些方法。
<img src ="http://www.blogjava.net/afrag/aggbug/316607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/afrag/" target="_blank">afrag</a> 2010-03-25 23:34 <a href="http://www.blogjava.net/afrag/archive/2010/03/25/316607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在java程序中如何知道数据库表的主键</title><link>http://www.blogjava.net/afrag/archive/2006/01/20/28737.html</link><dc:creator>afrag</dc:creator><author>afrag</author><pubDate>Fri, 20 Jan 2006 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/afrag/archive/2006/01/20/28737.html</guid><wfw:comment>http://www.blogjava.net/afrag/comments/28737.html</wfw:comment><comments>http://www.blogjava.net/afrag/archive/2006/01/20/28737.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/afrag/comments/commentRss/28737.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/afrag/services/trackbacks/28737.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有同事问到在程序中怎样知道数据库表中那些字段是主键。当时不知道，晚上回来看了看</SPAN><SPAN lang=EN-US>JDK</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的文档。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在使用</SPAN><SPAN lang=EN-US>JDBC</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来查询数据库的时候，通常的步骤是：</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">1．<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注册驱动程序</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">2．<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">获取数据库连接</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">3．<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">执行查询语句</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">4．<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关闭连接。</SPAN><SPAN lang=EN-US><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在获得数据库连接后，就可以通过</SPAN><SPAN lang=EN-US>getMetaData</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（）方法来获取</SPAN><SPAN lang=EN-US>DatabaseMetaData;</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">然后通过</SPAN><SPAN lang=EN-US>DatabaseMetaData</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN-US>getPrimaryKeys ()</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法来获取主键的信息。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面是我做的示例程序，该程序在</SPAN><SPAN lang=EN-US>JBuilder2005</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">＋</SPAN><SPAN lang=EN-US>oracle8i</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下通过：</SPAN><SPAN lang=EN-US><BR>import java.sql.*;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>import javax.sql.*;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>public class TestJDBC {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>public TestJDBC() {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>public static void main(String[] args) throws SQLException {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Connection con = null;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Statement st = null;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>ResultSet rst = null;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>try{</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>//</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注册数据库驱动程序</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Class.forName("oracle.jdbc.driver.OracleDriver");</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>//</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">获取数据库连接</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>con = DriverManager.getConnection("jdbc:oracle:thin:@10.60.203.80:1521:TestDB","123","123");</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>//</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">获取主键信息</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>rst = con.getMetaData().getPrimaryKeys(null,null,"USER");</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>//</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">打印主键信息</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>if (!rst.isAfterLast()) {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>rst.next();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println(rst.getString("TABLE_NAME") + "<SPAN style="mso-spacerun: yes">&nbsp; </SPAN>" +<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN>rst.getString("COLUMN_NAME"));<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>catch (Exception e){<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println(e.getLocalizedMessage());<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>finally{<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>try{</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-tab-count: 4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>//</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">关闭连接</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>if (rst != null)<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>rst.close();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>if (con != null)<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>con.close();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>catch (SQLException e){<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>throw e;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </SPAN>}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>}</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上面的程序中</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在获取主键信息的时候</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>rst = con.getMetaData().getPrimaryKeys(null,null,"USER");</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用来获取主键信息。关于该函数的详细信息，请参阅</SPAN><SPAN lang=EN-US>JDK</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的文档。这里要说的是，在测试中发现第三个参数（数据库表名）是大小写敏感的，如果写成</SPAN><SPAN lang=EN-US>user</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是查不到结果的。</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></P><img src ="http://www.blogjava.net/afrag/aggbug/28737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/afrag/" target="_blank">afrag</a> 2006-01-20 10:52 <a href="http://www.blogjava.net/afrag/archive/2006/01/20/28737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Java的封装性</title><link>http://www.blogjava.net/afrag/archive/2005/10/29/17348.html</link><dc:creator>afrag</dc:creator><author>afrag</author><pubDate>Sat, 29 Oct 2005 08:26:00 GMT</pubDate><guid>http://www.blogjava.net/afrag/archive/2005/10/29/17348.html</guid><wfw:comment>http://www.blogjava.net/afrag/comments/17348.html</wfw:comment><comments>http://www.blogjava.net/afrag/archive/2005/10/29/17348.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/afrag/comments/commentRss/17348.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/afrag/services/trackbacks/17348.html</trackback:ping><description><![CDATA[<P>今天在看Spring in Action，看到了一个很有意思的例子。<BR>假如你编写了一个类:<BR><BR>public class ClassA{<BR>      private String fieldA;<BR><BR>      public ClassA(){<BR>         fieldA = "This is Class A";<BR>     }<BR><BR>      public myPrint(){<BR>            System.out.println(fieldA);<BR>      }<BR>}<BR><BR>OK。按照面向对象的思想，其他的类应该不能够修改ClassA的fieldA字段吧？因此无论什么时候你调用ClassA的myPrint方法，都应该打印的是“This is Class A”。<BR>      但是，实际情况并不是如此，请看下面的例子：<BR>import java.lang.reflect.Field;<BR>public class  TestChangeApp<BR>{<BR>    public static void main(String[] args)<BR>    {<BR>        System.out.println("Begin to test change.");<BR>        ClassA test = new ClassA();<BR>        test.myPrint();</P>
<P>        Field[] fields = test.getClass().getDeclaredFields();<BR>  <BR>        try<BR>        {<BR>            for (int i=0;i<fields.length ;i++ )<BR>            {<BR>                if (fields[i].getType().equals(java.lang.String.class)){<BR>                   fields[i].setAccessible(true);<BR>                   fields[i].set(test, "This field have been changed!");<BR>               }<BR>            }<BR>   <BR>        }<BR>        catch (Exception e)<BR>        {<BR>        }</P>
<P>        test.myPrint();<BR>    }<BR>}<BR>运行结果是什么呢？是<BR>Begin to test change.<BR>This is ClassA<BR>This field have been changed!<BR>也就是说，在TestChangeApp类中，可以修改ClassA的私有成员变量。</P><img src ="http://www.blogjava.net/afrag/aggbug/17348.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/afrag/" target="_blank">afrag</a> 2005-10-29 16:26 <a href="http://www.blogjava.net/afrag/archive/2005/10/29/17348.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>