﻿<?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-IT精英俱乐部-随笔分类-Java SE</title><link>http://www.blogjava.net/suplayer/category/32645.html</link><description>方便自己查阅，仅此而已！</description><language>zh-cn</language><lastBuildDate>Fri, 12 Jun 2009 14:53:44 GMT</lastBuildDate><pubDate>Fri, 12 Jun 2009 14:53:44 GMT</pubDate><ttl>60</ttl><item><title>Java线程：线程的同步 </title><link>http://www.blogjava.net/suplayer/archive/2009/04/09/264616.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Thu, 09 Apr 2009 04:37:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2009/04/09/264616.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/264616.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2009/04/09/264616.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/264616.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/264616.html</trackback:ping><description><![CDATA[<p>一、同步问题提出<br />
&nbsp;<br />
线程的同步是为了防止多个线程访问一个数据对象时，对数据造成的破坏。<br />
例如：两个线程ThreadA、ThreadB都操作同一个对象Foo对象，并修改Foo对象上的数据。<br />
&nbsp;<br />
public class Foo { <br />
&nbsp;&nbsp;&nbsp; private int x = 100; </p>
<p>&nbsp;&nbsp;&nbsp; public int getX() { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x; <br />
&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; public int fix(int y) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x = x - y; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x; <br />
&nbsp;&nbsp;&nbsp; } <br />
}<br />
&nbsp;<br />
public class MyRunnable implements Runnable { <br />
&nbsp;&nbsp;&nbsp; private Foo foo = new Foo(); </p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String[] args) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyRunnable r = new MyRunnable(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread ta = new Thread(r, "Thread-A"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread tb = new Thread(r, "Thread-B"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ta.start(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tb.start(); <br />
&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; public void run() { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 3; i++) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.fix(30); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.sleep(1); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (InterruptedException e) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(Thread.currentThread().getName() + " : 当前foo对象的x值= " + foo.getX()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; public int fix(int y) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return foo.fix(y); <br />
&nbsp;&nbsp;&nbsp; } <br />
}<br />
&nbsp;<br />
运行结果：<br />
Thread-A : 当前foo对象的x值= 40 <br />
Thread-B : 当前foo对象的x值= 40 <br />
Thread-B : 当前foo对象的x值= -20 <br />
Thread-A : 当前foo对象的x值= -50 <br />
Thread-A : 当前foo对象的x值= -80 <br />
Thread-B : 当前foo对象的x值= -80 </p>
<p>Process finished with exit code 0<br />
&nbsp;<br />
从结果发现，这样的输出值明显是不合理的。原因是两个线程不加控制的访问Foo对象并修改其数据所致。<br />
&nbsp;<br />
如果要保持结果的合理性，只需要达到一个目的，就是将对Foo的访问加以限制，每次只能有一个线程在访问。这样就能保证Foo对象中数据的合理性了。<br />
&nbsp;<br />
在具体的Java代码中需要完成一下两个操作：<br />
把竞争访问的资源类Foo变量x标识为private；<br />
同步哪些修改变量的代码，使用synchronized关键字同步方法或代码。<br />
&nbsp;<br />
二、同步和锁定<br />
&nbsp;<br />
1、锁的原理<br />
&nbsp;<br />
Java中每个对象都有一个内置锁<br />
&nbsp;<br />
当程序运行到非静态的synchronized同步方法上时，自动获得与正在执行代码类的当前实例（this实例）有关的锁。获得一个对象的锁也称为获取锁、锁定对象、在对象上锁定或在对象上同步。<br />
&nbsp;<br />
当程序运行到synchronized同步方法或代码块时才该对象锁才起作用。<br />
&nbsp;<br />
一个对象只有一个锁。所以，如果一个线程获得该锁，就没有其他线程可以获得锁，直到第一个线程释放（或返回）锁。这也意味着任何其他线程都不能进入该对象上的synchronized方法或代码块，直到该锁被释放。<br />
&nbsp;<br />
释放锁是指持锁线程退出了synchronized同步方法或代码块。<br />
&nbsp;<br />
关于锁和同步，有一下几个要点：<br />
1）、只能同步方法，而不能同步变量和类；<br />
2）、每个对象只有一个锁；当提到同步时，应该清楚在什么上同步？也就是说，在哪个对象上同步？<br />
3）、不必同步类中所有的方法，类可以同时拥有同步和非同步方法。<br />
4）、如果两个线程要执行一个类中的synchronized方法，并且两个线程使用相同的实例来调用方法，那么一次只能有一个线程能够执行方法，另一个需要等待，直到锁被释放。也就是说：如果一个线程在对象上获得一个锁，就没有任何其他线程可以进入（该对象的）类中的任何一个同步方法。<br />
5）、如果线程拥有同步和非同步方法，则非同步方法可以被多个线程自由访问而不受锁的限制。<br />
6）、线程睡眠时，它所持的任何锁都不会释放。 </p>
<p>7）、线程可以获得多个锁。比如，在一个对象的同步方法里面调用另外一个对象的同步方法，则获取了两个对象的同步锁。<br />
8）、同步损害并发性，应该尽可能缩小同步范围。同步不但可以同步整个方法，还可以同步方法中一部分代码块。<br />
9）、在使用同步代码块时候，应该指定在哪个对象上同步，也就是说要获取哪个对象的锁。例如：<br />
&nbsp;&nbsp;&nbsp; public int fix(int y) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (this) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x = x - y;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;<br />
当然，同步方法也可以改写为非同步方法，但功能完全一样的，例如：<br />
&nbsp;&nbsp;&nbsp; public synchronized int getX() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x++;<br />
&nbsp;&nbsp;&nbsp; }<br />
与<br />
&nbsp;&nbsp;&nbsp; public int getX() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (this) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
效果是完全一样的。<br />
&nbsp;<br />
三、静态方法同步<br />
&nbsp;<br />
要同步静态方法，需要一个用于整个类对象的锁，这个对象是就是这个类（XXX.class)。<br />
例如：<br />
public static synchronized int setName(String name){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Xxx.name = name;<br />
}<br />
等价于<br />
public static int setName(String name){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized(Xxx.class){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Xxx.name = name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>&nbsp;<br />
四、如果线程不能不能获得锁会怎么样<br />
&nbsp;<br />
如果线程试图进入同步方法，而其锁已经被占用，则线程在该对象上被阻塞。实质上，线程进入该对象的的一种池中，必须在哪里等待，直到其锁被释放，该线程再次变为可运行或运行为止。<br />
&nbsp;<br />
当考虑阻塞时，一定要注意哪个对象正被用于锁定：<br />
1、调用同一个对象中非静态同步方法的线程将彼此阻塞。如果是不同对象，则每个线程有自己的对象的锁，线程间彼此互不干预。<br />
&nbsp;<br />
2、调用同一个类中的静态同步方法的线程将彼此阻塞，它们都是锁定在相同的Class对象上。<br />
&nbsp;<br />
3、静态同步方法和非静态同步方法将永远不会彼此阻塞，因为静态方法锁定在Class对象上，非静态方法锁定在该类的对象上。<br />
&nbsp;<br />
4、对于同步代码块，要看清楚什么对象已经用于锁定（synchronized后面括号的内容）。在同一个对象上进行同步的线程将彼此阻塞，在不同对象上锁定的线程将永远不会彼此阻塞。<br />
&nbsp;<br />
五、何时需要同步<br />
&nbsp;<br />
在多个线程同时访问互斥（可交换）数据时，应该同步以保护数据，确保两个线程不会同时修改更改它。<br />
&nbsp;<br />
对于非静态字段中可更改的数据，通常使用非静态方法访问。<br />
对于静态字段中可更改的数据，通常使用静态方法访问。<br />
&nbsp;<br />
如果需要在非静态方法中使用静态字段，或者在静态字段中调用非静态方法，问题将变得非常复杂。已经超出SJCP考试范围了。<br />
&nbsp;<br />
六、线程安全类<br />
&nbsp;<br />
当一个类已经很好的同步以保护它的数据时，这个类就称为&#8220;线程安全的&#8221;。<br />
&nbsp;<br />
即使是线程安全类，也应该特别小心，因为操作的线程是间仍然不一定安全。<br />
&nbsp;<br />
举个形象的例子，比如一个集合是线程安全的，有两个线程在操作同一个集合对象，当第一个线程查询集合非空后，删除集合中所有元素的时候。第二个线程也来执行与第一个线程相同的操作，也许在第一个线程查询后，第二个线程也查询出集合非空，但是当第一个执行清除后，第二个再执行删除显然是不对的，因为此时集合已经为空了。<br />
看个代码：<br />
&nbsp;<br />
public class NameList { <br />
&nbsp;&nbsp;&nbsp; private List nameList = Collections.synchronizedList(new LinkedList()); </p>
<p>&nbsp;&nbsp;&nbsp; public void add(String name) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nameList.add(name); <br />
&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; public String removeFirst() { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (nameList.size() &gt; 0) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (String) nameList.remove(0); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; } <br />
}<br />
&nbsp;<br />
public class Test { <br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; final NameList nl = new NameList(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nl.add("aaa"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class NameDropper extends Thread{ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void run(){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String name = nl.removeFirst(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(name); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread t1 = new NameDropper(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread t2 = new NameDropper(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t1.start(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t2.start(); <br />
&nbsp;&nbsp;&nbsp; } <br />
}<br />
&nbsp;<br />
虽然集合对象<br />
&nbsp;&nbsp;&nbsp; private List nameList = Collections.synchronizedList(new LinkedList());<br />
是同步的，但是程序还不是线程安全的。<br />
出现这种事件的原因是，上例中一个线程操作列表过程中无法阻止另外一个线程对列表的其他操作。<br />
&nbsp;<br />
解决上面问题的办法是，在操作集合对象的NameList上面做一个同步。改写后的代码如下：<br />
public class NameList { <br />
&nbsp;&nbsp;&nbsp; private List nameList = Collections.synchronizedList(new LinkedList()); </p>
<p>&nbsp;&nbsp;&nbsp; public synchronized void add(String name) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nameList.add(name); <br />
&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; public synchronized String removeFirst() { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (nameList.size() &gt; 0) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (String) nameList.remove(0); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; } <br />
}<br />
&nbsp;<br />
这样，当一个线程访问其中一个同步方法时，其他线程只有等待。<br />
&nbsp;<br />
七、线程死锁<br />
&nbsp;<br />
死锁对Java程序来说，是很复杂的，也很难发现问题。当两个线程被阻塞，每个线程在等待另一个线程时就发生死锁。<br />
&nbsp;<br />
还是看一个比较直观的死锁例子：<br />
&nbsp;<br />
public class DeadlockRisk { <br />
&nbsp;&nbsp;&nbsp; private static class Resource { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int value; <br />
&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; private Resource resourceA = new Resource(); <br />
&nbsp;&nbsp;&nbsp; private Resource resourceB = new Resource(); </p>
<p>&nbsp;&nbsp;&nbsp; public int read() { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (resourceA) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (resourceB) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return resourceB.value + resourceA.value; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; public void write(int a, int b) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (resourceB) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (resourceA) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resourceA.value = a; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resourceB.value = b; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; } <br />
}<br />
&nbsp;<br />
假设read()方法由一个线程启动，write()方法由另外一个线程启动。读线程将拥有resourceA锁，写线程将拥有resourceB锁，两者都坚持等待的话就出现死锁。<br />
&nbsp;<br />
实际上，上面这个例子发生死锁的概率很小。因为在代码内的某个点，CPU必须从读线程切换到写线程，所以，死锁基本上不能发生。<br />
&nbsp;<br />
但是，无论代码中发生死锁的概率有多小，一旦发生死锁，程序就死掉。有一些设计方法能帮助避免死锁，包括始终按照预定义的顺序获取锁这一策略。已经超出SCJP的考试范围。<br />
&nbsp;<br />
八、线程同步小结<br />
&nbsp;<br />
1、线程同步的目的是为了保护多个线程反问一个资源时对资源的破坏。<br />
2、线程同步方法是通过锁来实现，每个对象都有切仅有一个锁，这个锁与一个特定的对象关联，线程一旦获取了对象锁，其他访问该对象的线程就无法再访问该对象的其他非同步方法。<br />
3、对于静态同步方法，锁是针对这个类的，锁对象是该类的Class对象。静态和非静态方法的锁互不干预。一个线程获得锁，当在一个同步方法中访问另外对象上的同步方法时，会获取这两个对象锁。<br />
4、对于同步，要时刻清醒在哪个对象上同步，这是关键。<br />
5、编写线程安全的类，需要时刻注意对多个线程竞争访问资源的逻辑和安全做出正确的判断，对&#8220;原子&#8221;操作做出分析，并保证原子操作期间别的线程无法访问竞争资源。<br />
6、当多个线程等待一个对象锁时，没有获取到锁的线程将发生阻塞。<br />
7、死锁是线程间相互等待锁锁造成的，在实际中发生的概率非常的小。真让你写个死锁程序，不一定好使，呵呵。但是，一旦程序发生死锁，程序将死掉。</p>
  <img src ="http://www.blogjava.net/suplayer/aggbug/264616.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2009-04-09 12:37 <a href="http://www.blogjava.net/suplayer/archive/2009/04/09/264616.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个搜索加载jar包的dos批处理程序</title><link>http://www.blogjava.net/suplayer/archive/2008/11/20/241614.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Thu, 20 Nov 2008 05:16:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/11/20/241614.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/241614.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/11/20/241614.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/241614.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/241614.html</trackback:ping><description><![CDATA[<p>@echo off<br />
setlocal enabledelayedexpansion&nbsp; //设置延迟环境变量扩充<br />
set JAVA=%JAVA_HOME%\bin\java //java命令<br />
set OPTS=-Xms512M -Xmx512M -Xss128k -XX:+AggressiveOpts -XX:+UseParallelGC -XX:NewSize=64M //jvm参数<br />
set LIBPATH=..\lib //**jar包所在的目录<br />
set CONFIG=..\etc //properties文件目录<br />
set ENGINE=main.jar //主函数类的包<br />
set CP=%CONFIG%;%ENGINE%; //classpath<br />
set MAIN=net.blogjava.Main //main class</p>
<p>&nbsp;&nbsp; //循环加载jar包<br />
for /f %%i in ('dir /b %LIBPATH%\*.jar^|sort') do (<br />
&nbsp;&nbsp; set CP=!CP!%LIBPATH%\%%i;<br />
)</p>
<p>echo ===============================================================================<br />
echo.<br />
echo&nbsp;&nbsp; Engine Startup Environment<br />
echo.<br />
echo&nbsp;&nbsp; JAVA: %JAVA%<br />
echo.<br />
echo&nbsp;&nbsp; CONFIG: %CONFIG%<br />
echo.<br />
echo&nbsp;&nbsp; JAVA_OPTS: %OPTS%<br />
echo.<br />
echo&nbsp;&nbsp; CLASSPATH: %CP%<br />
echo.<br />
echo ===============================================================================<br />
echo.</p>
<p>%JAVA% %OPTS% -cp %CP% %MAIN% //运行<br />
</p>
 <img src ="http://www.blogjava.net/suplayer/aggbug/241614.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-11-20 13:16 <a href="http://www.blogjava.net/suplayer/archive/2008/11/20/241614.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Properties 类读取配置文件</title><link>http://www.blogjava.net/suplayer/archive/2008/10/20/235368.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Sun, 19 Oct 2008 20:58:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/10/20/235368.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/235368.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/10/20/235368.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/235368.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/235368.html</trackback:ping><description><![CDATA[&nbsp;
<p><span style="font-family: 宋体">一．</span> .properties <span style="font-family: 宋体">文件的形式</span></p>
<p># <span style="font-family: 宋体">以下为服务器、数据库信息</span></p>
<p>dbPort = localhost </p>
<p>databaseName = mydb </p>
<p>dbUserName = root </p>
<p>dbPassword = root </p>
<p># <span style="font-family: 宋体">以下为数据库表信息</span></p>
<p>dbTable = mytable </p>
<p># <span style="font-family: 宋体">以下为服务器信息</span></p>
<p>ip = 192.168.0.9 </p>
<p><span style="font-family: 宋体">在上面的文件中我们假设该文件名为：</span> test.properties <span style="font-family: 宋体">文件。其中</span> # <span style="font-family: 宋体">开始的一行为注释信息；在等号&#8220;</span> = <span style="font-family: 宋体">&#8221;左边的我们称之为</span> key <span style="font-family: 宋体">；等号&#8220;</span> = <span style="font-family: 宋体">&#8221;右边的我们称之为</span> value <span style="font-family: 宋体">。（其实就是我们常说的键</span> - <span style="font-family: 宋体">值对）</span> key <span style="font-family: 宋体">应该是我们程序中的变量。而</span> value <span style="font-family: 宋体">是我们根据实际情况配置的。</span>&nbsp;</p>
<p><span style="font-family: 宋体">二．</span> JDK <span style="font-family: 宋体">中的</span> Properties <span style="font-family: 宋体">类</span> Properties <span style="font-family: 宋体">类存在于胞</span> Java.util <span style="font-family: 宋体">中，该类继承自</span> Hashtable <span style="font-family: 宋体">，它提供了几个主要的方法：</span></p>
<p>1<span style="font-family: 宋体">．</span> getProperty ( String&nbsp;key) <span style="font-family: 宋体">，</span>&nbsp;&nbsp; <span style="font-family: 宋体">用指定的键在此属性列表中搜索属性。也就是通过参数</span> key <span style="font-family: 宋体">，得到</span> key <span style="font-family: 宋体">所对应的</span> value<span style="font-family: 宋体">。</span></p>
<p>2<span style="font-family: 宋体">．</span> load ( InputStream&nbsp;inStream) <span style="font-family: 宋体">，从输入流中读取属性列表（键和元素对）。通过对指定的文件（比如说上面的</span> test.properties <span style="font-family: 宋体">文件）进行装载来获取该文件中的所有键</span> - <span style="font-family: 宋体">值对。以供</span> getProperty ( String&nbsp;key) <span style="font-family: 宋体">来搜索。</span></p>
<p>3<span style="font-family: 宋体">．</span> setProperty ( String&nbsp;key, String&nbsp;value) <span style="font-family: 宋体">，调用</span> Hashtable <span style="font-family: 宋体">的方法</span> put <span style="font-family: 宋体">。他通过调用基类的</span>put<span style="font-family: 宋体">方法来设置</span> <span style="font-family: 宋体">键</span> - <span style="font-family: 宋体">值对。</span>&nbsp;</p>
<p>4<span style="font-family: 宋体">．</span> store ( OutputStream&nbsp;out, String&nbsp;comments) <span style="font-family: 宋体">，</span>&nbsp;&nbsp; <span style="font-family: 宋体">以适合使用</span> load <span style="font-family: 宋体">方法加载到</span> Properties <span style="font-family: 宋体">表中的格式，将此</span> Properties <span style="font-family: 宋体">表中的属性列表（键和元素对）写入输出流。与</span> load <span style="font-family: 宋体">方法相反，该方法将键</span> - <span style="font-family: 宋体">值对写入到指定的文件中去。</span></p>
<p>5<span style="font-family: 宋体">．</span> clear () <span style="font-family: 宋体">，清除所有装载的</span> <span style="font-family: 宋体">键</span> - <span style="font-family: 宋体">值对。该方法在基类中提供。</span></p>
<p><span style="font-family: 宋体">有了以上几个方法我们就可以对</span> .properties <span style="font-family: 宋体">文件进行操作了！</span></p>
<p><span style="font-family: 宋体">三．代码实例</span></p>
<p>package configuration;</p>
<p>import java.io.FileInputStream;</p>
<p>import java.io.FileNotFoundException;</p>
<p>import java.io.FileOutputStream;</p>
<p>import java.io.IOException;</p>
<p>import java.util.Properties;</p>
<p>/** *//**</p>
<p>&nbsp;* <span style="font-family: 宋体">读取</span>properties<span style="font-family: 宋体">文件</span></p>
<p>&nbsp;* @author Qutr</p>
<p>&nbsp;*</p>
<p>&nbsp;*/</p>
<p>public class Configuration</p>
<p>...{</p>
<p>&nbsp;&nbsp;&nbsp; private Properties propertie;</p>
<p>&nbsp;&nbsp;&nbsp; private FileInputStream inputFile;</p>
<p>&nbsp;&nbsp;&nbsp; private FileOutputStream outputFile;</p>
<p>&nbsp;&nbsp;&nbsp; /** *//**</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; * <span style="font-family: 宋体">初始化</span>Configuration<span style="font-family: 宋体">类</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p>&nbsp;&nbsp;&nbsp; public Configuration()</p>
<p>&nbsp;&nbsp;&nbsp; ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; propertie = new Properties();</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /** *//**</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; * <span style="font-family: 宋体">初始化</span>Configuration<span style="font-family: 宋体">类</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; * @param filePath <span style="font-family: 宋体">要读取的配置文件的路径</span>+<span style="font-family: 宋体">名称</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p>&nbsp;&nbsp;&nbsp; public Configuration(String filePath)</p>
<p>&nbsp;&nbsp;&nbsp; ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; propertie = new Properties();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inputFile = new FileInputStream(filePath);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; propertie.load(inputFile);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inputFile.close();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (FileNotFoundException ex) ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("<span style="font-family: 宋体">读取属性文件</span>---&gt;<span style="font-family: 宋体">失败！</span>- <span style="font-family: 宋体">原因：文件路径错误或者文件不存在</span>");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException ex) ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("<span style="font-family: 宋体">装载文件</span>---&gt;<span style="font-family: 宋体">失败</span>!");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; }//end ReadConfigInfo(...)</p>
<p>&nbsp;&nbsp;&nbsp; /** *//**</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; * <span style="font-family: 宋体">重载函数，得到</span>key<span style="font-family: 宋体">的值</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; * @param key <span style="font-family: 宋体">取得其值的键</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; * @return key<span style="font-family: 宋体">的值</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p>&nbsp;&nbsp;&nbsp; public String getValue(String key)</p>
<p>&nbsp;&nbsp;&nbsp; ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(propertie.containsKey(key))...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String value = propertie.getProperty(key);//<span style="font-family: 宋体">得到某一属性的值</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return value;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "";</p>
<p>&nbsp;&nbsp;&nbsp; }//end getValue(...)</p>
<p>&nbsp;&nbsp;&nbsp; /** *//**</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; * <span style="font-family: 宋体">重载函数，得到</span>key<span style="font-family: 宋体">的值</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; * @param fileName properties<span style="font-family: 宋体">文件的路径</span>+<span style="font-family: 宋体">文件名</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; * @param key <span style="font-family: 宋体">取得其值的键</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; * @return key<span style="font-family: 宋体">的值</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p>&nbsp;&nbsp;&nbsp; public String getValue(String fileName, String key)</p>
<p>&nbsp;&nbsp;&nbsp; ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String value = "";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inputFile = new FileInputStream(fileName);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; propertie.load(inputFile);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inputFile.close();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(propertie.containsKey(key))...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value = propertie.getProperty(key);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return value;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return value;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (FileNotFoundException e) ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception ex) ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp; }//end getValue(...)</p>
<p>&nbsp;&nbsp;&nbsp; /** *//**</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; * <span style="font-family: 宋体">清除</span>properties<span style="font-family: 宋体">文件中所有的</span>key<span style="font-family: 宋体">和其值</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p>&nbsp;&nbsp;&nbsp; public void clear()</p>
<p>&nbsp;&nbsp;&nbsp; ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; propertie.clear();</p>
<p>&nbsp;&nbsp;&nbsp; }//end clear();</p>
<p>&nbsp;&nbsp;&nbsp; /** *//**</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; * <span style="font-family: 宋体">改变或添加一个</span>key<span style="font-family: 宋体">的值，当</span>key<span style="font-family: 宋体">存在于</span>properties<span style="font-family: 宋体">文件中时该</span>key<span style="font-family: 宋体">的值被</span>value<span style="font-family: 宋体">所代替，</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; * <span style="font-family: 宋体">当</span>key<span style="font-family: 宋体">不存在时，该</span>key<span style="font-family: 宋体">的值是</span>value</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; * @param key <span style="font-family: 宋体">要存入的键</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; * @param value <span style="font-family: 宋体">要存入的值</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p>&nbsp;&nbsp;&nbsp; public void setValue(String key, String value)</p>
<p>&nbsp;&nbsp;&nbsp; ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; propertie.setProperty(key, value);</p>
<p>&nbsp;&nbsp;&nbsp; }//end setValue(...)</p>
<p>&nbsp;&nbsp;&nbsp; /** *//**</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; * <span style="font-family: 宋体">将更改后的文件数据存入指定的文件中，该文件可以事先不存在。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; * @param fileName <span style="font-family: 宋体">文件路径</span>+<span style="font-family: 宋体">文件名称</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; * @param description <span style="font-family: 宋体">对该文件的描述</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p>&nbsp;&nbsp;&nbsp; public void saveFile(String fileName, String description)</p>
<p>&nbsp;&nbsp;&nbsp; ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outputFile = new FileOutputStream(fileName);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; propertie.store(outputFile, description);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outputFile.close();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (FileNotFoundException e) ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException ioe)...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ioe.printStackTrace();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; }//end saveFile(...)</p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String[] args)</p>
<p>&nbsp;&nbsp;&nbsp; ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Configuration rc = new Configuration("."config"test.properties");//<span style="font-family: 宋体">相对路径</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String ip = rc.getValue("ipp");//<span style="font-family: 宋体">以下读取</span>properties<span style="font-family: 宋体">文件的值</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String host = rc.getValue("host");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String tab = rc.getValue("tab");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("ip = " + ip + "ip-test leng = " + "ip-test".length());//<span style="font-family: 宋体">以下输出</span>properties<span style="font-family: 宋体">读出的值</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("ip's length = " + ip.length());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("host = " + host);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("tab = " + tab);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Configuration cf = new Configuration();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String ipp = cf.getValue("."config"test.properties", "ip");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("ipp = " + ipp);</p>
<p>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cf.clear();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cf.setValue("min", "999");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cf.setValue("max", "1000");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cf.saveFile("."config"save.perperties", "test");</p>
<p>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Configuration saveCf = new Configuration();</p>
<p>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveCf.setValue("min", "10");</p>
<p>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveCf.setValue("max", "1000");</p>
<p>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; saveCf.saveFile("."config"save.perperties");</p>
<p>&nbsp;&nbsp;&nbsp; }//end main()</p>
<p>}//end class ReadConfigInfo</p>
<p><span style="font-family: 宋体">四．小结</span> <span style="font-family: 宋体">通过上面的例子不难看出，在</span>Java<span style="font-family: 宋体">中操作配置文件是非常简单的。在一个需要用到大量配置信息的模块或系统里，我们有必要封装一个专门的类来共使用。通过最后的</span>main<span style="font-family: 宋体">函数调用，相信大家可以看出该类的用法。不足指出希望大家多多指点。</span></p>
<p>Java properties<span style="font-family: 宋体">文件的操作</span>&nbsp;</p>
<p>----------------------------------------------------</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; java<span style="font-family: 宋体">中的</span>properties<span style="font-family: 宋体">文件是一种配置文件，主要用于表达配置信息，文件类型为</span>*.properties<span style="font-family: 宋体">，格式为文本文件，文件的内容是格式是</span>"<span style="font-family: 宋体">键</span>=<span style="font-family: 宋体">值</span>"<span style="font-family: 宋体">的格式，在</span>properties<span style="font-family: 宋体">文件中，可以用</span>"#"<span style="font-family: 宋体">来作注释，</span>properties<span style="font-family: 宋体">文件在</span>Java<span style="font-family: 宋体">编程中用到的地方很多，操作很方便。下面是一个操作</span>java properties<span style="font-family: 宋体">文件的例子，给出了操作方法和</span>properties<span style="font-family: 宋体">文件。从中可以看到如何读取</span>properties<span style="font-family: 宋体">文件，并应用读取出来的值，是学习操作</span>properties<span style="font-family: 宋体">文件的好例子。</span></p>
<p><span style="font-family: 宋体">一、</span>properties<span style="font-family: 宋体">文件</span> </p>
<p>IcisReport.properties</p>
<p>------------------------------------------------------</p>
<p>#################################</p>
<p>#&nbsp;&nbsp; <span style="font-family: 宋体">工商报表应用</span>IcisReport<span style="font-family: 宋体">的配置文件</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #</p>
<p>#&nbsp;&nbsp; <span style="font-family: 宋体">作者：雷智民</span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #</p>
<p>#&nbsp;&nbsp; <span style="font-family: 宋体">日期：</span>2006<span style="font-family: 宋体">年</span>11<span style="font-family: 宋体">月</span>21<span style="font-family: 宋体">日</span>&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; #</p>
<p>#################################</p>
<p>#</p>
<p>#&nbsp;&nbsp; <span style="font-family: 宋体">说明</span>:<span style="font-family: 宋体">业务系统</span>TopIcis<span style="font-family: 宋体">和报表系统</span>IcisReport<span style="font-family: 宋体">是分离的</span></p>
<p>#&nbsp;&nbsp; <span style="font-family: 宋体">可分开部署到不同的服务器上，也可以部署到同一个服务</span></p>
<p>#&nbsp;&nbsp; <span style="font-family: 宋体">器上</span>;IcisReprot<span style="font-family: 宋体">作为独立的</span>web<span style="font-family: 宋体">应用程序可以使用任何</span></p>
<p>#&nbsp;&nbsp; <span style="font-family: 宋体">的</span>Servlet<span style="font-family: 宋体">容器或者</span>J2EE<span style="font-family: 宋体">服务器部署并单独运行，也可以</span></p>
<p>#&nbsp;&nbsp; <span style="font-family: 宋体">通过业务系统的接口调用作为业务系统的一个库来应用</span>.</p>
<p>#</p>
<p>#&nbsp;&nbsp; IcisReport<span style="font-family: 宋体">的</span>ip</p>
<p>IcisReport.server.ip=192.168.3.143</p>
<p>#&nbsp;&nbsp; IcisReport<span style="font-family: 宋体">的端口</span></p>
<p>IcisReport.server.port=8080</p>
<p>#&nbsp;&nbsp; IcisReport<span style="font-family: 宋体">的上下文路径</span></p>
<p>IcisReport.contextPath=/IcisReport </p>
<p>------------------------------------------------------&nbsp;</p>
<p><span style="font-family: 宋体">二、操作</span>properties<span style="font-family: 宋体">文件的</span>java<span style="font-family: 宋体">方法</span>&nbsp;</p>
<p><span style="font-family: 宋体">下面是一个操作</span>properties<span style="font-family: 宋体">文件的方法</span></p>
<p>&nbsp;&nbsp;&nbsp; /** *//**</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; * @return <span style="font-family: 宋体">获取</span>IcisReport<span style="font-family: 宋体">报表应用的</span>URL</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; */</p>
<p>&nbsp;&nbsp;&nbsp; private String getIcisReportURL() ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String icisReportURL = ""; // IcisReport<span style="font-family: 宋体">报表应用的</span>URL</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String icisReportServerIP = ""; // IcisReport<span style="font-family: 宋体">服务器的</span>IP</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String icisReportServerPort = ""; // IcisReport<span style="font-family: 宋体">服务器的服务端口</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String icisReportContextPath = ""; // IcisReport<span style="font-family: 宋体">应用的</span>ContextPath</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Properties prop = new Properties();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream in;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in = getClass().getResourceAsStream("/IcisReport.properties");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prop.load(in);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set keyValue = prop.keySet();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Iterator it = keyValue.iterator(); it.hasNext();) ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String key = (String) it.next();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (key.equals("IcisReport.server.ip")) ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; icisReportServerIP = (String) prop.get(key);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (key.equals("IcisReport.server.port")) ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; icisReportServerPort = (String) prop.get(key);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (key.equals("IcisReport.contextPath")) ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; icisReportContextPath = (String) prop.get(key);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;} catch (Exception e) ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.error("IO<span style="font-family: 宋体">读取出错，找不到</span>IcisReport.properties!");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (icisReportServerIP.trim().equals("")) ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .error("<span style="font-family: 宋体">请检查配置文件</span>IcisReport.properties<span style="font-family: 宋体">中的</span>IcisReport.server.ip<span style="font-family: 宋体">项的值是否正确</span>!");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (icisReportServerPort.trim().equals("")) ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .error("<span style="font-family: 宋体">请检查配置文件</span>IcisReport.properties<span style="font-family: 宋体">中的</span>IcisReport.server.port<span style="font-family: 宋体">项的值是否正确</span>!");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (icisReportServerPort.trim().equals("")) ...{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;log</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .error("<span style="font-family: 宋体">请检查配置文件</span>IcisReport.properties<span style="font-family: 宋体">中的</span>IcisReport.server.port<span style="font-family: 宋体">项的值是否正确</span>!");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; icisReportURL = "http://" + icisReportServerIP.trim() + ":"</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + icisReportServerPort.trim() + icisReportContextPath.trim();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info("<span style="font-family: 宋体">获取的</span>icisReportURL=" + icisReportURL);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return icisReportURL;</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p><span style="font-family: 宋体">总结：</span>java<span style="font-family: 宋体">的</span>properties<span style="font-family: 宋体">文件需要放到</span>classpath<span style="font-family: 宋体">下面，这样程序才能读取到，有关</span>classpath<span style="font-family: 宋体">实际上就是</span>java<span style="font-family: 宋体">类或者库的存放路径，在</span>java<span style="font-family: 宋体">工程中，</span>properties<span style="font-family: 宋体">放到</span>class<span style="font-family: 宋体">文件一块。在</span>web<span style="font-family: 宋体">应用中，最简单的方法是放到</span>web<span style="font-family: 宋体">应用的</span>WEB-INF"classes<span style="font-family: 宋体">目录下即可，也可以放在其他文件夹下面，这时候需要在设置</span>classpath<span style="font-family: 宋体">环境变量的时候，将这个文件夹路径加到</span>classpath<span style="font-family: 宋体">变量中，这样也也可以读取到。在此，你需要对</span>classpath<span style="font-family: 宋体">有个深刻理解，</span>classpath<span style="font-family: 宋体">绝非系统中刻意设定的那个系统环境变量，</span>WEB-INF"classes<span style="font-family: 宋体">其实也是，</span>java<span style="font-family: 宋体">工程的</span>class<span style="font-family: 宋体">文件目录也是。</span></p>
<p><span style="font-family: 宋体">该文章转载自网络大本营：</span>http://www.xrss.cn/Dev/JAVA/200761514149.Html</p>
 <img src ="http://www.blogjava.net/suplayer/aggbug/235368.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-10-20 04:58 <a href="http://www.blogjava.net/suplayer/archive/2008/10/20/235368.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> JDK5.0的11个主要新特征</title><link>http://www.blogjava.net/suplayer/archive/2008/10/17/235023.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Fri, 17 Oct 2008 10:40:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/10/17/235023.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/235023.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/10/17/235023.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/235023.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/235023.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/10/17/235023.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/235023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-10-17 18:40 <a href="http://www.blogjava.net/suplayer/archive/2008/10/17/235023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java跨平台的注意事项</title><link>http://www.blogjava.net/suplayer/archive/2008/10/17/235021.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Fri, 17 Oct 2008 10:39:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/10/17/235021.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/235021.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/10/17/235021.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/235021.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/235021.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/10/17/235021.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/235021.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-10-17 18:39 <a href="http://www.blogjava.net/suplayer/archive/2008/10/17/235021.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Java应用开发技巧：尽可能使用堆栈变量</title><link>http://www.blogjava.net/suplayer/archive/2008/10/17/235022.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Fri, 17 Oct 2008 10:39:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/10/17/235022.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/235022.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/10/17/235022.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/235022.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/235022.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/10/17/235022.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/235022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-10-17 18:39 <a href="http://www.blogjava.net/suplayer/archive/2008/10/17/235022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java多线程程序设计详细解析</title><link>http://www.blogjava.net/suplayer/archive/2008/10/17/235018.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Fri, 17 Oct 2008 10:36:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/10/17/235018.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/235018.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/10/17/235018.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/235018.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/235018.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/10/17/235018.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/235018.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-10-17 18:36 <a href="http://www.blogjava.net/suplayer/archive/2008/10/17/235018.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java源代码分析----jvm.dll装载过程</title><link>http://www.blogjava.net/suplayer/archive/2008/10/17/235017.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Fri, 17 Oct 2008 10:36:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/10/17/235017.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/235017.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/10/17/235017.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/235017.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/235017.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/10/17/235017.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/235017.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-10-17 18:36 <a href="http://www.blogjava.net/suplayer/archive/2008/10/17/235017.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JVM的垃圾回收机制详解和调优</title><link>http://www.blogjava.net/suplayer/archive/2008/10/17/235014.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Fri, 17 Oct 2008 10:33:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/10/17/235014.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/235014.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/10/17/235014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/235014.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/235014.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/10/17/235014.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/235014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-10-17 18:33 <a href="http://www.blogjava.net/suplayer/archive/2008/10/17/235014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读取Properties文件六种方法</title><link>http://www.blogjava.net/suplayer/archive/2008/10/17/235010.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Fri, 17 Oct 2008 10:30:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/10/17/235010.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/235010.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/10/17/235010.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/235010.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/235010.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/10/17/235010.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/235010.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-10-17 18:30 <a href="http://www.blogjava.net/suplayer/archive/2008/10/17/235010.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实现了两个超大数值(整数或浮点数都可以)的相加，也可以进行精度控制</title><link>http://www.blogjava.net/suplayer/archive/2008/10/17/234904.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Fri, 17 Oct 2008 06:35:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/10/17/234904.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/234904.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/10/17/234904.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/234904.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/234904.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/10/17/234904.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/234904.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-10-17 14:35 <a href="http://www.blogjava.net/suplayer/archive/2008/10/17/234904.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个读取properties的类</title><link>http://www.blogjava.net/suplayer/archive/2008/10/17/234903.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Fri, 17 Oct 2008 06:34:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/10/17/234903.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/234903.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/10/17/234903.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/234903.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/234903.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/10/17/234903.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/234903.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-10-17 14:34 <a href="http://www.blogjava.net/suplayer/archive/2008/10/17/234903.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA读取Properties（配置文件）工具类 </title><link>http://www.blogjava.net/suplayer/archive/2008/10/17/234897.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Fri, 17 Oct 2008 06:31:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/10/17/234897.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/234897.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/10/17/234897.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/234897.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/234897.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/10/17/234897.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/234897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-10-17 14:31 <a href="http://www.blogjava.net/suplayer/archive/2008/10/17/234897.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用java读取文本文件</title><link>http://www.blogjava.net/suplayer/archive/2008/10/16/234636.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Thu, 16 Oct 2008 01:58:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/10/16/234636.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/234636.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/10/16/234636.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/234636.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/234636.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/10/16/234636.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/234636.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-10-16 09:58 <a href="http://www.blogjava.net/suplayer/archive/2008/10/16/234636.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>内存管理工具类，支持简单的垃圾回收</title><link>http://www.blogjava.net/suplayer/archive/2008/10/16/234634.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Thu, 16 Oct 2008 01:57:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/10/16/234634.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/234634.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/10/16/234634.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/234634.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/234634.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/10/16/234634.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/234634.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-10-16 09:57 <a href="http://www.blogjava.net/suplayer/archive/2008/10/16/234634.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个简单的Cache工具类，支持多线程</title><link>http://www.blogjava.net/suplayer/archive/2008/10/16/234633.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Thu, 16 Oct 2008 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/10/16/234633.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/234633.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/10/16/234633.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/234633.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/234633.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/10/16/234633.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/234633.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-10-16 09:54 <a href="http://www.blogjava.net/suplayer/archive/2008/10/16/234633.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java做的比较完善的FTP连接上传下载文件(转)</title><link>http://www.blogjava.net/suplayer/archive/2008/10/16/234622.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Thu, 16 Oct 2008 01:32:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/10/16/234622.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/234622.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/10/16/234622.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/234622.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/234622.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/10/16/234622.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/234622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-10-16 09:32 <a href="http://www.blogjava.net/suplayer/archive/2008/10/16/234622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自动配置JAVA环境变量</title><link>http://www.blogjava.net/suplayer/archive/2008/10/16/234581.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Wed, 15 Oct 2008 18:52:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/10/16/234581.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/234581.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/10/16/234581.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/234581.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/234581.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/10/16/234581.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/234581.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-10-16 02:52 <a href="http://www.blogjava.net/suplayer/archive/2008/10/16/234581.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>bat执行java程序去掉dos窗口 </title><link>http://www.blogjava.net/suplayer/archive/2008/07/16/215270.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Wed, 16 Jul 2008 09:42:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/07/16/215270.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/215270.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/07/16/215270.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/215270.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/215270.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/07/16/215270.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/215270.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-07-16 17:42 <a href="http://www.blogjava.net/suplayer/archive/2008/07/16/215270.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下JNI调用 （转）</title><link>http://www.blogjava.net/suplayer/archive/2008/07/16/215135.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Wed, 16 Jul 2008 02:01:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/07/16/215135.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/215135.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/07/16/215135.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/215135.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/215135.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/07/16/215135.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/215135.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-07-16 10:01 <a href="http://www.blogjava.net/suplayer/archive/2008/07/16/215135.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DAO简介</title><link>http://www.blogjava.net/suplayer/archive/2008/07/15/214900.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Tue, 15 Jul 2008 02:39:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/07/15/214900.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/214900.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/07/15/214900.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/214900.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/214900.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/07/15/214900.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/214900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-07-15 10:39 <a href="http://www.blogjava.net/suplayer/archive/2008/07/15/214900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java集合</title><link>http://www.blogjava.net/suplayer/archive/2008/07/15/214899.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Tue, 15 Jul 2008 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/07/15/214899.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/214899.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/07/15/214899.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/214899.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/214899.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/07/15/214899.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/214899.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-07-15 10:38 <a href="http://www.blogjava.net/suplayer/archive/2008/07/15/214899.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse启动参数</title><link>http://www.blogjava.net/suplayer/archive/2008/07/15/214898.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Tue, 15 Jul 2008 02:37:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/07/15/214898.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/214898.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/07/15/214898.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/214898.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/214898.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/07/15/214898.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/214898.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-07-15 10:37 <a href="http://www.blogjava.net/suplayer/archive/2008/07/15/214898.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javadoc注释标签语法</title><link>http://www.blogjava.net/suplayer/archive/2008/07/15/214897.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Tue, 15 Jul 2008 02:34:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/07/15/214897.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/214897.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/07/15/214897.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/214897.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/214897.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/07/15/214897.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/214897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-07-15 10:34 <a href="http://www.blogjava.net/suplayer/archive/2008/07/15/214897.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Javadoc生成API文档</title><link>http://www.blogjava.net/suplayer/archive/2008/07/15/214895.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Tue, 15 Jul 2008 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/07/15/214895.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/214895.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/07/15/214895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/214895.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/214895.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/07/15/214895.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/214895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-07-15 10:30 <a href="http://www.blogjava.net/suplayer/archive/2008/07/15/214895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中Timer，TimerTask的使用（二）</title><link>http://www.blogjava.net/suplayer/archive/2008/07/07/212995.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Mon, 07 Jul 2008 04:03:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/07/07/212995.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/212995.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/07/07/212995.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/212995.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/212995.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/07/07/212995.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/212995.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-07-07 12:03 <a href="http://www.blogjava.net/suplayer/archive/2008/07/07/212995.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中Timer和TimerTask使用</title><link>http://www.blogjava.net/suplayer/archive/2008/07/07/212992.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Mon, 07 Jul 2008 03:45:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/07/07/212992.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/212992.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/07/07/212992.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/212992.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/212992.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/07/07/212992.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/212992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-07-07 11:45 <a href="http://www.blogjava.net/suplayer/archive/2008/07/07/212992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>详解Java多线程技术中所有方法</title><link>http://www.blogjava.net/suplayer/archive/2008/07/01/211924.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Tue, 01 Jul 2008 07:38:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/07/01/211924.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/211924.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/07/01/211924.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/211924.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/211924.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/07/01/211924.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/211924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-07-01 15:38 <a href="http://www.blogjava.net/suplayer/archive/2008/07/01/211924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编写安全的Java代码</title><link>http://www.blogjava.net/suplayer/archive/2008/07/01/211921.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Tue, 01 Jul 2008 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/07/01/211921.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/211921.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/07/01/211921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/211921.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/211921.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/07/01/211921.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/211921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-07-01 15:33 <a href="http://www.blogjava.net/suplayer/archive/2008/07/01/211921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java加密解密---自定义类加载器的应用</title><link>http://www.blogjava.net/suplayer/archive/2008/07/01/211919.html</link><dc:creator>suplayer</dc:creator><author>suplayer</author><pubDate>Tue, 01 Jul 2008 07:31:00 GMT</pubDate><guid>http://www.blogjava.net/suplayer/archive/2008/07/01/211919.html</guid><wfw:comment>http://www.blogjava.net/suplayer/comments/211919.html</wfw:comment><comments>http://www.blogjava.net/suplayer/archive/2008/07/01/211919.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/suplayer/comments/commentRss/211919.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/suplayer/services/trackbacks/211919.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/suplayer/archive/2008/07/01/211919.html'>阅读全文</a><img src ="http://www.blogjava.net/suplayer/aggbug/211919.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/suplayer/" target="_blank">suplayer</a> 2008-07-01 15:31 <a href="http://www.blogjava.net/suplayer/archive/2008/07/01/211919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>