﻿<?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-桔子园-随笔分类-J2SE</title><link>http://www.blogjava.net/orangelizq/category/26251.html</link><description>orangelizq</description><language>zh-cn</language><lastBuildDate>Mon, 17 Mar 2008 10:03:14 GMT</lastBuildDate><pubDate>Mon, 17 Mar 2008 10:03:14 GMT</pubDate><ttl>60</ttl><item><title>[转]JDK命令简单总结</title><link>http://www.blogjava.net/orangelizq/archive/2008/01/12/174767.html</link><dc:creator>桔子汁</dc:creator><author>桔子汁</author><pubDate>Sat, 12 Jan 2008 02:48:00 GMT</pubDate><guid>http://www.blogjava.net/orangelizq/archive/2008/01/12/174767.html</guid><wfw:comment>http://www.blogjava.net/orangelizq/comments/174767.html</wfw:comment><comments>http://www.blogjava.net/orangelizq/archive/2008/01/12/174767.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/orangelizq/comments/commentRss/174767.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/orangelizq/services/trackbacks/174767.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/orangelizq/archive/2008/01/12/174767.html'>阅读全文</a><img src ="http://www.blogjava.net/orangelizq/aggbug/174767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/orangelizq/" target="_blank">桔子汁</a> 2008-01-12 10:48 <a href="http://www.blogjava.net/orangelizq/archive/2008/01/12/174767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] 在Servlet与JSP中取得当前文件所在的相对路径与绝对路径</title><link>http://www.blogjava.net/orangelizq/archive/2008/01/12/174766.html</link><dc:creator>桔子汁</dc:creator><author>桔子汁</author><pubDate>Sat, 12 Jan 2008 02:45:00 GMT</pubDate><guid>http://www.blogjava.net/orangelizq/archive/2008/01/12/174766.html</guid><wfw:comment>http://www.blogjava.net/orangelizq/comments/174766.html</wfw:comment><comments>http://www.blogjava.net/orangelizq/archive/2008/01/12/174766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/orangelizq/comments/commentRss/174766.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/orangelizq/services/trackbacks/174766.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/orangelizq/archive/2008/01/12/174766.html'>阅读全文</a><img src ="http://www.blogjava.net/orangelizq/aggbug/174766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/orangelizq/" target="_blank">桔子汁</a> 2008-01-12 10:45 <a href="http://www.blogjava.net/orangelizq/archive/2008/01/12/174766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] 关于Java栈与堆的思考</title><link>http://www.blogjava.net/orangelizq/archive/2008/01/12/174764.html</link><dc:creator>桔子汁</dc:creator><author>桔子汁</author><pubDate>Sat, 12 Jan 2008 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/orangelizq/archive/2008/01/12/174764.html</guid><wfw:comment>http://www.blogjava.net/orangelizq/comments/174764.html</wfw:comment><comments>http://www.blogjava.net/orangelizq/archive/2008/01/12/174764.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/orangelizq/comments/commentRss/174764.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/orangelizq/services/trackbacks/174764.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/orangelizq/archive/2008/01/12/174764.html'>阅读全文</a><img src ="http://www.blogjava.net/orangelizq/aggbug/174764.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/orangelizq/" target="_blank">桔子汁</a> 2008-01-12 10:42 <a href="http://www.blogjava.net/orangelizq/archive/2008/01/12/174764.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] Java 文件路径</title><link>http://www.blogjava.net/orangelizq/archive/2008/01/12/174762.html</link><dc:creator>桔子汁</dc:creator><author>桔子汁</author><pubDate>Sat, 12 Jan 2008 02:41:00 GMT</pubDate><guid>http://www.blogjava.net/orangelizq/archive/2008/01/12/174762.html</guid><wfw:comment>http://www.blogjava.net/orangelizq/comments/174762.html</wfw:comment><comments>http://www.blogjava.net/orangelizq/archive/2008/01/12/174762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/orangelizq/comments/commentRss/174762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/orangelizq/services/trackbacks/174762.html</trackback:ping><description><![CDATA[<div class="postText">Java 文件路径<br />
<br />
<span style="color: #0000ff">1.如何获得当前文件路径</span><br />
<br />
常用：<br />
<br />
字符串类型：System.getProperty("user.dir");<br />
<br />
综合：<br />
<br />
<pre>package com.zcjl.test.base;<br />
import java.io.File;<br />
public class Test {<br />
&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args) throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.currentThread().getContextClassLoader()<wbr></wbr>.getResource(""));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Test.class.getClassLoader().getResource(""));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(ClassLoader.getSystemResource(""));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Test.class.getResource(""));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Test.class.getResource("/"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(new File("").getAbsolutePath());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(System.getProperty("user.dir"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</pre>
<br />
<br />
<span style="color: #0000ff">2.Web服务中</span><br />
<br />
(1).Weblogic<br />
<br />
WebApplication的系统文件根目录是你的weblog<wbr></wbr>ic安装所在根目录。<br />
例如：如果你的weblogic安装在c:\bea<wbr></wbr>\weblogic700..... <br />
那么，你的文件根路径就是c:\.<br />
所以，有两种方式能够让你访问你的服务器端的文件：<br />
a.使用绝对路径：<br />
比如将你的参数文件放在c:\yourconfig<wbr></wbr>\yourconf.properties，<br />
直接使用 new FileInputStream("yourconfig<wbr></wbr>/yourconf.properties");<br />
b.使用相对路径：<br />
相对路径的根目录就是你的webapplication的根路径<wbr></wbr>，即WEB-INF的上一级目录，将你的参数文件放在yourwe<wbr></wbr>bapp\yourconfig\yourconf<wbr></wbr>.properties， <br />
这样使用：<br />
new FileInputStream("./yourconfig<wbr></wbr>/yourconf.properties");<br />
这两种方式均可，自己选择。<br />
<br />
(2).Tomcat<br />
<br />
在类中输出System.getProperty("user.dir");显示的是%Tomcat_Home%/bin<br />
<br />
(3).Resin<br />
<br />
不是你的JSP放的相对路径,是JSP引擎执行这个JSP编译成S<wbr></wbr>ERVLET <br />
的路径为根.比如用新建文件法测试File f = new File("a.htm");<br />
这个a.htm在resin的安装目录下 <br />
<br />
(4).如何读相对路径哪？<br />
<br />
在Java文件中getResource或getResource<wbr></wbr>AsStream均可<br />
<br />
例：getClass().getResourceAsStrea<wbr></wbr>m(filePath);//filePath可以是"<wbr></wbr>/filename",这里的/代表web发布根路径下WEB<wbr></wbr>-INF/classes <br />
<br />
(5).获得文件真实路径<br />
<br />
string&nbsp;&nbsp;file_real_path=request.getRealPath("mypath/filename");&nbsp;&nbsp;<br />
<br />
通常使用request.getRealPath("/");&nbsp;&nbsp;<br />
<br />
<span style="color: #0000ff"><br />
3.文件操作的类<br />
</span><br />
<pre>import java.io.*;<br />
import java.net.*;<br />
import java.util.*;<br />
//import javax.swing.filechooser.*;<br />
//import org.jr.swing.filter.*;<br />
<br />
/**<br />
* 此类中封装一些常用的文件操作。<br />
* 所有方法都是静态方法，不需要生成此类的实例，<br />
* 为避免生成此类的实例，构造方法被申明为private类型的。<br />
* @since&nbsp;&nbsp;0.1<br />
*/<br />
<br />
public class FileUtil {<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 私有构造方法，防止类的实例化，因为工具类不需要实例化。<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;private FileUtil() {<br />
<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 修改文件的最后访问时间。<br />
&nbsp;&nbsp; * 如果文件不存在则创建该文件。<br />
&nbsp;&nbsp; * &lt;b&gt;目前这个方法的行为方式还不稳定，主要是方法有些信息输出<wbr></wbr>，这些信息输出是否保留还在考<br />
<br />
虑中。&lt;/b&gt;<br />
&nbsp;&nbsp; * @param file 需要修改最后访问时间的文件。<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.1<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static void touch(File file) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;long currentTime = System.currentTimeMillis();<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (!file.exists()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println("file not found:" + file.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println("Create a new file:" + file.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (file.createNewFile()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;System.out.println("Succeeded!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;System.err.println("Create file failed!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;System.err.println("Create file failed!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;boolean result = file.setLastModified(currentTime);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (!result) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;System.err.println("touch failed: " + file.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 修改文件的最后访问时间。<br />
&nbsp;&nbsp; * 如果文件不存在则创建该文件。<br />
&nbsp;&nbsp; * &lt;b&gt;目前这个方法的行为方式还不稳定，主要是方法有些信息输出<wbr></wbr>，这些信息输出是否保留还在考<br />
<br />
虑中。&lt;/b&gt;<br />
&nbsp;&nbsp; * @param fileName 需要修改最后访问时间的文件的文件名。<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.1<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static void touch(String fileName) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;File file = new File(fileName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;touch(file);<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 修改文件的最后访问时间。<br />
&nbsp;&nbsp; * 如果文件不存在则创建该文件。<br />
&nbsp;&nbsp; * &lt;b&gt;目前这个方法的行为方式还不稳定，主要是方法有些信息输出<wbr></wbr>，这些信息输出是否保留还在考<br />
<br />
虑中。&lt;/b&gt;<br />
&nbsp;&nbsp; * @param files 需要修改最后访问时间的文件数组。<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.1<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static void touch(File[] files) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; files.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;touch(files);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 修改文件的最后访问时间。<br />
&nbsp;&nbsp; * 如果文件不存在则创建该文件。<br />
&nbsp;&nbsp; * &lt;b&gt;目前这个方法的行为方式还不稳定，主要是方法有些信息输出<wbr></wbr>，这些信息输出是否保留还在考<br />
<br />
虑中。&lt;/b&gt;<br />
&nbsp;&nbsp; * @param fileNames 需要修改最后访问时间的文件名数组。<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.1<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static void touch(String[] fileNames) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;File[] files = new File[fileNames.length];<br />
&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; fileNames.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;files = new File(fileNames);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;touch(files);<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 判断指定的文件是否存在。<br />
&nbsp;&nbsp; * @param fileName 要判断的文件的文件名<br />
&nbsp;&nbsp; * @return 存在时返回true，否则返回false。<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.1<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static boolean isFileExist(String fileName) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return new File(fileName).isFile();<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 创建指定的目录。<br />
&nbsp;&nbsp; * 如果指定的目录的父目录不存在则创建其目录书上所有需要的父目录。<br />
&nbsp;&nbsp; * &lt;b&gt;注意：可能会在返回false的时候创建部分父目录。&lt;<wbr></wbr>/b&gt;<br />
&nbsp;&nbsp; * @param file 要创建的目录<br />
&nbsp;&nbsp; * @return 完全创建成功时返回true，否则返回false。<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.1<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static boolean makeDirectory(File file) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;File parent = file.getParentFile();<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (parent != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return parent.mkdirs();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 创建指定的目录。<br />
&nbsp;&nbsp; * 如果指定的目录的父目录不存在则创建其目录书上所有需要的父目录。<br />
&nbsp;&nbsp; * &lt;b&gt;注意：可能会在返回false的时候创建部分父目录。&lt;<wbr></wbr>/b&gt;<br />
&nbsp;&nbsp; * @param fileName 要创建的目录的目录名<br />
&nbsp;&nbsp; * @return 完全创建成功时返回true，否则返回false。<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.1<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static boolean makeDirectory(String fileName) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;File file = new File(fileName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;return makeDirectory(file);<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 清空指定目录中的文件。<br />
&nbsp;&nbsp; * 这个方法将尽可能删除所有的文件，但是只要有一个文件没有被删除都<wbr></wbr>会返回false。<br />
&nbsp;&nbsp; * 另外这个方法不会迭代删除，即不会删除子目录及其内容。<br />
&nbsp;&nbsp; * @param directory 要清空的目录<br />
&nbsp;&nbsp; * @return 目录下的所有文件都被成功删除时返回true，否则返回false<wbr></wbr>.<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.1<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static boolean emptyDirectory(File directory) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;boolean result = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;File[] entries = directory.listFiles();<br />
&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; entries.length; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!entries.delete()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;return true;<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 清空指定目录中的文件。<br />
&nbsp;&nbsp; * 这个方法将尽可能删除所有的文件，但是只要有一个文件没有被删除都<wbr></wbr>会返回false。<br />
&nbsp;&nbsp; * 另外这个方法不会迭代删除，即不会删除子目录及其内容。<br />
&nbsp;&nbsp; * @param directoryName 要清空的目录的目录名<br />
&nbsp;&nbsp; * @return 目录下的所有文件都被成功删除时返回true，否则返回false<wbr></wbr>。<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.1<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static boolean emptyDirectory(String directoryName) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;File dir = new File(directoryName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;return emptyDirectory(dir);<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 删除指定目录及其中的所有内容。<br />
&nbsp;&nbsp; * @param dirName 要删除的目录的目录名<br />
&nbsp;&nbsp; * @return 删除成功时返回true，否则返回false。<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.1<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static boolean deleteDirectory(String dirName) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return deleteDirectory(new File(dirName));<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 删除指定目录及其中的所有内容。<br />
&nbsp;&nbsp; * @param dir 要删除的目录<br />
&nbsp;&nbsp; * @return 删除成功时返回true，否则返回false。<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.1<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static boolean deleteDirectory(File dir) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;if ( (dir == null) || !dir.isDirectory()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new IllegalArgumentException(<wbr></wbr>"Argument " + dir +<br />
&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;<wbr></wbr>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " is not a directory. ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;File[] entries = dir.listFiles();<br />
&nbsp;&nbsp;&nbsp;&nbsp;int sz = entries.length;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; sz; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (entries.isDirectory()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!deleteDirectory(entries)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!entries.delete()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (!dir.delete()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;return true;<br />
&nbsp;&nbsp;}<br />
<br />
<br />
<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 返回文件的URL地址。<br />
&nbsp;&nbsp; * @param file 文件<br />
&nbsp;&nbsp; * @return 文件对应的的URL地址<br />
&nbsp;&nbsp; * @throws MalformedURLException<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.4<br />
&nbsp;&nbsp; * @deprecated 在实现的时候没有注意到File类本身带一个toURL方法将文件<wbr></wbr>路径转换为URL。<br />
&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 请使用File.toURL方法。<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static URL getURL(File file) throws MalformedURLException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;String fileURL = "file:/" + file.getAbsolutePath();<br />
&nbsp;&nbsp;&nbsp;&nbsp;URL url = new URL(fileURL);<br />
&nbsp;&nbsp;&nbsp;&nbsp;return url;<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 从文件路径得到文件名。<br />
&nbsp;&nbsp; * @param filePath 文件的路径，可以是相对路径也可以是绝对路径<br />
&nbsp;&nbsp; * @return 对应的文件名<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.4<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static String getFileName(String filePath) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;File file = new File(filePath);<br />
&nbsp;&nbsp;&nbsp;&nbsp;return file.getName();<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 从文件名得到文件绝对路径。<br />
&nbsp;&nbsp; * @param fileName 文件名<br />
&nbsp;&nbsp; * @return 对应的文件路径<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.4<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static String getFilePath(String fileName) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;File file = new File(fileName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;return file.getAbsolutePath();<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 将DOS/Windows格式的路径转换为UNIX<wbr></wbr>/Linux格式的路径。<br />
&nbsp;&nbsp; * 其实就是将路径中的"\"全部换为"/"，因为在某些情况下我们转<wbr></wbr>换为这种方式比较方便，<br />
&nbsp;&nbsp; * 某中程度上说"/"比"\"更适合作为路径分隔符，而且DOS<wbr></wbr>/Windows也将它当作路径分隔符。<br />
&nbsp;&nbsp; * @param filePath 转换前的路径<br />
&nbsp;&nbsp; * @return 转换后的路径<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.4<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static String toUNIXpath(String filePath) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return filePath.replace('\\', '/');<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 从文件名得到UNIX风格的文件绝对路径。<br />
&nbsp;&nbsp; * @param fileName 文件名<br />
&nbsp;&nbsp; * @return 对应的UNIX风格的文件路径<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.4<br />
&nbsp;&nbsp; * @see #toUNIXpath(String filePath) toUNIXpath<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static String getUNIXfilePath(String fileName) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;File file = new File(fileName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;return toUNIXpath(file.getAbsolutePath());<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 得到文件的类型。<br />
&nbsp;&nbsp; * 实际上就是得到文件名中最后一个"."后面的部分。<br />
&nbsp;&nbsp; * @param fileName 文件名<br />
&nbsp;&nbsp; * @return 文件名中的类型部分<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.5<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static String getTypePart(String fileName) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;int point = fileName.lastIndexOf('.');<br />
&nbsp;&nbsp;&nbsp;&nbsp;int length = fileName.length();<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (point == -1 || point == length - 1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return "";<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return fileName.substring(point + 1, length);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 得到文件的类型。<br />
&nbsp;&nbsp; * 实际上就是得到文件名中最后一个"."后面的部分。<br />
&nbsp;&nbsp; * @param file 文件<br />
&nbsp;&nbsp; * @return 文件名中的类型部分<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.5<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static String getFileType(File file) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return getTypePart(file.getName());<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 得到文件的名字部分。<br />
&nbsp;&nbsp; * 实际上就是路径中的最后一个路径分隔符后的部分。<br />
&nbsp;&nbsp; * @param fileName 文件名<br />
&nbsp;&nbsp; * @return 文件名中的名字部分<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.5<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static String getNamePart(String fileName) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;int point = getPathLsatIndex(fileName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;int length = fileName.length();<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (point == -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return fileName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;else if (point == length - 1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int secondPoint = getPathLsatIndex(fileName, point - 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (secondPoint == -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (length == 1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return fileName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return fileName.substring(0, point);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return fileName.substring(secondPoint + 1, point);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return fileName.substring(point + 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 得到文件名中的父路径部分。<br />
&nbsp;&nbsp; * 对两种路径分隔符都有效。<br />
&nbsp;&nbsp; * 不存在时返回""。<br />
&nbsp;&nbsp; * 如果文件名是以路径分隔符结尾的则不考虑该分隔符，例如"<wbr></wbr>/path/"返回""。<br />
&nbsp;&nbsp; * @param fileName 文件名<br />
&nbsp;&nbsp; * @return 父路径，不存在或者已经是父目录时返回""<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.5<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static String getPathPart(String fileName) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;int point = getPathLsatIndex(fileName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;int length = fileName.length();<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (point == -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return "";<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;else if (point == length - 1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int secondPoint = getPathLsatIndex(fileName, point - 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (secondPoint == -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return "";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return fileName.substring(0, secondPoint);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return fileName.substring(0, point);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 得到路径分隔符在文件路径中首次出现的位置。<br />
&nbsp;&nbsp; * 对于DOS或者UNIX风格的分隔符都可以。<br />
&nbsp;&nbsp; * @param fileName 文件路径<br />
&nbsp;&nbsp; * @return 路径分隔符在路径中首次出现的位置，没有出现时返回-1。<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.5<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static int getPathIndex(String fileName) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;int point = fileName.indexOf('/');<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (point == -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point = fileName.indexOf('\\');<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;return point;<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 得到路径分隔符在文件路径中指定位置后首次出现的位置。<br />
&nbsp;&nbsp; * 对于DOS或者UNIX风格的分隔符都可以。<br />
&nbsp;&nbsp; * @param fileName 文件路径<br />
&nbsp;&nbsp; * @param fromIndex 开始查找的位置<br />
&nbsp;&nbsp; * @return 路径分隔符在路径中指定位置后首次出现的位置，没有出现时返回<wbr></wbr>-1。<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.5<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static int getPathIndex(String fileName, int fromIndex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;int point = fileName.indexOf('/', fromIndex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (point == -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point = fileName.indexOf('\\', fromIndex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;return point;<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 得到路径分隔符在文件路径中最后出现的位置。<br />
&nbsp;&nbsp; * 对于DOS或者UNIX风格的分隔符都可以。<br />
&nbsp;&nbsp; * @param fileName 文件路径<br />
&nbsp;&nbsp; * @return 路径分隔符在路径中最后出现的位置，没有出现时返回-1。<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.5<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static int getPathLsatIndex(String fileName) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;int point = fileName.lastIndexOf('/');<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (point == -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point = fileName.lastIndexOf('\\');<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;return point;<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 得到路径分隔符在文件路径中指定位置前最后出现的位置。<br />
&nbsp;&nbsp; * 对于DOS或者UNIX风格的分隔符都可以。<br />
&nbsp;&nbsp; * @param fileName 文件路径<br />
&nbsp;&nbsp; * @param fromIndex 开始查找的位置<br />
&nbsp;&nbsp; * @return 路径分隔符在路径中指定位置前最后出现的位置，没有出现时返回<wbr></wbr>-1。<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.5<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static int getPathLsatIndex(String fileName, int fromIndex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;int point = fileName.lastIndexOf('/', fromIndex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (point == -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point = fileName.lastIndexOf('\\', fromIndex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;return point;<br />
&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 将文件名中的类型部分去掉。<br />
&nbsp;&nbsp; * @param filename 文件名<br />
&nbsp;&nbsp; * @return 去掉类型部分的结果<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.5<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static String trimType(String filename) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;int index = filename.lastIndexOf(".");<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (index != -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return filename.substring(0, index);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return filename;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;/**<br />
&nbsp;&nbsp; * 得到相对路径。<br />
&nbsp;&nbsp; * 文件名不是目录名的子节点时返回文件名。<br />
&nbsp;&nbsp; * @param pathName 目录名<br />
&nbsp;&nbsp; * @param fileName 文件名<br />
&nbsp;&nbsp; * @return 得到文件名相对于目录名的相对路径，目录下不存在该文件时返回文件<wbr></wbr>名<br />
&nbsp;&nbsp; * @since&nbsp;&nbsp;0.5<br />
&nbsp;&nbsp; */<br />
&nbsp;&nbsp;public static String getSubpath(String pathName,String fileName) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;int index = fileName.indexOf(pathName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (index != -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return fileName.substring(index + pathName.length() + 1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return fileName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
<br />
}</pre>
<br />
<br />
<span style="color: #0000ff">4.遗留问题</span><br />
<br />
目前new FileInputStream()只会使用绝对路径<wbr></wbr>，相对没用过，因为要相对于web服务器地址，比较麻烦<br />
<br />
还不如写个配置文件来的快哪<br />
<br />
<span style="color: #0000ff">5.按Java文件类型分类读取配置文件</span><br />
<br />
配置文件是应用系统中不可缺少的，可以增加程序的灵活性。 java.util.Properties是从jdk1<wbr></wbr>.2就有的类，一直到现在都支持load()方法，jdk1.4以后save(output,string) -&gt;store(output,string)。如果只是单纯的读<wbr></wbr>，根本不存在烦恼的问题。web层可以通过Thread.currentThread().getContextClassLoader().<br />
getResourceAsStream("xx.properties ")获取；Application可以通过new FileInputStream("xx.properties");直接在classes一级获取。关键是有时我们需要通过we<wbr></wbr>b修改配置文件，我们不能将路径写死了。经过测试觉得有以下心得：<br />
<br />
1.servlet中读写。如果运用Struts或者Servlet可以直接在初始化参数中<wbr></wbr>配置，调用时根据servlet的getRealPath("/<wbr></wbr>")获取真实路径，再根据String file = this.servlet.getInitParameter("abc");获取相对的WEB-INF的相对路径。<br />
例：<br />
<pre>InputStream input = Thread.currentThread().getContextClassLoader().<br />
getResourceAsStream("abc.properties");<br />
Properties prop = new Properties();<br />
prop.load(input);<br />
input.close();<br />
OutputStream out = new FileOutputStream(path);<br />
prop.setProperty("abc", "test");<br />
prop.store(out, "&#8211;test&#8211;");<br />
out.close();</pre>
<br />
<br />
2.直接在jsp中操作，通过jsp内置对象获取可操作的绝对地址。 <br />
例：<br />
<pre>// jsp页面<br />
String path = pageContext.getServletContext().getRealPath("/");<br />
String realPath = path+"/WEB-INF/classes/abc<wbr></wbr>.properties";<br />
<br />
//java 程序<br />
InputStream in = getClass().getClassLoader()<wbr></wbr>.getResourceAsStream("abc.properties"); // abc.properties放在webroot/WEB-INF/classes/目录下<br />
prop.load(in);<br />
in.close();<br />
<br />
OutputStream out = new FileOutputStream(path); // path为通过页面传入的路径<br />
prop.setProperty("abc", "abcccccc");<br />
prop.store(out, "&#8211;test&#8211;");<br />
out.close();</pre>
<br />
<br />
3.只通过Java程序操作资源文件<br />
<pre>InputStream in = new FileInputStream("abc.properties"); // 放在classes同级<br />
<br />
OutputStream out = new FileOutputStream("abc.properties");</pre>
<br />
</div>
<img src ="http://www.blogjava.net/orangelizq/aggbug/174762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/orangelizq/" target="_blank">桔子汁</a> 2008-01-12 10:41 <a href="http://www.blogjava.net/orangelizq/archive/2008/01/12/174762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对象中间件之Java RMI (3) </title><link>http://www.blogjava.net/orangelizq/archive/2007/12/01/164542.html</link><dc:creator>桔子汁</dc:creator><author>桔子汁</author><pubDate>Sat, 01 Dec 2007 13:01:00 GMT</pubDate><guid>http://www.blogjava.net/orangelizq/archive/2007/12/01/164542.html</guid><wfw:comment>http://www.blogjava.net/orangelizq/comments/164542.html</wfw:comment><comments>http://www.blogjava.net/orangelizq/archive/2007/12/01/164542.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/orangelizq/comments/commentRss/164542.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/orangelizq/services/trackbacks/164542.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;3.2.2 编译源程序首先将两个接口类Compute.class和Task.class打成JAR包（compute.jar）传到客户端，或者向客户端添加类路径也行。这样客户端的类才能正确编译。编译过程不在详述。需要被其他JVM动态加载的类要能够通过网络远程访问到，因此可以将它们放在一个Web服务器上，通过HTTP访问。当然在本机上测试时也可以使用文件路径，在此使用文件路径，...&nbsp;&nbsp;<a href='http://www.blogjava.net/orangelizq/archive/2007/12/01/164542.html'>阅读全文</a><img src ="http://www.blogjava.net/orangelizq/aggbug/164542.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/orangelizq/" target="_blank">桔子汁</a> 2007-12-01 21:01 <a href="http://www.blogjava.net/orangelizq/archive/2007/12/01/164542.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对象中间件之Java RMI (2) </title><link>http://www.blogjava.net/orangelizq/archive/2007/12/01/164541.html</link><dc:creator>桔子汁</dc:creator><author>桔子汁</author><pubDate>Sat, 01 Dec 2007 12:55:00 GMT</pubDate><guid>http://www.blogjava.net/orangelizq/archive/2007/12/01/164541.html</guid><wfw:comment>http://www.blogjava.net/orangelizq/comments/164541.html</wfw:comment><comments>http://www.blogjava.net/orangelizq/archive/2007/12/01/164541.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/orangelizq/comments/commentRss/164541.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/orangelizq/services/trackbacks/164541.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; 三、Java RMI使用RMI 应用通常有两个分开的程序组成，一个服务端程序和一个客户端程序。一个典型的服务端程序创建一些远程对象，使得对这些远程对象的引用可以被访问，等待客户端调用这些远程对象提供的方法。一个典型的客户端程序获取远程引用，指向一个或者多个服务端上的远程对象，然后调用这些远程对象所提供的方法。通常我们称这为分布式对象应用程序。3.1 RMI的工作方式分布式...&nbsp;&nbsp;<a href='http://www.blogjava.net/orangelizq/archive/2007/12/01/164541.html'>阅读全文</a><img src ="http://www.blogjava.net/orangelizq/aggbug/164541.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/orangelizq/" target="_blank">桔子汁</a> 2007-12-01 20:55 <a href="http://www.blogjava.net/orangelizq/archive/2007/12/01/164541.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对象中间件之Java RMI (1)</title><link>http://www.blogjava.net/orangelizq/archive/2007/12/01/164540.html</link><dc:creator>桔子汁</dc:creator><author>桔子汁</author><pubDate>Sat, 01 Dec 2007 12:45:00 GMT</pubDate><guid>http://www.blogjava.net/orangelizq/archive/2007/12/01/164540.html</guid><wfw:comment>http://www.blogjava.net/orangelizq/comments/164540.html</wfw:comment><comments>http://www.blogjava.net/orangelizq/archive/2007/12/01/164540.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/orangelizq/comments/commentRss/164540.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/orangelizq/services/trackbacks/164540.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;对象中间件之Java RMI作者：orangelizq&nbsp;&nbsp; 2007-11-30一、中间件简介1.1 中间件的定义中间件(middleware)是基础软件的一大类，属于可复用的软件范畴。中间件在操作系统软件，网络和数据库之上，应用软件之下，总的作用是为处于自己上层的应用软件提供运行于开发的环境，帮助用户灵活、高效的开发和集成复杂的应用软件。[1]...&nbsp;&nbsp;<a href='http://www.blogjava.net/orangelizq/archive/2007/12/01/164540.html'>阅读全文</a><img src ="http://www.blogjava.net/orangelizq/aggbug/164540.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/orangelizq/" target="_blank">桔子汁</a> 2007-12-01 20:45 <a href="http://www.blogjava.net/orangelizq/archive/2007/12/01/164540.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java clone()</title><link>http://www.blogjava.net/orangelizq/archive/2007/10/17/153573.html</link><dc:creator>桔子汁</dc:creator><author>桔子汁</author><pubDate>Wed, 17 Oct 2007 06:52:00 GMT</pubDate><guid>http://www.blogjava.net/orangelizq/archive/2007/10/17/153573.html</guid><wfw:comment>http://www.blogjava.net/orangelizq/comments/153573.html</wfw:comment><comments>http://www.blogjava.net/orangelizq/archive/2007/10/17/153573.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/orangelizq/comments/commentRss/153573.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/orangelizq/services/trackbacks/153573.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp; 现在Clone已经不是一个新鲜词语了，伴随着&#8220;多莉&#8221;的产生这个词语确实很&#8220;火&#8221;过一阵子，在java中也有这么一个概念，它可以让我们很方便的&#8220;制造&#8221;出一个对象的副本来，下面来具体看看java中的Clone机制是如何工作的？<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1． Clone&amp;Copy<br />
&nbsp;&nbsp;&nbsp;&nbsp; 假设现在有一个Employee对象，Employee tobby =new Employee(&#8220;CMTobby&#8221;,5000)，通<br />
常我们会有这样的赋值Employee cindyelf=tobby，这个时候只是简单了copy了一下reference，cindyelf和tobby都指向内存中同一个object，这样cindyelf或者tobby的一个操作都可能影响到对方。打个比方，如果我们通过cindyelf.raiseSalary()方法改变了salary域的值，那么tobby通过getSalary()方法得到的就是修改之后的salary域的值，显然这不是我们愿意看到的。我们希望得到tobby的一个精确拷贝，同时两者互不影响，这时候我们就可以使用Clone来满足我们的需求。Employee cindy=tobby.clone()，这时会生成一个新的Employee对象，并且和tobby具有相同的属性值和方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2． Shallow Clone&amp;Deep Clone<br />
Clone是如何完成的呢？<span style="color: #0000ff">Object在对某个对象实施Clone时对其是一无所知的，它仅仅是简单地执行域对域的copy，这就是Shallow Clone。</span>这样，问题就来了咯，以Employee为例，它里面有一个域hireDay不是基本型别的变量，而是一个reference变量，经过Clone之后就会产生一个新的Date型别的reference，它和原始对象中对应的域指向同一个Date对象，这样克隆类就和原始类共享了一部分信息，而这样显然是不利的，过程下图所示：<br />
<div align="center">
<div align="center"><img height="265" alt="" src="http://www.blogjava.net/images/blogjava_net/orangelizq/d6935ca561cf4f969134c597eb6437f6.png" width="515" border="0" /></div>
</div>
<p>&nbsp;</p>
<p>这个时候我们就需要进行deep Clone了，对那些非基本型别的域进行特殊的处理，例如本例中的hireDay。我们可以重新定义Clone方法，对hireDay做特殊处理，如下代码所示：<br />
<br />
&nbsp;&nbsp; class Employee implements Cloneable</p>
<pre style="text-indent: 24pt">{</pre>
<pre><span>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public Object clone() throws CloneNotSupportedException</span></pre>
<pre><span>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span></pre>
<pre><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Employee cloned = (Employee) super.clone();</span></pre>
<pre style="text-indent: 18pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cloned.hireDay = (Date) hireDay.clone()</span></pre>
<pre style="text-indent: 18pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return cloned;</span></pre>
<pre><span>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></pre>
<pre style="text-indent: 30pt">}<br />
<br />
3． Clone()方法的保护机制<br />
在Object中Clone()是被申明为protected的，这样做是有一定的道理的，以Employee<br />
类为例，通过申明为protected，就可以保证只有Employee类里面才能&#8220;克隆&#8221;Employee对象，原理可以参考我前面关于public、protected、private的学习笔记。<br />
4． Clone()方法的使用<br />
Clone()方法的使用比较简单，注意如下几点即可：<br />
a． <span style="color: #0000ff">什么时候使用shallow Clone，什么时候使用deep Clone，这个主要看具体对象的域是什么性质的，基本型别还是reference variable</span><br />
b． <span style="color: #0000ff">调用Clone()方法的对象所属的类(Class)必须implements Clonable接口，否则在调用Clone方法的时候会抛出CloneNotSupportedException。<br />
</span></pre><img src ="http://www.blogjava.net/orangelizq/aggbug/153573.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/orangelizq/" target="_blank">桔子汁</a> 2007-10-17 14:52 <a href="http://www.blogjava.net/orangelizq/archive/2007/10/17/153573.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]JAVA IO流</title><link>http://www.blogjava.net/orangelizq/archive/2007/10/01/150026.html</link><dc:creator>桔子汁</dc:creator><author>桔子汁</author><pubDate>Mon, 01 Oct 2007 02:44:00 GMT</pubDate><guid>http://www.blogjava.net/orangelizq/archive/2007/10/01/150026.html</guid><wfw:comment>http://www.blogjava.net/orangelizq/comments/150026.html</wfw:comment><comments>http://www.blogjava.net/orangelizq/archive/2007/10/01/150026.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/orangelizq/comments/commentRss/150026.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/orangelizq/services/trackbacks/150026.html</trackback:ping><description><![CDATA[<p>Input和Output</p>
<p>1. stream代表的是任何有能力产出数据的数据源，或是任何有能力接收数据的接收源。在Java的IO中，所有的stream（包括Input和Out stream）都包括两种类型：</p>
<p>1.1 以字节为导向的stream<br />
以字节为导向的stream，表示以字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream包括下面几种类型：<br />
<span style="color: #0000ff">Input stream：<br />
</span>1) ByteArrayInputStream：把内存中的一个缓冲区作为InputStream使用<br />
2) StringBufferInputStream：把一个String对象作为InputStream<br />
3) FileInputStream：把一个文件作为InputStream，实现对文件的读取操作<br />
4) PipedInputStream：实现了pipe的概念，主要在线程中使用<br />
5) SequenceInputStream：把多个InputStream合并为一个InputStream<br />
<span style="color: #0000ff">Out stream：</span><br />
1) ByteArrayOutputStream：把信息存入内存中的一个缓冲区中<br />
2) FileOutputStream：把信息存入文件中<br />
3) PipedOutputStream：实现了pipe的概念，主要在线程中使用<br />
4) SequenceOutputStream：把多个OutStream合并为一个OutStream</p>
<p>1.2 以Unicode字符为导向的stream<br />
以Unicode字符为导向的stream，表示以Unicode字符为单位从stream中读取或往stream中写入信息。以Unicode字符为导向的stream包括下面几种类型：<br />
<span style="color: #0000ff">Input stream</span><br />
1) CharArrayReader：与ByteArrayInputStream对应<br />
2) StringReader：与StringBufferInputStream对应<br />
3) FileReader：与FileInputStream对应<br />
4) PipedReader：与PipedInputStream对应<br />
<span style="color: #0000ff">Out stream<br />
</span>1) CharArrayWrite：与ByteArrayOutputStream对应<br />
2) StringWrite：无与之对应的以字节为导向的stream<br />
3) FileWrite：与FileOutputStream对应<br />
4) PipedWrite：与PipedOutputStream对应</p>
<p>以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同，只是在操作时的导向不同。如CharArrayReader：和</p>
<p>ByteArrayInputStream的作用都是把内存中的一个缓冲区作为InputStream使用，所不同的是后者每次从内存中读取一个字节的信息，而后者每次从内存中读取一个字符。</p>
<p>1.3 两种不现导向的stream之间的转换<br />
InputStreamReader和OutputStreamReader：把一个以字节为导向的stream转换成一个以字符为导向的stream。</p>
<p><br />
2. stream添加属性</p>
<p>2.1 &#8220;为stream添加属性&#8221;的作用</p>
<p>运用上面介绍的Java中操作IO的API，我们就可完成我们想完成的任何操作了。但通过FilterInputStream和FilterOutStream的子类，我们可以为stream添加属性。下面以一个例子来说明这种功能的作用。</p>
<p>如果我们要往一个文件中写入数据，我们可以这样操作：<br />
FileOutStream fs = new FileOutStream(&#8220;test.txt&#8221;);<br />
然后就可以通过产生的fs对象调用write()函数来往test.txt文件中写入数据了。但是，如果我们想实现&#8220;先把要写入文件的数据先缓存到内存中，再把缓存中的数据写入文件中&#8221;的功能时，上面的API就没有一个能满足我们的需求了。但是通过FilterInputStream和FilterOutStream的子类，为FileOutStream添加我们所需要的功能。</p>
<p>2.2 <span style="color: #0000ff">FilterInputStream</span>的各种类型</p>
<p>2.2.1 用于封装以字节为导向的InputStream<br />
1) DataInputStream：从stream中读取基本类型（int、char等）数据。<br />
2) BufferedInputStream：使用缓冲区<br />
3) LineNumberInputStream：会记录input stream内的行数，然后可以调用getLineNumber()和setLineNumber(int)<br />
4) PushbackInputStream：很少用到，一般用于编译器开发</p>
<p>2.2.2 用于封装以字符为导向的InputStream<br />
1) 没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader，否则使用DataInputStream<br />
2) BufferedReader：与BufferedInputStream对应<br />
3) LineNumberReader：与LineNumberInputStream对应<br />
4) PushBackReader：与PushbackInputStream对应</p>
<p>2.3 <span style="color: #0000ff">FilterOutStream</span>的各种类型</p>
<p>2.3.1 用于封装以字节为导向的OutputStream<br />
1) DataIOutStream：往stream中输出基本类型（int、char等）数据。<br />
2) BufferedOutStream：使用缓冲区<br />
3) PrintStream：产生格式化输出</p>
<p>2.3.2 用于封装以字符为导向的OutputStream<br />
1) BufferedWrite：与对应<br />
2) PrintWrite：与对应</p>
<p>3. <span style="color: #0000ff">RandomAccessFile</span></p>
<p>1) 可通过RandomAccessFile对象完成对文件的读写操作<br />
2) 在产生一个对象时，可指明要打开的文件的性质：r，只读；w，只写；rw可读写<br />
3) 可以直接跳到文件中指定的位置</p>
<p>4. I/O应用的一个例子</p>
<p>import java.io.*;<br />
public class TestIO{<br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws IOException{<br />
//1.以行为单位从一个文件读取数据<br />
&nbsp;&nbsp;&nbsp; BufferedReader in =new BufferedReader(new FileReader(\"F:<br />
epalonTestIO.java\"));<br />
&nbsp;&nbsp;&nbsp; String s, s2 = new String();<br />
&nbsp;&nbsp;&nbsp; while((s = in.readLine()) != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s2 += s + "\\";<br />
&nbsp;&nbsp;&nbsp; in.close();</p>
<p>//1b. 接收键盘的输入<br />
&nbsp;&nbsp;&nbsp; BufferedReader stdin =new BufferedReader(new InputStreamReader(System.in));<br />
&nbsp;&nbsp;&nbsp; System.out.println(\"Enter a line:\");<br />
&nbsp;&nbsp;&nbsp; System.out.println(stdin.readLine());</p>
<p>//2. 从一个String对象中读取数据<br />
&nbsp;&nbsp;&nbsp; StringReader in2 = new StringReader(s2);<br />
&nbsp;&nbsp;&nbsp; int c;<br />
&nbsp;&nbsp;&nbsp; while((c = in2.read()) != -1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println((char)c);<br />
&nbsp;&nbsp;&nbsp; in2.close();</p>
<p>//3. 从内存取出格式化输入<br />
&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataInputStream in3 =new DataInputStream(new ByteArrayInputStream(s2.getBytes()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(true)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println((char)in3.readByte());<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; catch(EOFException e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(\"End of stream\");<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>//4. 输出到文件<br />
&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedReader in4 =new BufferedReader(new StringReader(s2)); //把s2当作输入对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PrintWriter out1 =new PrintWriter(new BufferedWriter(new FileWriter(\"F:epalon TestIO.out\")));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int lineCount = 1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while((s = in4.readLine()) != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out1.println(lineCount&nbsp; + \"：\" + s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out1.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in4.close();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; catch(EOFException ex){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(\"End of stream\");<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>//5. 数据的存储和恢复<br />
&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataOutputStream out2 = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(\"F:epalon Data.txt\")));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out2.writeDouble(3.1415926);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out2.writeChars(" Thas was pi:writeChars ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out2.writeBytes( "Thas was pi:writeByte ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out2.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DataInputStream in5 = new DataInputStream(new BufferedInputStream(new FileInputStream(\"F:epalon Data.txt\")));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedReader in5br = new BufferedReader(new InputStreamReader(in5));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(in5.readDouble());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(in5br.readLine());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(in5br.readLine());<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; catch(EOFException e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(\"End of stream\");<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>//6. 通过RandomAccessFile操作文件<br />
&nbsp;&nbsp;&nbsp; RandomAccessFile rf = new RandomAccessFile(\"F:epalon rtest.dat\", \"rw\");<br />
&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;10; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rf.writeDouble(i*1.414);<br />
&nbsp;&nbsp;&nbsp; rf.close();</p>
<p>&nbsp;&nbsp;&nbsp; rf = new RandomAccessFile(\"F:epalon rtest.dat\", \"r\");<br />
&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;10; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(\"Value \" + i + \"：\" + rf.readDouble());<br />
&nbsp;&nbsp;&nbsp; rf.close();</p>
<p>&nbsp;&nbsp;&nbsp; rf = new RandomAccessFile(\"F:epalon rtest.dat\", \"rw\");<br />
&nbsp;&nbsp;&nbsp; rf.seek(5*8);<br />
&nbsp;&nbsp;&nbsp; rf.writeDouble(47.0001);<br />
&nbsp;&nbsp;&nbsp; rf.close();</p>
<p>&nbsp;&nbsp;&nbsp; rf = new RandomAccessFile(\"F:epalon rtest.dat\", \"r\");<br />
&nbsp;&nbsp;&nbsp; for(int i=0; i&lt;10; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(\"Value \" + i + \"：\" + rf.readDouble());<br />
&nbsp;&nbsp;&nbsp; rf.close();<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>关于代码的解释（以区为单位）：<br />
1区中，当读取文件时，先把文件内容读到缓存中，当调用in.readLine()时，再从缓存中以字符的方式读取数据（以下简称&#8220;缓存字节读取方式&#8221;）。<br />
1b区中，由于想以缓存字节读取方式从标准IO（键盘）中读取数据，所以要先把标准IO（System.in）转换成字符导向的stream，再进行BufferedReader封装。<br />
2区中，要以字符的形式从一个String对象中读取数据，所以要产生一个StringReader类型的stream。<br />
4区中，对String对象s2读取数据时，先把对象中的数据存入缓存中，再从缓冲中进行读取；对TestIO.out文件进行操作时，先把格式化后的信息输出到缓存中，再把缓存中的信息输出到文件中。<br />
5区中，对Data.txt文件进行输出时，是先把基本类型的数据输出屋缓存中，再把缓存中的数据输出到文件中；对文件进行读取操作时，先把文件中的数据读取到缓存中，再从缓存中以基本类型的形式进行读取。注意in5.readDouble()这一行。因为写入第一个writeDouble()，所以为了正确显示。也要以基本类型的形式进行读取。<br />
6区是通过RandomAccessFile类对文件进行操作。<br />
</p>
<img src ="http://www.blogjava.net/orangelizq/aggbug/150026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/orangelizq/" target="_blank">桔子汁</a> 2007-10-01 10:44 <a href="http://www.blogjava.net/orangelizq/archive/2007/10/01/150026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]如何成为一个合格的java程序员</title><link>http://www.blogjava.net/orangelizq/archive/2007/09/30/149953.html</link><dc:creator>桔子汁</dc:creator><author>桔子汁</author><pubDate>Sun, 30 Sep 2007 09:01:00 GMT</pubDate><guid>http://www.blogjava.net/orangelizq/archive/2007/09/30/149953.html</guid><wfw:comment>http://www.blogjava.net/orangelizq/comments/149953.html</wfw:comment><comments>http://www.blogjava.net/orangelizq/archive/2007/09/30/149953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/orangelizq/comments/commentRss/149953.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/orangelizq/services/trackbacks/149953.html</trackback:ping><description><![CDATA[<p>如何成为一个合格的java程序员<br />
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、语法：必须比较熟悉，在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道任何修正。</p>
<p>　　2、命令：必须熟悉JDK带的一些常用命令及其常用选项，命令至少需要熟悉：appletviewer、HtmlConverter、jar、java、javac、javadoc、javap、javaw、native2ascii、serialver，如果这些命令你没有全部使用过，那么你对java实际上还很不了解。</p>
<p>　　3、工具：必须至少熟练使用一种IDE的开发工具，例如Eclipse、Netbeans、JBuilder、Jdeveloper、IDEA、JCreator或者Workshop，包括进行工程管理、常用选项的设置、插件的安装配置以及进行调试。</p>
<p>　　4、API：Java的核心API是非常庞大的，但是有一些内容笔者认为是必须熟悉的，否则不可能熟练的运用Java，包括：</p>
<p>　　 1）、java.lang包下的80％以上的类的功能的灵活运用。</p>
<p>　　 2）、java.util包下的80％以上的类的灵活运用，特别是集合类体系、规则表达式、zip、以及时间、随机数、属性、资源和Timer。</p>
<p>　　 3）、java.io包下的60％以上的类的使用，理解IO体系的基于管道模型的设计思路以及常用IO类的特性和使用场合。</p>
<p>　　 4）、java.math包下的100％的内容。</p>
<p>　　 5）、java.net包下的60％以上的内容，对各个类的功能比较熟悉。</p>
<p>　　 6）、java.text包下的60％以上的内容，特别是各种格式化类。</p>
<p>　　 7）、熟练运用JDBC。</p>
<p>　　 8）、java.security包下40％以上的内容，如果对于安全没有接触的话根本就不可能掌握java。</p>
<p>　　 9）、AWT的基本内容，包括各种组件事件、监听器、布局管理器、常用组件、打印。</p>
<p>　　 10）、Swing的基本内容，和AWT的要求类似。</p>
<p>　　 11）、XML处理，熟悉SAX、DOM以及JDOM的优缺点并且能够使用其中的一种完成XML的解析及内容处理。</p>
<p>　　5、测试：必须熟悉使用junit编写测试用例完成代码的自动测试。</p>
<p>　　6、管理：必须熟悉使用ant完成工程管理的常用任务，例如工程编译、生成javadoc、生成jar、版本控制、自动测试。</p>
<p>　　7、排错：应该可以根据异常信息比较快速的定位问题的原因和大致位置。</p>
<p>　　8、思想：必须掌握OOP的主要要求，这样使用Java开发的系统才能是真正的Java系统。</p>
<p>　　9、规范：编写的代码必须符合流行的编码规范，例如类名首字母大写，成员和方法名首字母小写，方法名的第一个单词一般是动词，包名全部小写等，这样程序的可读性才比较好。<br />
</p>
<img src ="http://www.blogjava.net/orangelizq/aggbug/149953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/orangelizq/" target="_blank">桔子汁</a> 2007-09-30 17:01 <a href="http://www.blogjava.net/orangelizq/archive/2007/09/30/149953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>