﻿<?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-实践-全程-文章分类-Cool文存档</title><link>http://www.blogjava.net/leeguannan/category/22888.html</link><description>预测未来的最好办法，就是把它创造出来 --- 阿伦.凯</description><language>zh-cn</language><lastBuildDate>Thu, 13 Mar 2008 08:20:54 GMT</lastBuildDate><pubDate>Thu, 13 Mar 2008 08:20:54 GMT</pubDate><ttl>60</ttl><item><title>Java反射Reflection--运行时生成instance</title><link>http://www.blogjava.net/leeguannan/articles/185764.html</link><dc:creator>阿南</dc:creator><author>阿南</author><pubDate>Wed, 12 Mar 2008 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/leeguannan/articles/185764.html</guid><wfw:comment>http://www.blogjava.net/leeguannan/comments/185764.html</wfw:comment><comments>http://www.blogjava.net/leeguannan/articles/185764.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leeguannan/comments/commentRss/185764.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leeguannan/services/trackbacks/185764.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp; 想生成对象的实体，在反射动态机制中有两种方法，一个针对无变量的构造方法，一个针对带参数的构造方法，，如果想调用无参数的构造函数直接调用Class类中的newInstance（），而如果想调用有参数的构造函数，则需要调用Constructor类中newInstance（）方法，首先准备一个Class[]作为Constructor的参数类型。然后调用该Class对...&nbsp;&nbsp;<a href='http://www.blogjava.net/leeguannan/articles/185764.html'>阅读全文</a><img src ="http://www.blogjava.net/leeguannan/aggbug/185764.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leeguannan/" target="_blank">阿南</a> 2008-03-12 17:44 <a href="http://www.blogjava.net/leeguannan/articles/185764.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Java文件路径问题</title><link>http://www.blogjava.net/leeguannan/articles/127380.html</link><dc:creator>阿南</dc:creator><author>阿南</author><pubDate>Sun, 01 Jul 2007 12:36:00 GMT</pubDate><guid>http://www.blogjava.net/leeguannan/articles/127380.html</guid><wfw:comment>http://www.blogjava.net/leeguannan/comments/127380.html</wfw:comment><comments>http://www.blogjava.net/leeguannan/articles/127380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leeguannan/comments/commentRss/127380.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leeguannan/services/trackbacks/127380.html</trackback:ping><description><![CDATA[<div class=postText>
<p><font size=3>1.如何获得当前文件路径</font></p>
<p><font size=3>常用：</font></p>
<p><font size=3>字符串类型：System.getProperty("user.dir");</font></p>
<p><font size=3>综合：</font></p>
<p><font size=3>package com.zcjl.test.base;<br>import java.io.File;<br>public class Test {<br>&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(<br></font><font size=3><font color=#ff0000>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.currentThread().getContextClassLoader().getResource(""));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(Test.class.getClassLoader().getResource(""));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(ClassLoader.getSystemResource(""));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(Test.class.getResource(""));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(Test.class.getResource("/"));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(new File("").getAbsolutePath());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(System.getProperty("user.dir"));</font><br>&nbsp;&nbsp;&nbsp; }<br>}</font></p>
<p><font size=3>2.Web服务中</font></p>
<p><font size=3>(1).Weblogic</font></p>
<p><font size=3>WebApplication的系统文件根目录是你的weblogic安装所在根目录。<br>例如：如果你的weblogic安装在c:\bea\weblogic700.....<br>那么，你的文件根路径就是c:\.<br>所以，有两种方式能够让你访问你的服务器端的文件：<br>a.使用绝对路径：<br>比如将你的参数文件放在c:\yourconfig\yourconf.properties，<br>直接使用 new FileInputStream("yourconfig/yourconf.properties");<br>b.使用相对路径：<br>相对路径的根目录就是你的webapplication的根路径，即WEB-INF的上一级目录，将你的参数文件放在yourwebapp\yourconfig\yourconf.properties，<br>这样使用：<br>new FileInputStream("./yourconfig/yourconf.properties");<br>这两种方式均可，自己选择。</font></p>
<p><font size=3>(2).Tomcat</font></p>
<p><font size=3>在类中输出System.getProperty("user.dir");显示的是%Tomcat_Home%/bin</font></p>
<p><font size=3>(3).Resin</font></p>
<p><font size=3>不是你的JSP放的相对路径,是JSP引擎执行这个JSP编译成SERVLET<br>的路径为根.比如用新建文件法测试File f = new File("a.htm");<br>这个a.htm在resin的安装目录下 </font></p>
<p><font color=#ff0000 size=3>(4).如何读相对路径哪？</font></p>
<p><font color=#ff0000 size=3>在Java文件中getResource或getResourceAsStream均可</font></p>
<p><font color=#ff0000 size=3>例：getClass().getResourceAsStream(filePath);//filePath可以是"/filename",这里的/代表web发布根路径下WEB-INF/classes</font></p>
<p><font size=3>(5).获得文件真实路径</font></p>
<p><font size=3>string&nbsp; file_real_path=request.getRealPath("mypath/filename");&nbsp; </font></p>
<p><font size=3>通常使用request.getRealPath("/");&nbsp; </font></p>
<p><font size=3>3.文件操作的类</font></p>
<p><font size=3>import java.io.*;<br>import java.net.*;<br>import java.util.*;<br>//import javax.swing.filechooser.*;<br>//import org.jr.swing.filter.*;</font></p>
<p><font size=3>/**<br>* 此类中封装一些常用的文件操作。<br>* 所有方法都是静态方法，不需要生成此类的实例，<br>* 为避免生成此类的实例，构造方法被申明为private类型的。<br>* @since&nbsp; 0.1<br>*/</font></p>
<p><font size=3>public class FileUtil {<br>&nbsp; /**<br>&nbsp;&nbsp; * 私有构造方法，防止类的实例化，因为工具类不需要实例化。<br>&nbsp;&nbsp; */<br>&nbsp; private FileUtil() {</font></p>
<p><font size=3>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 修改文件的最后访问时间。<br>&nbsp;&nbsp; * 如果文件不存在则创建该文件。<br>&nbsp;&nbsp; * &lt;b&gt;目前这个方法的行为方式还不稳定，主要是方法有些信息输出，这些信息输出是否保留还在考</font></p>
<p><font size=3>虑中。&lt;/b&gt;<br>&nbsp;&nbsp; * @param file 需要修改最后访问时间的文件。<br>&nbsp;&nbsp; * @since&nbsp; 0.1<br>&nbsp;&nbsp; */<br>&nbsp; public static void touch(File file) {<br>&nbsp;&nbsp;&nbsp; long currentTime = System.currentTimeMillis();<br>&nbsp;&nbsp;&nbsp; if (!file.exists()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("file not found:" + file.getName());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("Create a new file:" + file.getName());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (file.createNewFile()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; System.out.println("Succeeded!");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; System.err.println("Create file failed!");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (IOException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; System.err.println("Create file failed!");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; boolean result = file.setLastModified(currentTime);<br>&nbsp;&nbsp;&nbsp; if (!result) {<br>&nbsp;&nbsp;&nbsp; //&nbsp; System.err.println("touch failed: " + file.getName());<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 修改文件的最后访问时间。<br>&nbsp;&nbsp; * 如果文件不存在则创建该文件。<br>&nbsp;&nbsp; * &lt;b&gt;目前这个方法的行为方式还不稳定，主要是方法有些信息输出，这些信息输出是否保留还在考</font></p>
<p><font size=3>虑中。&lt;/b&gt;<br>&nbsp;&nbsp; * @param fileName 需要修改最后访问时间的文件的文件名。<br>&nbsp;&nbsp; * @since&nbsp; 0.1<br>&nbsp;&nbsp; */<br>&nbsp; public static void touch(String fileName) {<br>&nbsp;&nbsp;&nbsp; File file = new File(fileName);<br>&nbsp;&nbsp;&nbsp; touch(file);<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 修改文件的最后访问时间。<br>&nbsp;&nbsp; * 如果文件不存在则创建该文件。<br>&nbsp;&nbsp; * &lt;b&gt;目前这个方法的行为方式还不稳定，主要是方法有些信息输出，这些信息输出是否保留还在考</font></p>
<p><font size=3>虑中。&lt;/b&gt;<br>&nbsp;&nbsp; * @param files 需要修改最后访问时间的文件数组。<br>&nbsp;&nbsp; * @since&nbsp; 0.1<br>&nbsp;&nbsp; */<br>&nbsp; public static void touch(File[] files) {<br>&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; files.length; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; touch(files);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 修改文件的最后访问时间。<br>&nbsp;&nbsp; * 如果文件不存在则创建该文件。<br>&nbsp;&nbsp; * &lt;b&gt;目前这个方法的行为方式还不稳定，主要是方法有些信息输出，这些信息输出是否保留还在考</font></p>
<p><font size=3>虑中。&lt;/b&gt;<br>&nbsp;&nbsp; * @param fileNames 需要修改最后访问时间的文件名数组。<br>&nbsp;&nbsp; * @since&nbsp; 0.1<br>&nbsp;&nbsp; */<br>&nbsp; public static void touch(String[] fileNames) {<br>&nbsp;&nbsp;&nbsp; File[] files = new File[fileNames.length];<br>&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; fileNames.length; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; files = new File(fileNames);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; touch(files);<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 判断指定的文件是否存在。<br>&nbsp;&nbsp; * @param fileName 要判断的文件的文件名<br>&nbsp;&nbsp; * @return 存在时返回true，否则返回false。<br>&nbsp;&nbsp; * @since&nbsp; 0.1<br>&nbsp;&nbsp; */<br>&nbsp; public static boolean isFileExist(String fileName) {<br>&nbsp;&nbsp;&nbsp; return new File(fileName).isFile();<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 创建指定的目录。<br>&nbsp;&nbsp; * 如果指定的目录的父目录不存在则创建其目录书上所有需要的父目录。<br>&nbsp;&nbsp; * &lt;b&gt;注意：可能会在返回false的时候创建部分父目录。&lt;/b&gt;<br>&nbsp;&nbsp; * @param file 要创建的目录<br>&nbsp;&nbsp; * @return 完全创建成功时返回true，否则返回false。<br>&nbsp;&nbsp; * @since&nbsp; 0.1<br>&nbsp;&nbsp; */<br>&nbsp; public static boolean makeDirectory(File file) {<br>&nbsp;&nbsp;&nbsp; File parent = file.getParentFile();<br>&nbsp;&nbsp;&nbsp; if (parent != null) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return parent.mkdirs();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return false;<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 创建指定的目录。<br>&nbsp;&nbsp; * 如果指定的目录的父目录不存在则创建其目录书上所有需要的父目录。<br>&nbsp;&nbsp; * &lt;b&gt;注意：可能会在返回false的时候创建部分父目录。&lt;/b&gt;<br>&nbsp;&nbsp; * @param fileName 要创建的目录的目录名<br>&nbsp;&nbsp; * @return 完全创建成功时返回true，否则返回false。<br>&nbsp;&nbsp; * @since&nbsp; 0.1<br>&nbsp;&nbsp; */<br>&nbsp; public static boolean makeDirectory(String fileName) {<br>&nbsp;&nbsp;&nbsp; File file = new File(fileName);<br>&nbsp;&nbsp;&nbsp; return makeDirectory(file);<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 清空指定目录中的文件。<br>&nbsp;&nbsp; * 这个方法将尽可能删除所有的文件，但是只要有一个文件没有被删除都会返回false。<br>&nbsp;&nbsp; * 另外这个方法不会迭代删除，即不会删除子目录及其内容。<br>&nbsp;&nbsp; * @param directory 要清空的目录<br>&nbsp;&nbsp; * @return 目录下的所有文件都被成功删除时返回true，否则返回false.<br>&nbsp;&nbsp; * @since&nbsp; 0.1<br>&nbsp;&nbsp; */<br>&nbsp; public static boolean emptyDirectory(File directory) {<br>&nbsp;&nbsp;&nbsp; boolean result = false;<br>&nbsp;&nbsp;&nbsp; File[] entries = directory.listFiles();<br>&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; entries.length; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!entries.delete()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return true;<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 清空指定目录中的文件。<br>&nbsp;&nbsp; * 这个方法将尽可能删除所有的文件，但是只要有一个文件没有被删除都会返回false。<br>&nbsp;&nbsp; * 另外这个方法不会迭代删除，即不会删除子目录及其内容。<br>&nbsp;&nbsp; * @param directoryName 要清空的目录的目录名<br>&nbsp;&nbsp; * @return 目录下的所有文件都被成功删除时返回true，否则返回false。<br>&nbsp;&nbsp; * @since&nbsp; 0.1<br>&nbsp;&nbsp; */<br>&nbsp; public static boolean emptyDirectory(String directoryName) {<br>&nbsp;&nbsp;&nbsp; File dir = new File(directoryName);<br>&nbsp;&nbsp;&nbsp; return emptyDirectory(dir);<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 删除指定目录及其中的所有内容。<br>&nbsp;&nbsp; * @param dirName 要删除的目录的目录名<br>&nbsp;&nbsp; * @return 删除成功时返回true，否则返回false。<br>&nbsp;&nbsp; * @since&nbsp; 0.1<br>&nbsp;&nbsp; */<br>&nbsp; public static boolean deleteDirectory(String dirName) {<br>&nbsp;&nbsp;&nbsp; return deleteDirectory(new File(dirName));<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 删除指定目录及其中的所有内容。<br>&nbsp;&nbsp; * @param dir 要删除的目录<br>&nbsp;&nbsp; * @return 删除成功时返回true，否则返回false。<br>&nbsp;&nbsp; * @since&nbsp; 0.1<br>&nbsp;&nbsp; */<br>&nbsp; public static boolean deleteDirectory(File dir) {<br>&nbsp;&nbsp;&nbsp; if ( (dir == null) || !dir.isDirectory()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new IllegalArgumentException("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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; " is not a directory. ");<br>&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size=3>&nbsp;&nbsp;&nbsp; File[] entries = dir.listFiles();<br>&nbsp;&nbsp;&nbsp; int sz = entries.length;</font></p>
<p><font size=3>&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; sz; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (entries.isDirectory()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!deleteDirectory(entries)) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!entries.delete()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size=3>&nbsp;&nbsp;&nbsp; if (!dir.delete()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return true;<br>&nbsp; }</font></p>
<p><br><font size=3>&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; 0.4<br>&nbsp;&nbsp; * @deprecated 在实现的时候没有注意到File类本身带一个toURL方法将文件路径转换为URL。<br>&nbsp;&nbsp; *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 请使用File.toURL方法。<br>&nbsp;&nbsp; */<br>&nbsp; public static URL getURL(File file) throws MalformedURLException {<br>&nbsp;&nbsp;&nbsp; String fileURL = "file:/" + file.getAbsolutePath();<br>&nbsp;&nbsp;&nbsp; URL url = new URL(fileURL);<br>&nbsp;&nbsp;&nbsp; return url;<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 从文件路径得到文件名。<br>&nbsp;&nbsp; * @param filePath 文件的路径，可以是相对路径也可以是绝对路径<br>&nbsp;&nbsp; * @return 对应的文件名<br>&nbsp;&nbsp; * @since&nbsp; 0.4<br>&nbsp;&nbsp; */<br>&nbsp; public static String getFileName(String filePath) {<br>&nbsp;&nbsp;&nbsp; File file = new File(filePath);<br>&nbsp;&nbsp;&nbsp; return file.getName();<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 从文件名得到文件绝对路径。<br>&nbsp;&nbsp; * @param fileName 文件名<br>&nbsp;&nbsp; * @return 对应的文件路径<br>&nbsp;&nbsp; * @since&nbsp; 0.4<br>&nbsp;&nbsp; */<br>&nbsp; public static String getFilePath(String fileName) {<br>&nbsp;&nbsp;&nbsp; File file = new File(fileName);<br>&nbsp;&nbsp;&nbsp; return file.getAbsolutePath();<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 将DOS/Windows格式的路径转换为UNIX/Linux格式的路径。<br>&nbsp;&nbsp; * 其实就是将路径中的"\"全部换为"/"，因为在某些情况下我们转换为这种方式比较方便，<br>&nbsp;&nbsp; * 某中程度上说"/"比"\"更适合作为路径分隔符，而且DOS/Windows也将它当作路径分隔符。<br>&nbsp;&nbsp; * @param filePath 转换前的路径<br>&nbsp;&nbsp; * @return 转换后的路径<br>&nbsp;&nbsp; * @since&nbsp; 0.4<br>&nbsp;&nbsp; */<br>&nbsp; public static String toUNIXpath(String filePath) {<br>&nbsp;&nbsp;&nbsp; return filePath.replace('\\', '/');<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 从文件名得到UNIX风格的文件绝对路径。<br>&nbsp;&nbsp; * @param fileName 文件名<br>&nbsp;&nbsp; * @return 对应的UNIX风格的文件路径<br>&nbsp;&nbsp; * @since&nbsp; 0.4<br>&nbsp;&nbsp; * @see #toUNIXpath(String filePath) toUNIXpath<br>&nbsp;&nbsp; */<br>&nbsp; public static String getUNIXfilePath(String fileName) {<br>&nbsp;&nbsp;&nbsp; File file = new File(fileName);<br>&nbsp;&nbsp;&nbsp; return toUNIXpath(file.getAbsolutePath());<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 得到文件的类型。<br>&nbsp;&nbsp; * 实际上就是得到文件名中最后一个&#8220;.&#8221;后面的部分。<br>&nbsp;&nbsp; * @param fileName 文件名<br>&nbsp;&nbsp; * @return 文件名中的类型部分<br>&nbsp;&nbsp; * @since&nbsp; 0.5<br>&nbsp;&nbsp; */<br>&nbsp; public static String getTypePart(String fileName) {<br>&nbsp;&nbsp;&nbsp; int point = fileName.lastIndexOf('.');<br>&nbsp;&nbsp;&nbsp; int length = fileName.length();<br>&nbsp;&nbsp;&nbsp; if (point == -1 || point == length - 1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "";<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return fileName.substring(point + 1, length);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 得到文件的类型。<br>&nbsp;&nbsp; * 实际上就是得到文件名中最后一个&#8220;.&#8221;后面的部分。<br>&nbsp;&nbsp; * @param file 文件<br>&nbsp;&nbsp; * @return 文件名中的类型部分<br>&nbsp;&nbsp; * @since&nbsp; 0.5<br>&nbsp;&nbsp; */<br>&nbsp; public static String getFileType(File file) {<br>&nbsp;&nbsp;&nbsp; return getTypePart(file.getName());<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 得到文件的名字部分。<br>&nbsp;&nbsp; * 实际上就是路径中的最后一个路径分隔符后的部分。<br>&nbsp;&nbsp; * @param fileName 文件名<br>&nbsp;&nbsp; * @return 文件名中的名字部分<br>&nbsp;&nbsp; * @since&nbsp; 0.5<br>&nbsp;&nbsp; */<br>&nbsp; public static String getNamePart(String fileName) {<br>&nbsp;&nbsp;&nbsp; int point = getPathLsatIndex(fileName);<br>&nbsp;&nbsp;&nbsp; int length = fileName.length();<br>&nbsp;&nbsp;&nbsp; if (point == -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return fileName;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else if (point == length - 1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int secondPoint = getPathLsatIndex(fileName, point - 1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (secondPoint == -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (length == 1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return fileName;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return fileName.substring(0, point);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return fileName.substring(secondPoint + 1, point);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return fileName.substring(point + 1);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 得到文件名中的父路径部分。<br>&nbsp;&nbsp; * 对两种路径分隔符都有效。<br>&nbsp;&nbsp; * 不存在时返回""。<br>&nbsp;&nbsp; * 如果文件名是以路径分隔符结尾的则不考虑该分隔符，例如"/path/"返回""。<br>&nbsp;&nbsp; * @param fileName 文件名<br>&nbsp;&nbsp; * @return 父路径，不存在或者已经是父目录时返回""<br>&nbsp;&nbsp; * @since&nbsp; 0.5<br>&nbsp;&nbsp; */<br>&nbsp; public static String getPathPart(String fileName) {<br>&nbsp;&nbsp;&nbsp; int point = getPathLsatIndex(fileName);<br>&nbsp;&nbsp;&nbsp; int length = fileName.length();<br>&nbsp;&nbsp;&nbsp; if (point == -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "";<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else if (point == length - 1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int secondPoint = getPathLsatIndex(fileName, point - 1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (secondPoint == -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return fileName.substring(0, secondPoint);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return fileName.substring(0, point);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 得到路径分隔符在文件路径中首次出现的位置。<br>&nbsp;&nbsp; * 对于DOS或者UNIX风格的分隔符都可以。<br>&nbsp;&nbsp; * @param fileName 文件路径<br>&nbsp;&nbsp; * @return 路径分隔符在路径中首次出现的位置，没有出现时返回-1。<br>&nbsp;&nbsp; * @since&nbsp; 0.5<br>&nbsp;&nbsp; */<br>&nbsp; public static int getPathIndex(String fileName) {<br>&nbsp;&nbsp;&nbsp; int point = fileName.indexOf('/');<br>&nbsp;&nbsp;&nbsp; if (point == -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; point = fileName.indexOf('\\');<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return point;<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 得到路径分隔符在文件路径中指定位置后首次出现的位置。<br>&nbsp;&nbsp; * 对于DOS或者UNIX风格的分隔符都可以。<br>&nbsp;&nbsp; * @param fileName 文件路径<br>&nbsp;&nbsp; * @param fromIndex 开始查找的位置<br>&nbsp;&nbsp; * @return 路径分隔符在路径中指定位置后首次出现的位置，没有出现时返回-1。<br>&nbsp;&nbsp; * @since&nbsp; 0.5<br>&nbsp;&nbsp; */<br>&nbsp; public static int getPathIndex(String fileName, int fromIndex) {<br>&nbsp;&nbsp;&nbsp; int point = fileName.indexOf('/', fromIndex);<br>&nbsp;&nbsp;&nbsp; if (point == -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; point = fileName.indexOf('\\', fromIndex);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return point;<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 得到路径分隔符在文件路径中最后出现的位置。<br>&nbsp;&nbsp; * 对于DOS或者UNIX风格的分隔符都可以。<br>&nbsp;&nbsp; * @param fileName 文件路径<br>&nbsp;&nbsp; * @return 路径分隔符在路径中最后出现的位置，没有出现时返回-1。<br>&nbsp;&nbsp; * @since&nbsp; 0.5<br>&nbsp;&nbsp; */<br>&nbsp; public static int getPathLsatIndex(String fileName) {<br>&nbsp;&nbsp;&nbsp; int point = fileName.lastIndexOf('/');<br>&nbsp;&nbsp;&nbsp; if (point == -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; point = fileName.lastIndexOf('\\');<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return point;<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 得到路径分隔符在文件路径中指定位置前最后出现的位置。<br>&nbsp;&nbsp; * 对于DOS或者UNIX风格的分隔符都可以。<br>&nbsp;&nbsp; * @param fileName 文件路径<br>&nbsp;&nbsp; * @param fromIndex 开始查找的位置<br>&nbsp;&nbsp; * @return 路径分隔符在路径中指定位置前最后出现的位置，没有出现时返回-1。<br>&nbsp;&nbsp; * @since&nbsp; 0.5<br>&nbsp;&nbsp; */<br>&nbsp; public static int getPathLsatIndex(String fileName, int fromIndex) {<br>&nbsp;&nbsp;&nbsp; int point = fileName.lastIndexOf('/', fromIndex);<br>&nbsp;&nbsp;&nbsp; if (point == -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; point = fileName.lastIndexOf('\\', fromIndex);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return point;<br>&nbsp; }</font></p>
<p><font size=3>&nbsp; /**<br>&nbsp;&nbsp; * 将文件名中的类型部分去掉。<br>&nbsp;&nbsp; * @param filename 文件名<br>&nbsp;&nbsp; * @return 去掉类型部分的结果<br>&nbsp;&nbsp; * @since&nbsp; 0.5<br>&nbsp;&nbsp; */<br>&nbsp; public static String trimType(String filename) {<br>&nbsp;&nbsp;&nbsp; int index = filename.lastIndexOf(".");<br>&nbsp;&nbsp;&nbsp; if (index != -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return filename.substring(0, index);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return filename;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }<br>&nbsp; /**<br>&nbsp;&nbsp; * 得到相对路径。<br>&nbsp;&nbsp; * 文件名不是目录名的子节点时返回文件名。<br>&nbsp;&nbsp; * @param pathName 目录名<br>&nbsp;&nbsp; * @param fileName 文件名<br>&nbsp;&nbsp; * @return 得到文件名相对于目录名的相对路径，目录下不存在该文件时返回文件名<br>&nbsp;&nbsp; * @since&nbsp; 0.5<br>&nbsp;&nbsp; */<br>&nbsp; public static String getSubpath(String pathName,String fileName) {<br>&nbsp;&nbsp;&nbsp; int index = fileName.indexOf(pathName);<br>&nbsp;&nbsp;&nbsp; if (index != -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return fileName.substring(index + pathName.length() + 1);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return fileName;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; }</font></p>
<p><font size=3>}<br>&nbsp;4.遗留问题</font></p>
<p><font size=3>目前new FileInputStream()只会使用绝对路径，相对没用过，因为要相对于web服务器地址，比较麻烦</font></p>
<p><font size=3>还不如写个配置文件来的快哪</font></p>
<p><font size=3>5.按Java文件类型分类读取配置文件</font></p>
<div class=storycontent>
<p><font size=3>配置文件是应用系统中不可缺少的，可以增加程序的灵活性。java.util.Properties是从jdk1.2就有的类，一直到现在都支持load ()方法，jdk1.4以后save(output,string) -&gt;store(output,string)。如果只是单纯的读，根本不存在烦恼的问题。web层可以通过 Thread.currentThread().getContextClassLoader().<br>getResourceAsStream("xx.properties") 获取；Application可以通过new FileInputStream("xx.properties");直接在classes一级获取。关键是有时我们需要通过web修改配置文件，我们不能将路径写死了。经过测试觉得有以下心得：</font></p>
<p><font size=3>1.servlet中读写。如果运用Struts 或者Servlet可以直接在初始化参数中配置，调用时根据servlet的getRealPath("/")获取真实路径，再根据String file = this.servlet.getInitParameter("abc");获取相对的WEB-INF的相对路径。<br>例：<br>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", &#8220;test");<br>prop.store(out, &#8220;&#8211;test&#8211;");<br>out.close();</font></p>
<p><font size=3>2.直接在jsp中操作，通过jsp内置对象获取可操作的绝对地址。<br>例：<br>// jsp页面<br>String path = pageContext.getServletContext().getRealPath("/");<br>String realPath = path+"/WEB-INF/classes/abc.properties";</font></p>
<p><font size=3>//java 程序<br>InputStream in = getClass().getClassLoader().getResourceAsStream("abc.properties"); // abc.properties放在webroot/WEB-INF/classes/目录下<br>prop.load(in);<br>in.close();</font></p>
<p><font size=3>OutputStream out = new FileOutputStream(path); // path为通过页面传入的路径<br>prop.setProperty("abc", &#8220;abcccccc");<br>prop.store(out, &#8220;&#8211;test&#8211;");<br>out.close();</font></p>
<p><font size=3>3.只通过Java程序操作资源文件<br>InputStream in = new FileInputStream("abc.properties"); // 放在classes同级</font></p>
<p><font size=3>OutputStream out = new FileOutputStream("abc.properties");</font>&nbsp;&nbsp;</p>
</div>
</div>
<img src ="http://www.blogjava.net/leeguannan/aggbug/127380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leeguannan/" target="_blank">阿南</a> 2007-07-01 20:36 <a href="http://www.blogjava.net/leeguannan/articles/127380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate Iterator JCS分析 </title><link>http://www.blogjava.net/leeguannan/articles/120759.html</link><dc:creator>阿南</dc:creator><author>阿南</author><pubDate>Tue, 29 May 2007 13:44:00 GMT</pubDate><guid>http://www.blogjava.net/leeguannan/articles/120759.html</guid><wfw:comment>http://www.blogjava.net/leeguannan/comments/120759.html</wfw:comment><comments>http://www.blogjava.net/leeguannan/articles/120759.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/leeguannan/comments/commentRss/120759.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/leeguannan/services/trackbacks/120759.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td>
            <p>JCS是一个对象Cache，它可以把Java对象缓存起来，提高那些访问频率很高的Java对象的存取效率。JCS是按照对象的唯一标示来存取对象的，比如说可以按照对象的hashCode来存取。</p>
            <p>对于Hibernate来说，可以利用JCS来缓存查询结果，这样当下次访问同样的数据，就无须去数据库取，直接从JCS中取出来，加快了查询速度。</p>
            <p>当Hibernate使用List或者Iterator方式来第一次读取数据的时候，JCS是空的，此时不管是List方式还是Iterator方式都会往JCS里面填充查询出来的持久对象，例如：</p>
            <pre class=code>select c from Cat as c </pre>
            <p>而</p>
            <pre class=code>select c.id, c.name  from Cat as c</pre>
            <p>这种HQL语句不构造PO，因此不会去填充JCS。</p>
            <p>好了，现在JCS里面填好了数据，但是该怎么取呢？上面我说过是按照对象的唯一标示来存取的，而对于PO持久对象来说，唯一标示就是主键，因此Hibernate首先必须获得主键列表，然后根据主键列表挨个判断，看这个持久对象究竟是在JCS里面还是在数据库里面，如果在JCS里面，那么按照主键取，如果在数据库，那么发送sql取。</p>
            <p>现在我们来分析为什么Iterator可以使用JCS，而List不能。上面说了，用JCS之前，要先获得持久对象的主键，才能去JCS里面取持久对象，而我们怎么才能获得主键列表呢？必须去数据库中取得，这一步是没有办法缓冲的。</p>
            <p>Hibernate Iterator的查询本身是分为两步的：</p>
            <pre class=code>==&gt; select id from cat ==&gt; select * from cat where id = ?==&gt; select * from cat where id = ?...==&gt; select * from cat where id = ?</pre>
            <p>第一步，去数据库中取主键列表，第二步，按照主键一个一个取数据。当然了，我们现在可以看出来，Iterator方式下如果不用JCS的话，那么从数据库中取出n条记录就需要n+1次sql查询，这是非常可怕的事情，因此如果在没有使用JCS的情况下，你又必须一次去取大量数据，应该避免使用Iterator。</p>
            <p>而Iterator的第一次sql是取主键列表，这个时间消耗是非常少的，如果使用了JCS，那么每次查询仍然要不可避免的去发送一次sql: select id from cat 去取主键列表，然后呢？ 然后Iterator就不会那么傻了，他会先到JCS里面去看看，按照主键去找持久对象，如果有了，直接拿出来用，如果没有，那么只好去数据库中取得，然后再把它填到JCS里面去。</p>
            <p>因此可以看出来，JCS有点类似一个内存中的简单对象数据库， Iterator的第一次sql取主键列表是必须要到数据库里面取的，取得了主键这把钥匙以后，Iterator会首先尝试开JCS这把锁，打得开就直接进去，如果打不开，就只好去开数据库这把锁了。</p>
            <p>而Hibernate List方式是JDBC的简单封装，一次sql就把所有的数据都取出来了，它不会像Iterator那样先取主键，然后再取数据，因此List无法利用JCS。不过List也可以把从数据库中取出的数据填充到JCS里面去。</p>
            <p>最佳的方式：第一次访问使用List，快速填充JCS，以后访问采用Iterator，充分利用JCS。</p>
            <p>mikeho write:</p>
            <p>那JCS是如何和Database保持同步的？ </p>
            <p>robbin write:</p>
            <p>jcs.default.elementattributes.MaxLifeSeconds=240（最大缓冲时间） </p>
            <p>超时做作废，另外你在程序里面也可以clear JCS cache</p>
            </td>
        </tr>
        <tr>
            <td><br></td>
        </tr>
    </tbody>
</table>
<br><br>
<p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=261240</p>
<img src ="http://www.blogjava.net/leeguannan/aggbug/120759.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/leeguannan/" target="_blank">阿南</a> 2007-05-29 21:44 <a href="http://www.blogjava.net/leeguannan/articles/120759.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>