﻿<?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-java 学习-随笔分类-java</title><link>http://www.blogjava.net/zxfahjz/category/10437.html</link><description>软件开发相关方面的学习</description><language>zh-cn</language><lastBuildDate>Thu, 01 Mar 2007 19:10:33 GMT</lastBuildDate><pubDate>Thu, 01 Mar 2007 19:10:33 GMT</pubDate><ttl>60</ttl><item><title>java for循环</title><link>http://www.blogjava.net/zxfahjz/archive/2006/12/05/85561.html</link><dc:creator>zxf</dc:creator><author>zxf</author><pubDate>Tue, 05 Dec 2006 05:56:00 GMT</pubDate><guid>http://www.blogjava.net/zxfahjz/archive/2006/12/05/85561.html</guid><wfw:comment>http://www.blogjava.net/zxfahjz/comments/85561.html</wfw:comment><comments>http://www.blogjava.net/zxfahjz/archive/2006/12/05/85561.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zxfahjz/comments/commentRss/85561.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zxfahjz/services/trackbacks/85561.html</trackback:ping><description><![CDATA[List&lt;String&gt; slist = new ArrayList&lt;String&gt;();<br />slist.add("str1");<br />slist.add("str2");<br />slist.add("str3");<br />slist.add("str4");<br />slist.add("str5");<br />for(String tempStr:slist) {<br />   System.out.println(tempStr);<br />}<img src ="http://www.blogjava.net/zxfahjz/aggbug/85561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zxfahjz/" target="_blank">zxf</a> 2006-12-05 13:56 <a href="http://www.blogjava.net/zxfahjz/archive/2006/12/05/85561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>把三个文件放到一个zip文件中</title><link>http://www.blogjava.net/zxfahjz/archive/2006/08/03/61600.html</link><dc:creator>zxf</dc:creator><author>zxf</author><pubDate>Thu, 03 Aug 2006 13:48:00 GMT</pubDate><guid>http://www.blogjava.net/zxfahjz/archive/2006/08/03/61600.html</guid><wfw:comment>http://www.blogjava.net/zxfahjz/comments/61600.html</wfw:comment><comments>http://www.blogjava.net/zxfahjz/archive/2006/08/03/61600.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zxfahjz/comments/commentRss/61600.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zxfahjz/services/trackbacks/61600.html</trackback:ping><description><![CDATA[
		<p>import java.io.*;<br />import java.util.zip.*;<br />public class Example4 {<br />   //writing a zip archive<br />   static ZipOutputStream myZOS;</p>
		<p>   public static void main(String args[]) {<br />      myZOS = new ZipOutputStream (<br />                              new BufferedOutputStream(<br />                                       new FileOutputStream("code.zip")));<br />      writeOneFile("Example1.java");<br />      writeOneFile("Example2.java");<br />      writeOneFile("Example3.java");<br />      myZOS.close();<br />   }<br /><br />   static void writeOneFile(String name) throws IOException {<br />      ZipEntry myZE = new ZipEntry(name);<br />      myZOS.putNextEntry(myZE);<br />      <br />      BufferedReader myBR = new BufferedReader(new FileReader(name));<br />      int c;<br />      while((c = myBR.read()) != -1)//read a char until EOF<br />           myZOS.write(c);<br />       myBR.close();                                                       <br />   }<br />}</p>
<img src ="http://www.blogjava.net/zxfahjz/aggbug/61600.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zxfahjz/" target="_blank">zxf</a> 2006-08-03 21:48 <a href="http://www.blogjava.net/zxfahjz/archive/2006/08/03/61600.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java入门——Java修饰词总结</title><link>http://www.blogjava.net/zxfahjz/archive/2006/06/22/54543.html</link><dc:creator>zxf</dc:creator><author>zxf</author><pubDate>Thu, 22 Jun 2006 09:57:00 GMT</pubDate><guid>http://www.blogjava.net/zxfahjz/archive/2006/06/22/54543.html</guid><wfw:comment>http://www.blogjava.net/zxfahjz/comments/54543.html</wfw:comment><comments>http://www.blogjava.net/zxfahjz/archive/2006/06/22/54543.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zxfahjz/comments/commentRss/54543.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zxfahjz/services/trackbacks/54543.html</trackback:ping><description><![CDATA[Java语言定义了public、protected、private、abstract、static和final这6常用修饰<br />词外还定义了5个不太常用的修饰词，下面是对这11个Java修饰词的介绍：<br /><br />1.public<br /><br />使用对象：类、接口、成员<br /><br />介绍：无论它所处在的包定义在哪，该类（接口、成员）都是可访问的<br /><br />2.private<br /><br />使用对象：成员<br /><br />介绍：成员只可以在定义它的类中被访问<br /><br />3.static<br /><br />使用对象：类、方法、字段、初始化函数<br /><br />介绍：成名为static的内部类是一个顶级类，它和包含类的成员是不相关的。静态方法<br />是类方法，<br /><br />是被指向到所属的类而不是类的实例。静态字段是类字段，无论该字段所在的类创建了<br />多少实例，该字<br /><br />段只存在一个实例被指向到所属的类而不是类的实例。初始化函数是在装载类时执行<br />的，而不是在创建<br /><br />实例时执行的。<br /><br />4.final<br /><br />使用对象：类、方法、字段、变量<br /><br />介绍：被定义成final的类不允许出现子类，不能被覆盖（不应用于动态查询），字段值<br />不允许被<br /><br />修改。<br /><br />5.abstract<br /><br />使用对象：类、接口、方法<br /><br />介绍：类中包括没有实现的方法，不能被实例化。如果是一个abstract方法，则方法体<br />为空，该方<br /><br />法的实现在子类中被定义，并且包含一个abstract方法的类必须是一个abstract类<br /><br />6.protected<br /><br />使用对象：成员<br /><br />介绍：成员只能在定义它的包中被访问，如果在其他包中被访问，则实现这个方法的类<br />必须是该成<br /><br />员所属类的子类。<br /><br />7.native<br /><br />使用对象：成员<br /><br />介绍：与操作平台相关，定义时并不定义其方法，方法的实现被一个外部的库实现。<br /><br />8.strictfp<br /><br />使用对象：类、方法<br /><br />介绍：strictfp修饰的类中所有的方法都隐藏了strictfp修饰词，方法执行的所有浮点<br />计算遵守<br /><br />IEEE 754标准，所有取值包括中间的结果都必须表示为float或double类型，而不能利用<br />由本地平台浮<br /><br />点格式或硬件提供的额外精度或表示范围。<br /><br />9.synchronized<br /><br />使用对象：方法<br /><br />介绍：对于一个静态的方法，在执行之前jvm把它所在的类锁定；对于一个非静态类的方<br />法，执行<br /><br />前把某个特定对象实例锁定。<br /><br />10.volatile<br /><br />使用对象：字段<br /><br />介绍：因为异步线程可以访问字段，所以有些优化操作是一定不能作用在字段上的。<br />volatile有时<br /><br />可以代替synchronized。<br /><br />11.transient<br /><br />使用对象：字段<br /><br />介绍：字段不是对象持久状态的一部分，不应该把字段和对象一起串起。<img src ="http://www.blogjava.net/zxfahjz/aggbug/54543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zxfahjz/" target="_blank">zxf</a> 2006-06-22 17:57 <a href="http://www.blogjava.net/zxfahjz/archive/2006/06/22/54543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>两种Java容器类List和Set分析</title><link>http://www.blogjava.net/zxfahjz/archive/2006/06/22/54540.html</link><dc:creator>zxf</dc:creator><author>zxf</author><pubDate>Thu, 22 Jun 2006 09:46:00 GMT</pubDate><guid>http://www.blogjava.net/zxfahjz/archive/2006/06/22/54540.html</guid><wfw:comment>http://www.blogjava.net/zxfahjz/comments/54540.html</wfw:comment><comments>http://www.blogjava.net/zxfahjz/archive/2006/06/22/54540.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zxfahjz/comments/commentRss/54540.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zxfahjz/services/trackbacks/54540.html</trackback:ping><description><![CDATA[容器类可以大大提高编程效率和编程能力，在Java2中，所有的容器都由SUN公司的Joshua Bloch进行了重新设计，丰富了容器类库的功能。 <br /><br />　　Java2容器类类库的用途是“保存对象”，它分为两类： <br /><br />　　Collection----一组独立的元素，通常这些元素都服从某种规则。List必须保持元素特定的顺序，而Set不能有重复元素。 <br /><br />　　Map----一组成对的“键值对”对象，即其元素是成对的对象，最典型的应用就是数据字典，并且还有其它广泛的应用。另外，Map可以返回其所有键组成的Set和其所有值组成的Collection，或其键值对组成的Set，并且还可以像数组一样扩展多维Map，只要让Map中键值对的每个“值”是一个Map即可。 <br /><br />　　1.迭代器 <br /><br />　　迭代器是一种设计模式，它是一个对象，它可以遍历并选择序列中的对象，而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象，因为创建它的代价小。 <br /><br />　　Java中的Iterator功能比较简单，并且只能单向移动： <br /><br />　　(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时，它返回序列的第一个元素。 <br /><br />　　(2) 使用next()获得序列中的下一个元素。 <br /><br />　　(3) 使用hasNext()检查序列中是否还有元素。 <br /><br />　　(4) 使用remove()将迭代器新返回的元素删除。 <br /><br />　　Iterator是Java迭代器最简单的实现，为List设计的ListIterator具有更多的功能，它可以从两个方向遍历List，也可以从List中插入和删除元素。 <br /><br />　　2.List的功能方法 <br /><br />　　List(interface): 次序是List最重要的特点；它确保维护元素特定的顺序。List为Collection添加了许多方法，使得能够向List中间插入与移除元素(只推荐LinkedList使用)。一个List可以生成ListIterator，使用它可以从两个方向遍历List，也可以从List中间插入和删除元素。 <br /><br />　　ArrayList: 由数组实现的List。它允许对元素进行快速随机访问，但是向List中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历ArrayList，而不是用来插入和删除元素，因为这比LinkedList开销要大很多。 <br /><br />　　LinkedList: 对顺序访问进行了优化，向List中间插入与删除得开销不大，随机访问则相对较慢(可用ArrayList代替)。它具有方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast()，这些方法(没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。 <br /><br />　　3.Set的功能方法 <br /><br />　　Set(interface): 存入Set的每个元素必须是唯一的，因为Set不保存重复元素。加入Set的Object必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。 <br /><br />　　HashSet: 为快速查找而设计的Set。存入HashSet的对象必须定义hashCode()。 <br /><br />　　TreeSet: 保持次序的Set，底层为树结构。使用它可以从Set中提取有序的序列。 <br /><br />　　LinkedHashSet: 具有HashSet的查询速度，且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时，结果会按元素插入的次序显示。 <br /><br />　　HashSet采用散列函数对元素进行排序，这是专门为快速查询而设计的；TreeSet采用红黑树的数据结构进行排序元素；LinkedHashSet内部使用散列以加快查询速度，同时使用链表维护元素的次序，使得看起来元素是以插入的顺序保存的。需要注意的是，生成自己的类时，Set需要维护元素的存储顺序，因此要实现Comparable接口并定义compareTo()方法。<img src ="http://www.blogjava.net/zxfahjz/aggbug/54540.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zxfahjz/" target="_blank">zxf</a> 2006-06-22 17:46 <a href="http://www.blogjava.net/zxfahjz/archive/2006/06/22/54540.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java程序操作mysql方法收集</title><link>http://www.blogjava.net/zxfahjz/archive/2006/05/29/48765.html</link><dc:creator>zxf</dc:creator><author>zxf</author><pubDate>Mon, 29 May 2006 07:55:00 GMT</pubDate><guid>http://www.blogjava.net/zxfahjz/archive/2006/05/29/48765.html</guid><wfw:comment>http://www.blogjava.net/zxfahjz/comments/48765.html</wfw:comment><comments>http://www.blogjava.net/zxfahjz/archive/2006/05/29/48765.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zxfahjz/comments/commentRss/48765.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zxfahjz/services/trackbacks/48765.html</trackback:ping><description><![CDATA[把字段名和类型加入表中：alter table tabelName add column fieldName fieldType<br />把表中的字段drop掉：alter table tableName drop strFieldName<br />显示表中所有的列：show COLUMNS from tableName<br />显示数据库中所有表：show tables from datebaseName<img src ="http://www.blogjava.net/zxfahjz/aggbug/48765.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zxfahjz/" target="_blank">zxf</a> 2006-05-29 15:55 <a href="http://www.blogjava.net/zxfahjz/archive/2006/05/29/48765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中实现四舍五入</title><link>http://www.blogjava.net/zxfahjz/archive/2006/04/29/43966.html</link><dc:creator>zxf</dc:creator><author>zxf</author><pubDate>Sat, 29 Apr 2006 03:14:00 GMT</pubDate><guid>http://www.blogjava.net/zxfahjz/archive/2006/04/29/43966.html</guid><wfw:comment>http://www.blogjava.net/zxfahjz/comments/43966.html</wfw:comment><comments>http://www.blogjava.net/zxfahjz/archive/2006/04/29/43966.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zxfahjz/comments/commentRss/43966.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zxfahjz/services/trackbacks/43966.html</trackback:ping><description><![CDATA[public int getRound(double dSource){<br />int iRound<br />//BigDecimal的构造函数参数类型是double<br />BigDecimal deSource = new BigDecimal(dSource);<br />//deSource.setScale(0,BigDecimal.ROUND_HALF_UP) 返回值类型 BigDecimal<br />//intValue() 方法将BigDecimal转化为int<br />iRound= deSource.setScale(0,BigDecimal.ROUND_HALF_UP).intValue();<br />return iRound;<br />} <br /><br /><p>java中解决百分比保留两位小数并要求四舍五入的方法：</p><p>例如：</p><p>DecimalFormat df1 = new DecimalFormat("##.00%");      <br />String a = df1.format(0.56566);<br />System.out.println(a);</p><p>结果&gt;&gt;56.57%</p><p>在网上找到了下面这个文章觉得不错，在这篇文章中找到了方法解决了这个问题:</p><p>//--------------------------------------------------------------</p><p>//保留小数点后两位小数<br />public double Number2(double pDouble)<br />{<br />  BigDecimal  bd=new  BigDecimal(pDouble);<br />  BigDecimal  bd1=bd.setScale(2,bd.ROUND_HALF_UP);<br />  pDouble=bd1.doubleValue();<br />  long  ll = Double.doubleToLongBits(pDouble);<br />  <br />  return pDouble;<br />}</p><p>格式化输出数字<br />翻译：Cherami<br />email:cherami@163.net<br />原文：<a href="http://developer.java.sun.com/developer/TechTips/2000/tt0411.html">http://developer.java.sun.com/developer/TechTips/2000/tt0411.html</a><br /> * 格式化输出数字<br />格式化输出数字<br />有时我们需要控制输出的数字的格式，如何使用java的类库做到这个呢？<br />也许你不关心格式，但是你需要关心你的程序可以在全世界通用，像下面的这样一个简单的语句是依赖地区的：<br />    System.out.println(1234.56);<br />在美国，"." 是小数点，但在其它地方就不一定了。如何处理这个呢？</p><p>java.text 包中的一些包可以处理这类问题。下面的简单范例使用那些类解决上面提出的问题：</p><p>    import java.text.NumberFormat;</p><p>    import java.util.Locale;</p><p>    public class DecimalFormat1 {</p><p>        public static void main(String args[]) {</p><p>            // 得到本地的缺省格式</p><p>            NumberFormat nf1 = NumberFormat.getInstance();</p><p>            System.out.println(nf1.format(1234.56));</p><p>            // 得到德国的格式</p><p>            NumberFormat nf2 =</p><p>                NumberFormat.getInstance(Locale.GERMAN);</p><p>            System.out.println(nf2.format(1234.56));</p><p>        }</p><p>    }</p><p>如果你在美国，运行程序后输出：</p><p>    1,234.56</p><p>    1.234,56</p><p>换句话说，在不同的地方使用不同的习惯表示数字。</p><p>NumberFormat.getInstance()方法返回NumberFormat的一个实例(实际上是NumberFormat具体的一个子类，例如DecimalFormat), 这适合根据本地设置格式化一个数字。你也可以使用非缺省的地区设置，例如德国。然后格式化方法根据特定的地区规则格式化数字。这个程序也可以使用一个简单的形式：</p><p>    NumberFormat.getInstance().format(1234.56)</p><p>但是保存一个格式然后重用更加有效。国际化是格式化数字时的一个大问题。</p><p>另一个是对格式的有效控制，例如指定小数部分的位数，下面是解决这个问题的一个简单例子：</p><p>    import java.text.DecimalFormat;</p><p>    import java.util.Locale;</p><p>    public class DecimalFormat2 {</p><p>        public static void main(String args[]) {</p><p>            // 得到本地的缺省格式</p><p>            DecimalFormat df1 = new DecimalFormat("####.000");</p><p>            System.out.println(df1.format(1234.56));</p><p>            // 得到德国的格式</p><p>            Locale.setDefault(Locale.GERMAN);</p><p>            DecimalFormat df2 = new DecimalFormat("####.000");</p><p>            System.out.println(df2.format(1234.56));</p><p>        }</p><p>    }</p><p>在这个例子中设置了数字的格式，使用像"####.000"的符号。这个模式意味着在小数点前有四个数字，如果不够就空着，小数点后有三位数字，不足用0补齐。程序的输出：</p><p>    1234.560</p><p>    1234,560</p><p>相似的，也可以控制指数形式的格式，例如：</p><p>    import java.text.DecimalFormat;</p><p>    public class DecimalFormat3 {</p><p>        public static void main(String args[]) {</p><p>            DecimalFormat df = new DecimalFormat("0.000E0000");</p><p>            System.out.println(df.format(1234.56));</p><p>        }</p><p>    }</p><p>输出：</p><p>    1.235E0003</p><p>对于百分数：</p><p>    import java.text.NumberFormat;</p><p>    public class DecimalFormat4 {</p><p>        public static void main(String args[]) {</p><p>            NumberFormat nf = NumberFormat.getPercentInstance();</p><p>            System.out.println(nf.format(0.47));</p><p>        }</p><p>    }</p><p>输出：</p><p>    47%</p><p>至此，你已经看到了格式化数字的几个不同的技术。另一方面，如何读取并解析包含格式化的数字的字符串？解析支持包含在NumberFormat中。例如：</p><p>    import java.util.Locale;</p><p>    import java.text.NumberFormat;</p><p>    import java.text.ParseException;</p><p>    public class DecimalFormat5 {</p><p>        public static void main(String args[]) {</p><p>            // 本地格式</p><p>            NumberFormat nf1 = NumberFormat.getInstance();</p><p>            Object obj1 = null;</p><p>            // 基于格式的解析</p><p>            try {</p><p>                obj1 = nf1.parse("1234,56");</p><p>            }</p><p>            catch (ParseException e1) {</p><p>                System.err.println(e1);</p><p>            }</p><p>            System.out.println(obj1);</p><p>            // 德国格式</p><p>            NumberFormat nf2 =</p><p>                NumberFormat.getInstance(Locale.GERMAN);</p><p>            Object obj2 = null;</p><p>            // 基于格式的解析</p><p>            try {</p><p>                obj2 = nf2.parse("1234,56");</p><p>            }</p><p>            catch (ParseException e2) {</p><p>                System.err.println(e2);</p><p>            }</p><p>            System.out.println(obj2);</p><p>        }</p><p>    }</p><p>这个例子分两部分，都是解析一个字符串："1234,56"。第一部分使用本地格式解析，第二部分使用德国格式解析。当程序在美国运行，结果是：</p><p>    123456</p><p>    1234.56</p><p>换句话说，"1234,56"在美国被认为是一个巨大的整数"123456"而在德国被认为是一个小数"1234.56"。</p><p>还有格式化讨论的最后一个问题。在上面的例子中， DecimalFormat 和 NumberFormat 都被使用了。DecimalFormat 常用于获得很好的格式控制，而NumberFormat 常用于指定不同于本地的地区。如何结合两个类呢？</p><p>答案围绕着这样的事实：DecimalFormat是NumberFormat的一个子类,其实例被指定为特定的地区。因此，你可以使用NumberFormat.getInstance 指定一个地区，然后将结构强制转换为一个DecimalFormat对象。文档中提到这个技术可以在大多情况下适用，但是你需要用try/catch 块包围强制转换以防转换不能正常工作 (大概在非常不明显得情况下使用一个奇异的地区)。下面是一个这样的例子：</p><p>    import java.text.DecimalFormat;</p><p>    import java.text.NumberFormat;</p><p>    import java.util.Locale;</p><p>    public class DecimalFormat6 {</p><p>        public static void main(String args[]) {</p><p>            DecimalFormat df = null;</p><p>            // 得到一个NumberFormat 对象并</p><p>            // 强制转换为一个 DecimalFormat 对象</p><p>            try {</p><p>                df = (DecimalFormat)</p><p>                    NumberFormat.getInstance(Locale.GERMAN);</p><p>            }</p><p>            catch (ClassCastException e) {</p><p>                System.err.println(e);</p><p>            }</p><p>            // 设置格式模式</p><p>            df.applyPattern("####.00000");</p><p>            // format a number</p><p>            System.out.println(df.format(1234.56));</p><p>        }</p><p>    }</p><p> </p><p>getInstance() 方法获得格式，然后调用applyPattern()方法设置格式模式，输出：</p><p>    1234,56000</p><p>如果你不关心国际化，可以直接使用DecimalFormat 。</p><img src ="http://www.blogjava.net/zxfahjz/aggbug/43966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zxfahjz/" target="_blank">zxf</a> 2006-04-29 11:14 <a href="http://www.blogjava.net/zxfahjz/archive/2006/04/29/43966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat全攻略</title><link>http://www.blogjava.net/zxfahjz/archive/2006/04/28/43719.html</link><dc:creator>zxf</dc:creator><author>zxf</author><pubDate>Fri, 28 Apr 2006 02:05:00 GMT</pubDate><guid>http://www.blogjava.net/zxfahjz/archive/2006/04/28/43719.html</guid><wfw:comment>http://www.blogjava.net/zxfahjz/comments/43719.html</wfw:comment><comments>http://www.blogjava.net/zxfahjz/archive/2006/04/28/43719.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zxfahjz/comments/commentRss/43719.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zxfahjz/services/trackbacks/43719.html</trackback:ping><description><![CDATA[
		<span class="atitle3">(一)：</span>安装及配置<br />安装--windows平台<br />从tomcat网站下载<a href="http://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/v4.0.1/bin/jakarta-tomcat-4.0.1.exe" target="_blank">jakarta-tomcat-4.0.1.exe</a>，按照一般的windows程序安装步骤即可安装好tomcat,安装时它会自动寻找你的jdk和jre的位置。<br /><p><span class="atitle3">(二)：配置</span><br />运行tomcat需要设置JAVA_HOME变量</p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>JAVA_HOME=c:/jdk</code></pre></td></tr></tbody></table><p><span class="atitle3">(三)：运行</span><br />设置完毕后就可以运行tomcat服务器了，进入tomcat的bin目录，win98下用startup启动tomcat，linux下用startup.sh，相应的关闭tomcat的命令为shutdown和shutdown.sh。</p><p>启动后可以在浏览器中输入<a href="http://localhost:8080/">http://localhost:8080/</a>测试，由于tomcat本身具有web服务器的功能，因此我们不必安装apache，当然其也可以与apache集成到一起。<br /></p><p>（四）<a id="3" name="3"><span class="atitle2">：应用</span></a></p><p><span class="atitle3">(1):目录结构</span><br />tomcat的目录结构如下：</p><p></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td>目录名</td><td>简介</td></tr><tr><td>bin</td><td>存放启动和关闭tomcat脚本</td></tr><tr><td>conf</td><td>包含不同的配置文件,server.xml(Tomcat的主要配置文件)和web.xml</td></tr><tr><td>work</td><td>存放jsp编译后产生的class文件</td></tr><tr><td>webapp</td><td>存放应用程序示例，以后你要部署的应用程序也要放到此目录</td></tr><tr><td>logs</td><td>存放日志文件</td></tr><tr><td>lib/japser/common</td><td>这三个目录主要存放tomcat所需的jar文件</td></tr></tbody></table><br /><span class="atitle3">(2)：server.xml配置简介</span><br />下面我们将讲述这个文件中的基本配置信息，更具体的配置信息见tomcat的文档
<p></p><table cellspacing="0" cellpadding="0" width="80%" bgcolor="#cccccc" border="1"><tbody><tr><td width="27%">元素名</td><td width="21%">属性</td><td width="52%">解释</td></tr><tr><td width="27%" rowspan="2">server</td><td width="21%">port</td><td width="52%">指定一个端口，这个端口负责监听关闭tomcat的请求</td></tr><tr><td width="21%">shutdown</td><td width="52%">指定向端口发送的命令字符串</td></tr><tr><td width="27%">service</td><td width="21%">name</td><td width="52%">指定service的名字</td></tr><tr><td width="27%" rowspan="7">Connector<br />(表示客户端和service之间的连接)</td><td width="21%">port</td><td width="52%">指定服务器端要创建的端口号，并在这个断口监听来自客户端的请求</td></tr><tr><td width="21%">minProcessors</td><td width="52%">服务器启动时创建的处理请求的线程数</td></tr><tr><td width="21%">maxProcessors</td><td width="52%">最大可以创建的处理请求的线程数</td></tr><tr><td width="21%">enableLookups</td><td width="52%">如果为true，则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名，若为false则不进行DNS查询，而是返回其ip地址</td></tr><tr><td width="21%">redirectPort</td><td width="52%">指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号</td></tr><tr><td width="21%">acceptCount</td><td width="52%">指定当所有可以使用的处理请求的线程数都被使用时，可以放到处理队列中的请求数，超过这个数的请求将不予处理</td></tr><tr><td width="21%">connectionTimeout</td><td width="52%">指定超时的时间数(以毫秒为单位)</td></tr><tr><td width="27%">Engine<br />(表示指定service中的请求处理机，接收和处理来自Connector的请求)</td><td width="21%">defaultHost</td><td width="52%">指定缺省的处理请求的主机名，它至少与其中的一个host元素的name属性值是一样的</td></tr><tr><td width="27%" rowspan="3">Context<br />(表示一个web应用程序，通常为WAR文件，关于WAR的具体信息见servlet规范)</td><td width="21%">docBase</td><td width="52%">应用程序的路径或者是WAR文件存放的路径</td></tr><tr><td width="21%">path</td><td width="52%">表示此web应用程序的url的前缀，这样请求的url为http://localhost:8080/path/****</td></tr><tr><td width="21%">reloadable</td><td width="52%">这个属性非常重要，如果为true，则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化，自动装载新的应用程序，我们可以在不重起tomcat的情况下改变应用程序</td></tr><tr><td width="27%" rowspan="3"><p>host<br />(表示一个虚拟主机)</p></td><td width="21%">name</td><td width="52%">指定主机名</td></tr><tr><td width="21%">appBase</td><td width="52%">应用程序基本目录，即存放应用程序的目录</td></tr><tr><td width="21%">unpackWARs</td><td width="52%">如果为true，则tomcat会自动将WAR文件解压，否则不解压，直接从WAR文件中运行应用程序</td></tr><tr><td rowspan="4"><p>Logger<br />(表示日志，调试和错误信息)</p></td><td width="21%">className</td><td width="52%">指定logger使用的类名，此类必须实现org.apache.catalina.Logger 接口</td></tr><tr><td width="21%">prefix</td><td width="52%">指定log文件的前缀</td></tr><tr><td width="21%">suffix</td><td width="52%">指定log文件的后缀</td></tr><tr><td width="21%">timestamp</td><td width="52%">如果为true，则log文件名中要加入时间，如下例:localhost_log.2001-10-04.txt</td></tr><tr><td width="27%"><p>Realm<br />(表示存放用户名，密码及role的数据库)</p></td><td width="21%">className</td><td width="52%">指定Realm使用的类名，此类必须实现org.apache.catalina.Realm接口</td></tr><tr><td rowspan="3"><p>Valve<br />(功能与Logger差不多，其prefix和suffix属性解释和Logger 中的一样)</p></td><td width="21%">className</td><td width="52%"><p>指定Valve使用的类名，如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息</p></td></tr><tr><td width="21%">directory</td><td width="52%">指定log文件存放的位置</td></tr><tr><td width="21%">pattern</td><td width="52%">有两个值，common方式记录远程主机名或ip地址，用户名，日期，第一行请求的字符串，HTTP响应代码，发送的字节数。combined方式比common方式记录的值更多</td></tr></tbody></table><p>注意：1：经过我测试，我设置Context 的path="",reloadable=true，然后放一个WAR文件到webapps目录，结果tomcat不能检测出此文件(重起tomcat可以)，而把此文件解压，则tomcat会自动检测出这个新的应用程序。如果不能自动检测WAR文件，我们可以利用下面管理中讲的方法来部署应用程序。</p><p>2：默认的server.xml中，Realm元素只设置了一个className属性，但此文件中也包含几个通过JDBC连接到数据库进行验证的示例(被注释掉了)，通过Realm元素我们可以实现容器安全管理(Container Managed Security)。</p><p>3：还有一些元素我们没有介绍，如Parameter，loader，你可以通过tomcat的文档获取这些元素的信息。</p><p><span class="atitle3">(3)：管理</span></p><p><b>1：配置</b><br />在进行具体的管理之前，我们先给tomcat添加一个用户，使这个用户有权限来进行管理。</p><p>打开conf目录下的tomcat-users.xml文件，在相应的位置添加下面一行：</p><p></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>&lt;user name="zf" password="zf" roles="standard,manager"/&gt; 
</code></pre></td></tr></tbody></table><p>注意：这一行的最后部分一定是/&gt;,tomcat的文档掉了/符号，如果没有/符号的话，tomcat重起时将无法访问应用程序。通过logs/catalina.out文件你可以看到这个错误的详细信息。</p><p>然后重起tomcat，在浏览器中输入http://localhost:8080/manager/，会弹出对话框，输入上面的用户名和密码即可。</p><p><b>2：应用程序列表</b><br />在浏览器中输入http://localhost:8080/manager/list，浏览器将会显示如下的信息：</p><p></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>OK - Listed applications for virtual host localhost
/ex:running:1
/examples:running:1
/webdav:running:0
/tomcat-docs:running:0
/manager:running:0
/:running:0</code></pre></td></tr></tbody></table><p>面的信息分别为应用程序的路径，当前状态(running 或者stopped)，与这个程序相连的session数。</p><p><b>3：重新装载应用程序</b><br />在浏览器中输入 http://localhost:8080/manager/reload?path=/examples，浏览器显示如下：</p><p></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>OK - Reloaded application at context path /examples  
</code></pre></td></tr></tbody></table><p>表示example应用程序装载成功，如果我们将server.xml的Context元素的reloadable属性设为true(见上面表格)，则没必要利用这种方式重新装载应用程序，因为tomcat会自动装载。</p><p><b>4：显示session信息</b><br />在浏览器中输入http://localhost:8080/manager/sessions?path=/examples，浏览器显示如下：</p><p></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>OK - Session information for application at context path /examples Default maximum session inactive interval 30 minutes  
</code></pre></td></tr></tbody></table><p><b>5：启动和关闭应用程序</b><br />在浏览器中输入http://localhost:8080/manager/start?path=/examples和http://localhost:8080/manager/stop?path=/examples分别启动和关闭examples应用程序。</p><p><b>6：部署及撤销部署</b><br />WAR有两种组织方式，一种是按一定的目录结构组织文件，一种是一个后缀为WAR的压缩包，因此它的部署方式也有两种：<br />(1)：在浏览器中输入：<code>http://localhost:8080/manager/install?path=/examples&amp;war=file:/c:\examples</code><br />就会将按目录结构组织的WAR部署</p><p>(2)：如果输入:<code>http://localhost:8080/manager/install?path=/examples&amp;war=jar:file:/c:\examples.war!/</code><br />就会将按压缩包组织的WAR部署，注意此url后半部分一定要有!/号。</p><p>部署后就可以用 http://localhost:8080/examples访问了。</p><p>在浏览器中输入：<code>http://localhost:8080/manager/remove?path=/examples</code><br />就会撤销刚才部署的应用程序。</p><p><span class="atitle3">(4)：与apache集成</span><br />虽然tomcat也可以作web服务器,但其处理静态html的速度比不上apache,且其作为web服务器的功能远不如apache,因此我们想把apache和tomcat集成起来。</p><p>我们以linux系统为例介绍.</p><p>从apache网站下载<a href="http://www.apache.org/dist/httpd/apache_1.3.22.tar.gz" target="_blank"><font color="#002c99">apache1.3.22源代码版本</font></a>，然后使用如下命令配置安装apache：</p><p></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>mkdir /usr/local/apache
tar zxvf apache.1.32.tar.gz
cd apache.1.32
./configure --prefix=/usr/local/apache --enable-module=so 
make
make install
</code></pre></td></tr></tbody></table><p>注意configure命令指定目标安装目录，并且加入DSO(Dynamic Shared Object)支持，注意一定不要忘了这一个选项。</p><p>然后下载<a href="http://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/v4.0.1/bin/linux/i386/webapp-module-1.0-tc40-linux-glibc2.2.tar.gz" target="_blank"><font color="#002c99">webapp模块</font></a>，将解压后mod_webapp.so文件放入apache的libexec目录，编辑apache的conf目录下的httpd.conf，在这个文件的最后加入下面三行：</p><p></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>LoadModule webapp_module libexec/mod_webapp.so
WebAppConnection warpConnection warp localhost:8008
WebAppDeploy examples warpConnection /examples/ 
</code></pre></td></tr></tbody></table><p>第一行是加入webapp模块，如果编译apache时不增加DSO支持，则无法使用LoadModule指令，第二行指定tomcat与apache的连接，第三行指定部署那个应用，这两个指令使用格式如下：</p><p></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>WebAppConnection [connection name] [provider] [host:port]
WebAppDeploy [application name] [connection name] [url path]  
</code></pre></td></tr></tbody></table><br />其中connection name指定连接名，provider只能是warp，port端口与你的tomcat的配置文件server.xml最后几行指定的要保持一致。文件如下：
<p></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>&lt;Service name="Tomcat-Apache"&gt; 
&lt;Connector className="org.apache.catalina.connector.warp.WarpConnector"
port="8008" minProcessors="5" maxProcessors="75"
enableLookups="true"
acceptCount="10" debug="0"/&gt;
******
&lt;/Service&gt; 
</code></pre></td></tr></tbody></table><br />application name与你在tomcat中部署的应用名一致，url path指定访问这个应用的url。例如上面的例子可以通过http://localhost/examples/来访问tomcat中的examples应用。
<p><span class="atitle3">(5)：中文问题</span><br />一般jsp的乱码问题可以通过在jsp中加入&lt;%@ page contentType="text/html;charset=GB2312" %&gt;来解决，至于servlet的乱码在可以使用servlet2.3中提供的HttpServeletRequest.setCharacterEncoding函数。更详细的中文问题请见<a href="http://www-900.ibm.com/developerWorks/cn/java/jsp_dbcsz/index.shtml" target="_blank"><font color="#002c99">JSP/Servlet 中的汉字编码问题</font></a>。</p><p><a id="4" name="4"><span class="atitle2">四：综述</span></a><br />tomcat作为一个servlet(jsp也被编译为servlet执行)容器，其应用前景是非常好的，如果与<a href="http://www.jboss.org/" target="_blank"><font color="#002c99">jboss</font></a>结合起来，则可以实现sun的j2ee规范(用jboss作ejb服务器)。jboss的官方网站也提供集成了tomcat3.2*的jboss以供下载。另外一个开源的应用服务器(<a href="http://www.enhydra.org/" target="_blank"><font color="#002c99">enhydra</font></a>) 也是基于tomcat的，其提供了更友好的管理界面，部署应用程序也更简单，功能也更强大。</p><img src ="http://www.blogjava.net/zxfahjz/aggbug/43719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zxfahjz/" target="_blank">zxf</a> 2006-04-28 10:05 <a href="http://www.blogjava.net/zxfahjz/archive/2006/04/28/43719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Java中文件处理</title><link>http://www.blogjava.net/zxfahjz/archive/2006/04/19/41932.html</link><dc:creator>zxf</dc:creator><author>zxf</author><pubDate>Wed, 19 Apr 2006 08:11:00 GMT</pubDate><guid>http://www.blogjava.net/zxfahjz/archive/2006/04/19/41932.html</guid><wfw:comment>http://www.blogjava.net/zxfahjz/comments/41932.html</wfw:comment><comments>http://www.blogjava.net/zxfahjz/archive/2006/04/19/41932.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zxfahjz/comments/commentRss/41932.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zxfahjz/services/trackbacks/41932.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 />    public static void main(String[] args) throws Exception {<br />        System.out.println(</font>
						<font size="3">
								<font color="#ff0000">Thread.currentThread().getContextClassLoader().getResource(""));<br />        System.out.println(Test.class.getClassLoader().getResource(""));<br />        System.out.println(ClassLoader.getSystemResource(""));<br />        System.out.println(Test.class.getResource(""));<br />        System.out.println(Test.class.getResource("/"));<br />        System.out.println(new File("").getAbsolutePath());<br />        System.out.println(System.getProperty("user.dir"));</font>
								<br />    }<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  file_real_path=request.getRealPath("mypath/filename");  </font>
				</p>
				<p>
						<font size="3">通常使用request.getRealPath("/");  </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  0.1<br />*/</font>
				</p>
				<p>
						<font size="3">public class FileUtil {<br />  /**<br />   * 私有构造方法，防止类的实例化，因为工具类不需要实例化。<br />   */<br />  private FileUtil() {</font>
				</p>
				<p>
						<font size="3">  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 修改文件的最后访问时间。<br />   * 如果文件不存在则创建该文件。<br />   * &lt;b&gt;目前这个方法的行为方式还不稳定，主要是方法有些信息输出，这些信息输出是否保留还在考</font>
				</p>
				<p>
						<font size="3">虑中。&lt;/b&gt;<br />   * @param file 需要修改最后访问时间的文件。<br />   * @since  0.1<br />   */<br />  public static void touch(File file) {<br />    long currentTime = System.currentTimeMillis();<br />    if (!file.exists()) {<br />      System.err.println("file not found:" + file.getName());<br />      System.err.println("Create a new file:" + file.getName());<br />      try {<br />        if (file.createNewFile()) {<br />        //  System.out.println("Succeeded!");<br />        }<br />        else {<br />        //  System.err.println("Create file failed!");<br />        }<br />      }<br />      catch (IOException e) {<br />      //  System.err.println("Create file failed!");<br />        e.printStackTrace();<br />      }<br />    }<br />    boolean result = file.setLastModified(currentTime);<br />    if (!result) {<br />    //  System.err.println("touch failed: " + file.getName());<br />    }<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 修改文件的最后访问时间。<br />   * 如果文件不存在则创建该文件。<br />   * &lt;b&gt;目前这个方法的行为方式还不稳定，主要是方法有些信息输出，这些信息输出是否保留还在考</font>
				</p>
				<p>
						<font size="3">虑中。&lt;/b&gt;<br />   * @param fileName 需要修改最后访问时间的文件的文件名。<br />   * @since  0.1<br />   */<br />  public static void touch(String fileName) {<br />    File file = new File(fileName);<br />    touch(file);<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 修改文件的最后访问时间。<br />   * 如果文件不存在则创建该文件。<br />   * &lt;b&gt;目前这个方法的行为方式还不稳定，主要是方法有些信息输出，这些信息输出是否保留还在考</font>
				</p>
				<p>
						<font size="3">虑中。&lt;/b&gt;<br />   * @param files 需要修改最后访问时间的文件数组。<br />   * @since  0.1<br />   */<br />  public static void touch(File[] files) {<br />    for (int i = 0; i &lt; files.length; i++) {<br />      touch(files);<br />    }<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 修改文件的最后访问时间。<br />   * 如果文件不存在则创建该文件。<br />   * &lt;b&gt;目前这个方法的行为方式还不稳定，主要是方法有些信息输出，这些信息输出是否保留还在考</font>
				</p>
				<p>
						<font size="3">虑中。&lt;/b&gt;<br />   * @param fileNames 需要修改最后访问时间的文件名数组。<br />   * @since  0.1<br />   */<br />  public static void touch(String[] fileNames) {<br />    File[] files = new File[fileNames.length];<br />    for (int i = 0; i &lt; fileNames.length; i++) {<br />      files = new File(fileNames);<br />    }<br />    touch(files);<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 判断指定的文件是否存在。<br />   * @param fileName 要判断的文件的文件名<br />   * @return 存在时返回true，否则返回false。<br />   * @since  0.1<br />   */<br />  public static boolean isFileExist(String fileName) {<br />    return new File(fileName).isFile();<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 创建指定的目录。<br />   * 如果指定的目录的父目录不存在则创建其目录书上所有需要的父目录。<br />   * &lt;b&gt;注意：可能会在返回false的时候创建部分父目录。&lt;/b&gt;<br />   * @param file 要创建的目录<br />   * @return 完全创建成功时返回true，否则返回false。<br />   * @since  0.1<br />   */<br />  public static boolean makeDirectory(File file) {<br />    File parent = file.getParentFile();<br />    if (parent != null) {<br />      return parent.mkdirs();<br />    }<br />    return false;<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 创建指定的目录。<br />   * 如果指定的目录的父目录不存在则创建其目录书上所有需要的父目录。<br />   * &lt;b&gt;注意：可能会在返回false的时候创建部分父目录。&lt;/b&gt;<br />   * @param fileName 要创建的目录的目录名<br />   * @return 完全创建成功时返回true，否则返回false。<br />   * @since  0.1<br />   */<br />  public static boolean makeDirectory(String fileName) {<br />    File file = new File(fileName);<br />    return makeDirectory(file);<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 清空指定目录中的文件。<br />   * 这个方法将尽可能删除所有的文件，但是只要有一个文件没有被删除都会返回false。<br />   * 另外这个方法不会迭代删除，即不会删除子目录及其内容。<br />   * @param directory 要清空的目录<br />   * @return 目录下的所有文件都被成功删除时返回true，否则返回false.<br />   * @since  0.1<br />   */<br />  public static boolean emptyDirectory(File directory) {<br />    boolean result = false;<br />    File[] entries = directory.listFiles();<br />    for (int i = 0; i &lt; entries.length; i++) {<br />      if (!entries.delete()) {<br />        result = false;<br />      }<br />    }<br />    return true;<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 清空指定目录中的文件。<br />   * 这个方法将尽可能删除所有的文件，但是只要有一个文件没有被删除都会返回false。<br />   * 另外这个方法不会迭代删除，即不会删除子目录及其内容。<br />   * @param directoryName 要清空的目录的目录名<br />   * @return 目录下的所有文件都被成功删除时返回true，否则返回false。<br />   * @since  0.1<br />   */<br />  public static boolean emptyDirectory(String directoryName) {<br />    File dir = new File(directoryName);<br />    return emptyDirectory(dir);<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 删除指定目录及其中的所有内容。<br />   * @param dirName 要删除的目录的目录名<br />   * @return 删除成功时返回true，否则返回false。<br />   * @since  0.1<br />   */<br />  public static boolean deleteDirectory(String dirName) {<br />    return deleteDirectory(new File(dirName));<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 删除指定目录及其中的所有内容。<br />   * @param dir 要删除的目录<br />   * @return 删除成功时返回true，否则返回false。<br />   * @since  0.1<br />   */<br />  public static boolean deleteDirectory(File dir) {<br />    if ( (dir == null) || !dir.isDirectory()) {<br />      throw new IllegalArgumentException("Argument " + dir +<br />                                         " is not a directory. ");<br />    }</font>
				</p>
				<p>
						<font size="3">    File[] entries = dir.listFiles();<br />    int sz = entries.length;</font>
				</p>
				<p>
						<font size="3">    for (int i = 0; i &lt; sz; i++) {<br />      if (entries.isDirectory()) {<br />        if (!deleteDirectory(entries)) {<br />          return false;<br />        }<br />      }<br />      else {<br />        if (!entries.delete()) {<br />          return false;<br />        }<br />      }<br />    }</font>
				</p>
				<p>
						<font size="3">    if (!dir.delete()) {<br />      return false;<br />    }<br />    return true;<br />  }</font>
				</p>
				<p>
						<br />
						<font size="3">  /**<br />   * 返回文件的URL地址。<br />   * @param file 文件<br />   * @return 文件对应的的URL地址<br />   * @throws MalformedURLException<br />   * @since  0.4<br />   * @deprecated 在实现的时候没有注意到File类本身带一个toURL方法将文件路径转换为URL。<br />   *             请使用File.toURL方法。<br />   */<br />  public static URL getURL(File file) throws MalformedURLException {<br />    String fileURL = "file:/" + file.getAbsolutePath();<br />    URL url = new URL(fileURL);<br />    return url;<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 从文件路径得到文件名。<br />   * @param filePath 文件的路径，可以是相对路径也可以是绝对路径<br />   * @return 对应的文件名<br />   * @since  0.4<br />   */<br />  public static String getFileName(String filePath) {<br />    File file = new File(filePath);<br />    return file.getName();<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 从文件名得到文件绝对路径。<br />   * @param fileName 文件名<br />   * @return 对应的文件路径<br />   * @since  0.4<br />   */<br />  public static String getFilePath(String fileName) {<br />    File file = new File(fileName);<br />    return file.getAbsolutePath();<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 将DOS/Windows格式的路径转换为UNIX/Linux格式的路径。<br />   * 其实就是将路径中的"\"全部换为"/"，因为在某些情况下我们转换为这种方式比较方便，<br />   * 某中程度上说"/"比"\"更适合作为路径分隔符，而且DOS/Windows也将它当作路径分隔符。<br />   * @param filePath 转换前的路径<br />   * @return 转换后的路径<br />   * @since  0.4<br />   */<br />  public static String toUNIXpath(String filePath) {<br />    return filePath.replace('\\', '/');<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 从文件名得到UNIX风格的文件绝对路径。<br />   * @param fileName 文件名<br />   * @return 对应的UNIX风格的文件路径<br />   * @since  0.4<br />   * @see #toUNIXpath(String filePath) toUNIXpath<br />   */<br />  public static String getUNIXfilePath(String fileName) {<br />    File file = new File(fileName);<br />    return toUNIXpath(file.getAbsolutePath());<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 得到文件的类型。<br />   * 实际上就是得到文件名中最后一个“.”后面的部分。<br />   * @param fileName 文件名<br />   * @return 文件名中的类型部分<br />   * @since  0.5<br />   */<br />  public static String getTypePart(String fileName) {<br />    int point = fileName.lastIndexOf('.');<br />    int length = fileName.length();<br />    if (point == -1 || point == length - 1) {<br />      return "";<br />    }<br />    else {<br />      return fileName.substring(point + 1, length);<br />    }<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 得到文件的类型。<br />   * 实际上就是得到文件名中最后一个“.”后面的部分。<br />   * @param file 文件<br />   * @return 文件名中的类型部分<br />   * @since  0.5<br />   */<br />  public static String getFileType(File file) {<br />    return getTypePart(file.getName());<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 得到文件的名字部分。<br />   * 实际上就是路径中的最后一个路径分隔符后的部分。<br />   * @param fileName 文件名<br />   * @return 文件名中的名字部分<br />   * @since  0.5<br />   */<br />  public static String getNamePart(String fileName) {<br />    int point = getPathLsatIndex(fileName);<br />    int length = fileName.length();<br />    if (point == -1) {<br />      return fileName;<br />    }<br />    else if (point == length - 1) {<br />      int secondPoint = getPathLsatIndex(fileName, point - 1);<br />      if (secondPoint == -1) {<br />        if (length == 1) {<br />          return fileName;<br />        }<br />        else {<br />          return fileName.substring(0, point);<br />        }<br />      }<br />      else {<br />        return fileName.substring(secondPoint + 1, point);<br />      }<br />    }<br />    else {<br />      return fileName.substring(point + 1);<br />    }<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 得到文件名中的父路径部分。<br />   * 对两种路径分隔符都有效。<br />   * 不存在时返回""。<br />   * 如果文件名是以路径分隔符结尾的则不考虑该分隔符，例如"/path/"返回""。<br />   * @param fileName 文件名<br />   * @return 父路径，不存在或者已经是父目录时返回""<br />   * @since  0.5<br />   */<br />  public static String getPathPart(String fileName) {<br />    int point = getPathLsatIndex(fileName);<br />    int length = fileName.length();<br />    if (point == -1) {<br />      return "";<br />    }<br />    else if (point == length - 1) {<br />      int secondPoint = getPathLsatIndex(fileName, point - 1);<br />      if (secondPoint == -1) {<br />        return "";<br />      }<br />      else {<br />        return fileName.substring(0, secondPoint);<br />      }<br />    }<br />    else {<br />      return fileName.substring(0, point);<br />    }<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 得到路径分隔符在文件路径中首次出现的位置。<br />   * 对于DOS或者UNIX风格的分隔符都可以。<br />   * @param fileName 文件路径<br />   * @return 路径分隔符在路径中首次出现的位置，没有出现时返回-1。<br />   * @since  0.5<br />   */<br />  public static int getPathIndex(String fileName) {<br />    int point = fileName.indexOf('/');<br />    if (point == -1) {<br />      point = fileName.indexOf('\\');<br />    }<br />    return point;<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 得到路径分隔符在文件路径中指定位置后首次出现的位置。<br />   * 对于DOS或者UNIX风格的分隔符都可以。<br />   * @param fileName 文件路径<br />   * @param fromIndex 开始查找的位置<br />   * @return 路径分隔符在路径中指定位置后首次出现的位置，没有出现时返回-1。<br />   * @since  0.5<br />   */<br />  public static int getPathIndex(String fileName, int fromIndex) {<br />    int point = fileName.indexOf('/', fromIndex);<br />    if (point == -1) {<br />      point = fileName.indexOf('\\', fromIndex);<br />    }<br />    return point;<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 得到路径分隔符在文件路径中最后出现的位置。<br />   * 对于DOS或者UNIX风格的分隔符都可以。<br />   * @param fileName 文件路径<br />   * @return 路径分隔符在路径中最后出现的位置，没有出现时返回-1。<br />   * @since  0.5<br />   */<br />  public static int getPathLsatIndex(String fileName) {<br />    int point = fileName.lastIndexOf('/');<br />    if (point == -1) {<br />      point = fileName.lastIndexOf('\\');<br />    }<br />    return point;<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 得到路径分隔符在文件路径中指定位置前最后出现的位置。<br />   * 对于DOS或者UNIX风格的分隔符都可以。<br />   * @param fileName 文件路径<br />   * @param fromIndex 开始查找的位置<br />   * @return 路径分隔符在路径中指定位置前最后出现的位置，没有出现时返回-1。<br />   * @since  0.5<br />   */<br />  public static int getPathLsatIndex(String fileName, int fromIndex) {<br />    int point = fileName.lastIndexOf('/', fromIndex);<br />    if (point == -1) {<br />      point = fileName.lastIndexOf('\\', fromIndex);<br />    }<br />    return point;<br />  }</font>
				</p>
				<p>
						<font size="3">  /**<br />   * 将文件名中的类型部分去掉。<br />   * @param filename 文件名<br />   * @return 去掉类型部分的结果<br />   * @since  0.5<br />   */<br />  public static String trimType(String filename) {<br />    int index = filename.lastIndexOf(".");<br />    if (index != -1) {<br />      return filename.substring(0, index);<br />    }<br />    else {<br />      return filename;<br />    }<br />  }<br />  /**<br />   * 得到相对路径。<br />   * 文件名不是目录名的子节点时返回文件名。<br />   * @param pathName 目录名<br />   * @param fileName 文件名<br />   * @return 得到文件名相对于目录名的相对路径，目录下不存在该文件时返回文件名<br />   * @since  0.5<br />   */<br />  public static String getSubpath(String pathName,String fileName) {<br />    int index = fileName.indexOf(pathName);<br />    if (index != -1) {<br />      return fileName.substring(index + pathName.length() + 1);<br />    }<br />    else {<br />      return fileName;<br />    }<br />  }</font>
				</p>
				<p>
						<font size="3">}<br /> 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", “test");<br />prop.store(out, “–test–");<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", “abcccccc");<br />prop.store(out, “–test–");<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>
						</p>
				</div>
		</div>
<img src ="http://www.blogjava.net/zxfahjz/aggbug/41932.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zxfahjz/" target="_blank">zxf</a> 2006-04-19 16:11 <a href="http://www.blogjava.net/zxfahjz/archive/2006/04/19/41932.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>