??xml version="1.0" encoding="utf-8" standalone="yes"?>日本中文一区二区三区亚洲,久久亚洲美女精品国产精品,亚洲fuli在线观看http://m.tkk7.com/forgood/category/32176.html从这里出?/description>zh-cnSun, 18 Oct 2009 21:53:55 GMTSun, 18 Oct 2009 21:53:55 GMT60Queuehttp://m.tkk7.com/forgood/archive/2009/10/18/298761.htmlforgoodforgoodSun, 18 Oct 2009 10:29:00 GMThttp://m.tkk7.com/forgood/archive/2009/10/18/298761.htmlhttp://m.tkk7.com/forgood/comments/298761.htmlhttp://m.tkk7.com/forgood/archive/2009/10/18/298761.html#Feedback0http://m.tkk7.com/forgood/comments/commentRss/298761.htmlhttp://m.tkk7.com/forgood/services/trackbacks/298761.html   public static void main(String[] args){
   //public class Queue extends Collection
   Queue<Integer> queue=new LinkedList<Integer>();
   Random  rand = new Random(47);
   for(int i=0;i<10;i++){
    queue.offer(rand.nextInt(i+10));
   }
   System.out.println("1111"+queue.toString());
   printQ(queue);
   //public class LinkedList extends AbstractSequentialList implements List,Queue,Cloneable,Serializable
   Queue<Character> qc=new LinkedList<Character>();
   for(char c:"guoxzh".toCharArray()){
    qc.offer(c);
    System.out.println("qc=="+qc.toString());
   }
    printQ(qc);
  }
  
  public static void printQ(Queue queue){
   while(queue.peek()!=null){
    //peek和element都是在不U除的情况下q回对头Q但是peek在队列ؓI的情况下返回nullQelementҎ会抛出NoSuchElementException异常
    System.out.println(queue.remove());
    //remove和pollҎ都是在移除ƈq回对头Q但是poll在ؓI时q回nullQ而remove会抛出NoSucheElementException异常
    System.out.println("2222"+queue.toString());
   }
  }
}

forgood 2009-10-18 18:29 发表评论
]]>
byte数组和String之间的{?/title><link>http://m.tkk7.com/forgood/archive/2009/09/23/296155.html</link><dc:creator>forgood</dc:creator><author>forgood</author><pubDate>Wed, 23 Sep 2009 06:19:00 GMT</pubDate><guid>http://m.tkk7.com/forgood/archive/2009/09/23/296155.html</guid><wfw:comment>http://m.tkk7.com/forgood/comments/296155.html</wfw:comment><comments>http://m.tkk7.com/forgood/archive/2009/09/23/296155.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/forgood/comments/commentRss/296155.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/forgood/services/trackbacks/296155.html</trackback:ping><description><![CDATA[<p>JAVA里面关于byte数组和String之间的{换问?/p> <p><span style="color: red">把byte转化成stringQ必ȝq编?/span>?/p> <p>例如下面一个例?</p> <p>import java.io.UnsupportedEncodingException;</p> <p>public class test{<br />  public static void main(String g[]) {<br />   String s = "12345abcd";<br />   byte b[] = s.getBytes();<br />   String t = b.toString();</p> <p>  System.out.println(t);</p> <p> }<br /> }<br /> 输出字符串的l果和字W串s不一样了.</p> <p>l过以下方式转码可以正{换了:</p> <p>public class test{<br />  public static void main(String g[]) {<br />   String s = "12345abcd";<br />   byte b[] = s.getBytes();<br />   try {<br />    String t = new String(b);<br />    System.out.print(t);<br />   } catch (Exception e) {<br />    e.printStackTrace();<br />   }<br />  }<br /> }</p> <p>引用Q?br /> String   str   =   "String";  <br />           byte[]   byte1   =   str.getBytes();  <br />           String   str1   =   new   String(byte1);  <br />           byte[]   byte2   =   str1.getBytes();  <br />           String   str2   =   new   String(byte2);  <br />           System.out.println("str<<<"   +   str);  <br />           System.out.println("byte1<<<"   +   byte1);  <br />           System.out.println("str1<<<"   +   str1);  <br />           System.out.println("byte2<<<"   +   byte2);  <br />           System.out.println("str2<<<"   +   str2);  <br />   -------------------------------------  <br />   输出l果  <br />   str<<<String  <br />   byte1<<<[B@192d342  <br />   str1<<<String  <br />   byte2<<<[B@6b97fd  <br />   str2<<<String  <br />    <br />   惌教ؓ什么两个byte输出的不一样呢?  <br />  </p> <p>String   str   =   "String";  <br />           byte[]   byte1   =   str.getBytes();  <br />           String   str1   =   new   String(byte1);  <br />           byte[]   byte2   =   str1.getBytes();  <br />   ----------  <br />   注意byte1是str得到的byte数组Q而byte2是另一个字W串str1得到的数l?nbsp; <br />   他们本n也是两个对象  <br />    <br />   <span style="color: red">直接打印实际上调用的是toString()ҎQ而toString()的默认实现是打印对象cd+hashCode()  <br /> </span>  [B表示byte数组  @表示之后的是地址  后面跟着的是hashCodeQ其实就是其虚拟机地址  <br />    <br /> </p> <img src ="http://m.tkk7.com/forgood/aggbug/296155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/forgood/" target="_blank">forgood</a> 2009-09-23 14:19 <a href="http://m.tkk7.com/forgood/archive/2009/09/23/296155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jvm的内存模?/title><link>http://m.tkk7.com/forgood/archive/2009/09/18/jvm.html</link><dc:creator>forgood</dc:creator><author>forgood</author><pubDate>Fri, 18 Sep 2009 01:12:00 GMT</pubDate><guid>http://m.tkk7.com/forgood/archive/2009/09/18/jvm.html</guid><wfw:comment>http://m.tkk7.com/forgood/comments/295528.html</wfw:comment><comments>http://m.tkk7.com/forgood/archive/2009/09/18/jvm.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/forgood/comments/commentRss/295528.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/forgood/services/trackbacks/295528.html</trackback:ping><description><![CDATA[<div id="1116666" class="Section0" style="layout-grid: 15.6pt none"> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <span style="font-weight: bold; font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">从大的方面来Ԍ<font face="Arial">JVM</font><font face="宋体">的内存模型分Z大块Q?/font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"> </span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">怹区内存( </span><span style="font-size: 10pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">Permanent space</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">Q和堆内存(<font face="Arial">heap space</font><font face="宋体">Q?/font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"> </span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">栈内存(<font face="Arial">stack space</font><font face="宋体">Q一般都不归?/font><font face="Arial">JVM</font><font face="宋体">内存模型中,因ؓ栈内存属于线E别?/font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">每个U程都有个独立的栈内存空间?/span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"> </span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 10pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">Permanent space<font face="宋体">里存攑֊载的</font><font face="Arial">Class</font><font face="宋体">cȝ对象?/font><font face="Arial">class</font><font face="宋体">本nQ?/font><font face="Arial">method</font><font face="宋体">Q?/font><font face="Arial">field</font><font face="宋体">{等?/font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">heap space<font face="宋体">主要存放对象实例和数l?/font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">heap space<font face="宋体">?/font><font face="Arial">Old </font></span><span style="font-size: 10pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">Generation<font face="宋体">?/font><font face="Arial">NewGeneration</font><font face="宋体">l成Q?/font><font face="Arial">OldGeneration</font><font face="宋体">存放生命周期长久的实例对象,而新的对象实例一般放?/font><font face="Arial">NewGeneration</font><font face="宋体">?/font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">New </span><span style="font-size: 10pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">Generation<font face="宋体">q可以再分ؓ</font><font face="Arial">Eden</font><font face="宋体">?/font><font face="Arial">(</font><font face="宋体">圣经中的伊甸?/font><font face="Arial">)</font><font face="宋体">、和</font><font face="Arial">Survivor</font><font face="宋体">区,新的对象实例L首先攑֜</font><font face="Arial">Eden</font><font face="宋体">区,</font><font face="Arial">Survivor</font><font face="宋体">Z?/font><font face="Arial">Eden</font><font face="宋体">区和</font><font face="Arial">Old</font><font face="宋体">区的~冲Q可以向</font><font face="Arial">Old</font><font face="宋体">{UL动的对象实例?/font></span><span style="font-size: 10pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><br /> </span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"> </span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><br /> </span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">一般,我们常见?font face="Arial">OOM</font><font face="宋体">Q?/font><font face="Arial">out of memory</font><font face="宋体">Q内存溢出异常,是堆内存空间不以存放新对象实例时D?/font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"> </span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">怹区内存溢出相对少见,一般是׃需要加载v量的<font face="Arial">Class</font><font face="宋体">数据Q超q了非堆内存的容量导致。通常出现?/font><font face="Arial">Web</font><font face="宋体">应用刚刚启动Ӟ因此</font><font face="Arial">Web</font><font face="宋体">应用推荐使用预加载机Ӟ方便在部|时发现ƈ解决该问题?/font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"> </span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">栈内存也会溢出,但是更加见?/span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"> </span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-weight: bold; font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">堆内存优化:</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">调整<font face="Arial">JVM</font><font face="宋体">启动参数</font><font face="Arial">-Xms  -Xmx   -XX:newSize -XX:MaxNewSize</font><font face="宋体">Q如调整初始堆内存和最大对内存 </font><font face="Arial">-Xms256M -Xmx512M</font><font face="宋体">?nbsp;或者调整初?/font><font face="Arial">New </font></span><span style="font-size: 10pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">Generation<font face="宋体">的初始内存和最大内?/font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">-XX:newSize=128M -XX:MaxNewSize=128M<font face="宋体">?/font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"> </span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-weight: bold; font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">怹区内存优化:</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">调整<font face="Arial">PermSize</font><font face="宋体">参数   ?nbsp; </font><font face="Arial">-XX:PermSize=256</font></span><span style="font-size: 10.5pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">M</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">-XX:MaxPermSize=512M</span><span style="font-size: 10.5pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">?/span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"> </span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-weight: bold; font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">栈内存优化:</span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">调整每个U程的栈内存定w  ?nbsp; <font face="Arial">-Xss2048K</font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"> </span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"> </span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="padding-right: 0pt; margin-top: 0pt; padding-left: 0pt; background: rgb(255,255,255); margin-bottom: 0pt; padding-bottom: 0pt; padding-top: 0pt; text-align: left"><span style="font-size: 10.5pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">最l,一个运行中?font face="Arial">JVM</font><font face="宋体">所占的内存</font><font face="Arial">= </font><font face="宋体">堆内?nbsp; </font><font face="Arial">+  </font><font face="宋体">怹区内?nbsp; </font><font face="Arial">+  </font><font face="宋体">所有线E所占的栈内存d</font></span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"> </span><span style="font-size: 10pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'">?/span><span style="font-size: 10pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><br /> </span><span style="font-size: 9pt; background: rgb(255,255,255); color: rgb(0,0,0); font-family: 'Arial'; mso-spacerun: 'yes'"><o:p></o:p></span></p> <p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-spacerun: 'yes'"><o:p></o:p></span></p> </div> <!--endfragment--> <img src ="http://m.tkk7.com/forgood/aggbug/295528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/forgood/" target="_blank">forgood</a> 2009-09-18 09:12 <a href="http://m.tkk7.com/forgood/archive/2009/09/18/jvm.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>漂亮代码七法http://m.tkk7.com/forgood/archive/2009/01/18/251778.htmlforgoodforgoodSun, 18 Jan 2009 06:33:00 GMThttp://m.tkk7.com/forgood/archive/2009/01/18/251778.htmlhttp://m.tkk7.com/forgood/comments/251778.htmlhttp://m.tkk7.com/forgood/archive/2009/01/18/251778.html#Feedback0http://m.tkk7.com/forgood/comments/commentRss/251778.htmlhttp://m.tkk7.com/forgood/services/trackbacks/251778.html
首先我想说明我本文阐q的是纯_从学的角度来写出代码Q而非技术、逻辑{。以下ؓ写出漂亮代码的七U方法:



1Q?快l束 if语句



例如下面q个JavaScript语句Q看h很恐怖:



Java代码 复制代码
  1. 1 function findShape(flags, point, attribute, list) {   
  2.   
  3. 2    if(!findShapePoints(flags, point, attribute)) {   
  4.   
  5. 3        if(!doFindShapePoints(flags, point, attribute)) {   
  6.   
  7. 4            if(!findInShape(flags, point, attribute)) {   
  8.   
  9. 5                if(!findFromGuide(flags,point) {   
  10.   
  11. 6                    if(list.count() > 0 && flags == 1) {   
  12.   
  13. 7                          doSomething();   
  14.   
  15. 8                    }   
  16.   
  17. 9                }   
  18.   
  19. 10            }   
  20.   
  21. 11       }   
  22.   
  23. 12    }      
  24.   
  25. 13  }  


但如果这么写好看得多:
Java代码 复制代码
  1. 1 function findShape(flags, point, attribute, list) {   
  2.   
  3. 2    if(findShapePoints(flags, point, attribute)) {   
  4.   
  5. 3        return;   
  6.   
  7. 4    }   
  8.   
  9. 5    
  10.   
  11. 6    if(doFindShapePoints(flags, point, attribute)) {   
  12.   
  13. 7        return;   
  14.   
  15. 8    }   
  16.   
  17. 9    
  18.   
  19. 10    if(findInShape(flags, point, attribute)) {    
  20.   
  21. 11        return;   
  22.   
  23. 12    }   
  24.   
  25. 13    
  26.   
  27. 14    if(findFromGuide(flags,point) {   
  28.   
  29. 15        return;   
  30.   
  31. 16    }   
  32.   
  33. 17    
  34.   
  35. 18    if (!(list.count() > 0 && flags == 1)) {   
  36.   
  37. 19        return;   
  38.   
  39. 20    }   
  40.   
  41. 21    
  42.   
  43. 22    doSomething();   
  44.   
  45. 23    
  46.   
  47. 24 }  



你可能会很不喜欢W二U的表述方式Q但反映Zq速返回if值的思想Q也可以理解为:避免不必要的else陈述?



2Q?如果只是单的布尔q算Q逻辑q算Q,不要使用if语句



例如Q?
Java代码 复制代码
  1. 1 function isStringEmpty(str){   
  2.   
  3. 2    if(str === "") {    
  4.   
  5. 3        return true;   
  6.   
  7. 4    }   
  8.   
  9. 5    else {   
  10.   
  11. 6        return false;   
  12.   
  13. 7    }   
  14.   
  15. 8 }  


可以写ؓQ?
Java代码 复制代码
  1. 1 function isStringEmpty(str){   
  2.   
  3. 2    return (str === "");   
  4.   
  5. 3 }  

3Q?使用I白Q这是免费的

例如Q?

1
Java代码 复制代码
  1.  function getSomeAngle() {   
  2.   
  3. 2    // Some code here then   
  4.   
  5. 3    radAngle1 = Math.atan(slope(center, point1));   
  6.   
  7. 4    radAngle2 = Math.atan(slope(center, point2));   
  8.   
  9. 5    firstAngle = getStartAngle(radAngle1, point1, center);   
  10.   
  11. 6    secondAngle = getStartAngle(radAngle2, point2, center);   
  12.   
  13. 7    radAngle1 = degreesToRadians(firstAngle);   
  14.   
  15. 8    radAngle2 = degreesToRadians(secondAngle);   
  16.   
  17. 9    baseRadius = distance(point, center);   
  18.   
  19. 10    radius = baseRadius + (lines * y);   
  20.   
  21. 11    p1["x"] = roundValue(radius * Math.cos(radAngle1) + center["x"]);   
  22.   
  23. 12    p1["y"] = roundValue(radius * Math.sin(radAngle1) + center["y"]);   
  24.   
  25. 13    pt2["x"] = roundValue(radius * Math.cos(radAngle2) + center["y"]);   
  26.   
  27. 14    pt2["y"] = roundValue(radius * Math.sin(radAngle2) + center["y");   
  28.   
  29. 15    // Now some more code   
  30.   
  31. 16 }  


很多开发者不愿意使用I白Q就好像q要收费一栗我在此qL地添加空白,_鲁地打断代码的q诏性。在实际~写代码的过E中Q会很容易地发现在什么地方加入空白,q不但美观而且让读者易懂,如下Q?

Java代码 复制代码
  1. 1 function getSomeAngle() {   
  2.   
  3. 2    // Some code here then   
  4.   
  5. 3    radAngle1 = Math.atan(slope(center, point1));   
  6.   
  7. 4    radAngle2 = Math.atan(slope(center, point2));   
  8.   
  9. 5    
  10.   
  11. 6    firstAngle = getStartAngle(radAngle1, point1, center);   
  12.   
  13. 7    secondAngle = getStartAngle(radAngle2, point2, center);   
  14.   
  15. 8    
  16.   
  17. 9    radAngle1 = degreesToRadians(firstAngle);   
  18.   
  19. 10    radAngle2 = degreesToRadians(secondAngle);   
  20.   
  21. 11    
  22.   
  23. 12    baseRadius = distance(point, center);   
  24.   
  25. 13    radius = baseRadius + (lines * y);   
  26.   
  27. 14    
  28.   
  29. 15    p1["x"] = roundValue(radius * Math.cos(radAngle1) + center["x"]);   
  30.   
  31. 16    p1["y"] = roundValue(radius * Math.sin(radAngle1) + center["y"]);   
  32.   
  33. 17    
  34.   
  35. 18    pt2["x"] = roundValue(radius * Math.cos(radAngle2) + center["y"]);   
  36.   
  37. 19    pt2["y"] = roundValue(radius * Math.sin(radAngle2) + center["y");   
  38.   
  39. 20    // Now some more code   
  40.   
  41. 21 }   
  42.   
  43.   
  44.   
  45. 4Q?nbsp;不要使用无谓的注?  
  46.   
  47. 无谓的注释让,q实在很讨厌。不要标出很明显的注释。在以下的例子中Q每个h都知道代码表辄?#8220;students id”Q因而没必要标出?  
  48.   
  49. 1 function existsStudent(id, list) {   
  50.   
  51. 2    for(i = 0; i < list.length; i++) {   
  52.   
  53. 3       student = list[i];   
  54.   
  55. 4    
  56.   
  57. 5       // Get the student's id   
  58.   
  59. 6       thisId = student.getId();   
  60.   
  61. 7    
  62.   
  63. 8       if(thisId === id) {   
  64.   
  65. 9           return true;   
  66.   
  67. 10       }   
  68.   
  69. 11    }   
  70.   
  71. 12    return false;      
  72.   
  73. 13 }  



5Q?不要在源文g中留下已l删除的代码Q哪怕你标注?

如果你用了版本控制Q那么你可以轻村֜扑֛前一个版本的代码。如果别人大费周折地M你的代码,却发现是要删除的代码Q这实在太恨Z?


Java代码 复制代码
  1. //function thisReallyHandyFunction() {   
  2.   
  3. //      someMagic();   
  4.   
  5. //      someMoreMagic();   
  6.   
  7. //      magicNumber = evenMoreMagic();   
  8.   
  9. //      return magicNumber;   
  10.   
  11. //}  


6Q不要有太长的代?



看太长的代码实在太费Ԍ其是代码本w的功能又很。如下:


Java代码 复制代码
  1. 1 public static EnumMap<Category, IntPair> getGroupCategoryDistribution(EnumMap<Category, Integer> sizes, int groups) {   
  2.   
  3. 2        EnumMap<Category, IntPair> categoryGroupCounts = new EnumMap<Category,IntPair>(Category.class);   
  4.   
  5. 3    
  6.   
  7. 4        for(Category cat : Category.values()) {   
  8.   
  9. 5            categoryGroupCounts.put(cat, getCategoryDistribution(sizes.get(cat), groups));   
  10.   
  11. 6        }  


#



我ƈ不是说非要坚?0个字W以内,但是一个比较理想的长度是控制在120个字W内。如果你把代码发布在互联|上Q用戯h很困难?

7Q不要在一个功能(或者函数内Q有太多代码?

我的一个老同事曾l说Visual C++很臭Q因为它不允怽在一个函数内拥有过10Q?00行代码。我C清代码行数的上限Q不知道他说的是否正,但我很不赞成他的观点。如果一个函数超q了50行,看v来有多费劲你知道么,q有没完没了的if循环Q而且你还的滚动鼠标前后对照这D代码。对我而言Q超q?5行的代码理解h很困难了。我的徏议是过q个数字把一个函C码分割成两个?

forgood 2009-01-18 14:33 发表评论
]]>
反射机制补充http://m.tkk7.com/forgood/archive/2009/01/11/250870.htmlforgoodforgoodSun, 11 Jan 2009 09:28:00 GMThttp://m.tkk7.com/forgood/archive/2009/01/11/250870.htmlhttp://m.tkk7.com/forgood/comments/250870.htmlhttp://m.tkk7.com/forgood/archive/2009/01/11/250870.html#Feedback1http://m.tkk7.com/forgood/comments/commentRss/250870.htmlhttp://m.tkk7.com/forgood/services/trackbacks/250870.html
本篇文章为在工作中用JAVA反射的经验ȝQ也可以说是一些小技巧,以后学会新的技巧,会不断更新?

        在开始之前,我先定义一个测试类StudentQ代码如下:

  1. package chb.test.reflect;   
  2.   
  3. public class Student {   
  4.     private int age;   
  5.     private String name;   
  6.     public int getAge() {   
  7.         return age;   
  8.      }   
  9.     public void setAge(int age) {   
  10.         this.age = age;   
  11.      }   
  12.     public String getName() {   
  13.         return name;   
  14.      }   
  15.     public void setName(String name) {   
  16.         this.name = name;   
  17.      }   
  18.        
  19.     public static void hi(int age,String name){   
  20.          System.out.println("大家好,我叫"+name+"Q今q?+age+"?);   
  21.      }   
  22. }<PRE></PRE>  

一、JAVA反射的常规用步?/strong>

    反射调用一般分?个步骤:

  • 得到要调用类的class
  • 得到要调用的cM的方?Method)
  • Ҏ调用(invoke)

     代码CZQ?/p>

  1. Class cls = Class.forName("chb.test.reflect.Student");   
  2. Method m = cls.getDeclaredMethod("hi",new Class[]{int.class,String.class});   
  3. m.invoke(cls.newInstance(),20,"chb");<PRE></PRE>  

二、方法调用中的参数类?/strong>

        在方法调用中Q参数类型必L,q里需要注意的是不能用包装类替换基本cdQ比如不能用Integer.class代替int.class?/p>

       如我要调用Student的setAgeҎQ下面的调用是正的Q?/p>

  1. Class cls = Class.forName("chb.test.reflect.Student");   
  2. Method setMethod = cls.getDeclaredMethod("setAge",int.class);   
  3. setMethod.invoke(cls.newInstance(), 15);<PRE></PRE>  

 

       而如果我们用Integer.class替代int.class׃出错Q如Q?/p>

  1. Class cls = Class.forName("chb.test.reflect.Student");   
  2. Method setMethod = cls.getDeclaredMethod("setAge",Integer.class);   
  3. setMethod.invoke(cls.newInstance(), 15);<PRE></PRE>  

 

       jvm会报出如下异常:

  1. java.lang.NoSuchMethodException: chb.test.reflect.Student.setAge(java.lang.Integer)   
  2.      at java.lang.Class.getDeclaredMethod(Unknown Source)   
  3.      at chb.test.reflect.TestClass.testReflect(TestClass.java:23)<PRE></PRE>  

 

三、staticҎ的反调?/strong>

 

       staticҎ调用Ӟ不必得到对象CZQ如下:

  1. Class cls = Class.forName("chb.test.reflect.Student");   
  2. Method staticMethod = cls.getDeclaredMethod("hi",int.class,String.class);   
  3. staticMethod.invoke(cls,20,"chb");//q里不需要newInstance   
  4. //staticMethod.invoke(cls.newInstance(),20,"chb");<PRE></PRE>  

四、private的成员变量赋?/strong>

    如果直接通过反射l类的private成员变量赋|是不允许的,q时我们可以通过setAccessibleҎ解决。代码示例:

  1. Class cls = Class.forName("chb.test.reflect.Student");   
  2. Object student = cls.newInstance();//得到一个实?  
  3. Field field = cls.getDeclaredField("age");   
  4. field.set(student, 10);   
  5. System.out.println(field.get(student));<PRE></PRE>  

 

     q行如上代码Q系l会报出如下异常Q?/p>

  1. java.lang.IllegalAccessException: Class chb.test.reflect.TestClass can not access a member of class chb.test.reflect.Student with modifiers "private"   
  2.      at sun.reflect.Reflection.ensureMemberAccess(Unknown Source)   
  3.      at java.lang.reflect.Field.doSecurityCheck(Unknown Source)   
  4.      at java.lang.reflect.Field.getFieldAccessor(Unknown Source)   
  5.      at java.lang.reflect.Field.set(Unknown Source)   
  6.      at chb.test.reflect.TestClass.testReflect(TestClass.java:20)<PRE></PRE>  

    解决ҎQ?/p>

  1. Class cls = Class.forName("chb.test.reflect.Student");   
  2. Object student = cls.newInstance();   
  3. Field field = cls.getDeclaredField("age");   
  4. field.setAccessible(true);//讄允许讉K   
  5. field.set(student, 10);   
  6. System.out.println(field.get(student));<PRE></PRE>  

    其实Q在某些场合?cM有get,setҎ)Q可以先反射调用setҎQ再反射调用getҎ辑ֈ如上效果Q代码示例:

  1. Class cls = Class.forName("chb.test.reflect.Student");   
  2. Object student = cls.newInstance();   
  3.   
  4. Method setMethod = cls.getDeclaredMethod("setAge",Integer.class);   
  5. setMethod.invoke(student, 15);//调用setҎ   
  6.                
  7. Method getMethod = cls.getDeclaredMethod("getAge");   
  8. System.out.println(getMethod.invoke(student));//再调用getҎ<PRE></PRE>


forgood 2009-01-11 17:28 发表评论
]]>
java中的反射机制http://m.tkk7.com/forgood/archive/2009/01/11/250869.htmlforgoodforgoodSun, 11 Jan 2009 09:27:00 GMThttp://m.tkk7.com/forgood/archive/2009/01/11/250869.htmlhttp://m.tkk7.com/forgood/comments/250869.htmlhttp://m.tkk7.com/forgood/archive/2009/01/11/250869.html#Feedback0http://m.tkk7.com/forgood/comments/commentRss/250869.htmlhttp://m.tkk7.com/forgood/services/trackbacks/250869.html     1. 一个简单的例子
    考虑下面q个单的例子Q让我们看看 reflection 是如何工作的?br />     import java.lang.reflect.*;
    public class DumpMethods {
        public static void main(String args[]) {
            try {
                Class c = Class.forName(args[0]);
                Method m[] = c.getDeclaredMethods();
                for (int i = 0; i < m.length; i++)
                    System.out.println(m[i].toString());
            } catch (Throwable e) {
                System.err.println(e);
            }
        }
    }
    按如下语句执行:
    java DumpMethods java.util.Stack
    它的l果输出为:
    public java.lang.Object java.util.Stack.push(java.lang.Object)
    public synchronized java.lang.Object java.util.Stack.pop()
    public synchronized java.lang.Object java.util.Stack.peek()
    public boolean java.util.Stack.empty()
    public synchronized int java.util.Stack.search(java.lang.Object)
    q样列Zjava.util.Stack cȝ各方法名以及它们的限制符和返回类型?br />     q个E序使用 Class.forName 载入指定的类Q然后调?getDeclaredMethods 来获取这个类中定义了的方法列表。java.lang.reflect.Methods 是用来描q某个类中单个方法的一个类。还有就是getDeclaredMethod(para1,para2)来获取这个类中的具体某一个方法,其中para1是一个StringcdQ具体代表的是方法名Qpara2是个一个Classcd的数l,其中定义个方法的具体参数cd?br />     例如Q?
  1. Class cls = Class.forName("chb.test.reflect.Student");   
  2. Method m = cls.getDeclaredMethod("Ҏ?,new Class[]{int.class,String.class});   
  3. m.invoke(cls.newInstance(),20,"chb");
    ȝQ?br />             //使用反射c调用某个类中的Ҏ
               Class c = Class.forName("com.inspur.reflect.MethodTest");
               Method n = c.getDeclaredMethod("show", new Class[]{String.class,int.class});
               n.invoke(c.newInstance(), "guoxzh",20);
   a.使用Class.forName("cd")来获取类
   b.其次使用getDeclaredMethods()Ҏ获取该类所有的ҎQ也可以使用getDeclaredMethod("Ҏ?,new Class[]{int.class,String.class})Ҏc获取具体的某一个方?br />    c.接着可以使用invoke(c.newInstance,param....)来调用具体的Ҏ?br />

    2.详细介绍开始?Reflection
    用于 reflection 的类Q如 MethodQ可以在 java.lang.relfect 包中扑ֈ。用这些类的时候必要遵@三个步骤Q第一步是获得你想操作的类?java.lang.Class 对象。在q行中的 Java E序中,?java.lang.Class cL描述cd接口{?br />     下面是获得一?Class 对象的方法之一Q?br />     Class c = Class.forName("java.lang.String");
    q条语句得到一?String cȝcd象。还有另一U方法,如下面的语句Q?br />     Class c = int.class;
    或?br />     Class c = Integer.TYPE;
    它们可获得基本类型的cM息。其中后一U方法中讉K的是基本cd的封装类 (?Integer) 中预先定义好?TYPE 字段?br />     W二步是调用诸如 getDeclaredMethods 的方法,以取得该cM定义的所有方法的列表?br />     一旦取得这个信息,可以进行第三步了——?reflection API 来操作这些信息,如下面这D代码:
    Class c = Class.forName("java.lang.String");
    Method m[] = c.getDeclaredMethods();
    System.out.println(m[0].toString());
    它将以文本方式打印出 String 中定义的W一个方法的原型?br />     在下面的例子中,q三个步骤将Z?reflection 处理Ҏ应用E序提供例证?br />     模拟 instanceof 操作W?br />     得到cM息之后,通常下一个步骤就是解军_?Class 对象的一些基本的问题。例如,Class.isInstance Ҏ可以用于模拟 instanceof 操作W:
    class A {
    }
    public class instance1 {
        public static void main(String args[]) {
            try {
                Class cls = Class.forName("A");
                boolean b1 = cls.isInstance(new Integer(37));   //判断Integer(37)该对象是否是Acȝ对象
                System.out.println(b1);
                boolean b2 = cls.isInstance(new A());
                System.out.println(b2);
            } catch (Throwable e) {
                System.err.println(e);
            }
        }
    }
    在这个例子中创徏了一?A cȝ Class 对象Q然后检查一些对象是否是 A 的实例。Integer(37) 不是Q但 new A() 是?br />

    3.扑ևcȝҎ
    扑և一个类中定义了些什么方法,q是一个非常有价g非常基础?reflection 用法。下面的代码实Cq一用法Q?br />

package com.inspur.reflect;

import java.lang.reflect.Method;


public class Methodtest1 {
 
 
 private int abc(Object p,int x) throws NullPointerException{
  if(p==null)throw new NullPointerException();
  return x;
 }

 public static void main(String[] args) {
  
  try{
   Class cls = Class.forName("com.inspur.reflect.Methodtest1");
   Method methodlist[]= cls.getDeclaredMethods();
   for(int i = 0;i<methodlist.length;i++){
    Method m = methodlist[i];
    System.out.println("name=="+m.getName());//得到Ҏ的名U?br />     System.out.println("decl class=="+m.getDeclaringClass());//得到定义的类?br />     Class prev[] = m.getParameterTypes();   //取mҎ中的所有参?br />     //遍历所有的参数
    for(int j = 0; j<prev.length;j++){
     System.out.println("param["+j+"]=="+prev[j]);
    }
    Class exec[] = m.getExceptionTypes(); //得到所有的异常
    //遍历所有的异常
    for(int k=0;k<exec.length;k++){
     System.out.println("execption["+k+"]=="+exec[k]);
    }
   
    Class ret = m.getReturnType(); //得到每个Ҏ的返回?br />     System.out.println("return leixing=="+ret.toString()); 
   }
  }catch(Throwable e){
   System.err.println(e.getMessage());
  }
 }

}

    q个E序首先取得 method1 cȝ描述Q然后调?getDeclaredMethods 来获取一pd?Method 对象Q它们分别描qC定义在类中的每一个方法,包括 public Ҏ、protected Ҏ、package Ҏ?private Ҏ{?span style="color: #ff0000">如果你在E序中?getMethods 来代?getDeclaredMethodsQ你q能获得l承来的各个Ҏ的信息。同时你也可以用Modifier.toString(m.getModifiers())来获取方法的限制属性?br />     取得?Method 对象列表之后Q要昄q些Ҏ的参数类型、异常类型和q回值类型等׃难了。这些类型是基本cdq是cȝ型,都可以由描述cȝ对象按顺序给出?br />     输出的结果如下:
   name==main
decl class==class com.inspur.reflect.Methodtest1
param[0]==class [Ljava.lang.String;
return leixing==void
name==abc
decl class==class com.inspur.reflect.Methodtest1
param[0]==class java.lang.Object
param[1]==int
execption[0]==class java.lang.NullPointerException
return leixing==int    4.获取构造器信息
    获取cL造器的用法与上述获取Ҏ的用法类|如:
    import java.lang.reflect.*;
    public class constructor1 {
        public constructor1() {
        }
        protected constructor1(int i, double d) {
        }
        public static void main(String args[]) {
            try {
                Class cls = Class.forName("constructor1");
                Constructor ctorlist[] = cls.getDeclaredConstructors();
                for (int i = 0; i < ctorlist.length; i++) {
                    Constructor ct = ctorlist[i];
                    System.out.println("name = " + ct.getName());
                    System.out.println("decl class = " + ct.getDeclaringClass());
                    Class pvec[] = ct.getParameterTypes();
                    for (int j = 0; j < pvec.length; j++)
                        System.out.println("param #" + j + " " + pvec[j]);
                    Class evec[] = ct.getExceptionTypes();
                    for (int j = 0; j < evec.length; j++)
                        System.out.println("exc #" + j + " " + evec[j]);
                    System.out.println("-----");
                }
            } catch (Throwable e) {
                System.err.println(e);
            }
        }
    }
    q个例子中没能获得返回类型的相关信息Q那是因为构造器没有q回cd?br /> q个E序q行的结果是Q?br />     name = constructor1
    decl class = class constructor1
    -----
    name = constructor1
    decl class = class constructor1
    param #0 int
    param #1 double
    -----
    5.获取cȝ字段(?
    扑և一个类中定义了哪些数据字段也是可能的,下面的代码就在干q个事情Q?
    import java.lang.reflect.*;
    public class field1 {
        private double d;
        public static final int i = 37;
        String s = "testing";
        public static void main(String args[]) {
            try {
                Class cls = Class.forName("field1");
                Field fieldlist[] = cls.getDeclaredFields();
                for (int i = 0; i < fieldlist.length; i++) {
                    Field fld = fieldlist[i];
                    System.out.println("name = " + fld.getName());
                    System.out.println("decl class = " + fld.getDeclaringClass());
                    System.out.println("type = " + fld.getType());
                    int mod = fld.getModifiers();
                    System.out.println("modifiers = " + Modifier.toString(mod));
                    System.out.println("-----");
                }
            } catch (Throwable e) {
                System.err.println(e);
            }
        }
    }
    q个例子和前面那个例子非常相伹{例中用了一个新东西 ModifierQ它也是一?reflection c,用来描述字段成员的修饰语Q如“private int”。这些修饰语自n由整数描qͼ而且使用 Modifier.toString 来返回以“官方”序排列的字W串描述 (?#8220;static”?#8220;final”之前)。这个程序的输出是:
    name = d
    decl class = class field1
    type = double
    modifiers = private
    -----
    name = i
    decl class = class field1
    type = int
    modifiers = public static final
    -----
    name = s
    decl class = class field1
    type = class java.lang.String
    modifiers =
    -----
    和获取方法的情况一下,获取字段的时候也可以只取得在当前cMx了的字段信息 (getDeclaredFields)Q或者也可以取得父类中定义的字段 (getFields) ?br />     6.ҎҎ的名U来执行Ҏ
    文本到这里,所丄例子无一例外都与如何获取cȝ信息有关。我们也可以?reflection 来做一些其它的事情Q比如执行一个指定了名称的方法。下面的CZ演示了这一操作Q?br />     import java.lang.reflect.*;
    public class method2 {
        public int add(int a, int b) {
            return a + b;
        }
        public static void main(String args[]) {
            try {
                Class cls = Class.forName("method2");
                Class partypes[] = new Class[2];
                partypes[0] = Integer.TYPE;
                partypes[1] = Integer.TYPE;
                Method meth = cls.getMethod("add", partypes);
                method2 methobj = new method2();
                Object arglist[] = new Object[2];
                arglist[0] = new Integer(37);
                arglist[1] = new Integer(47);
                Object retobj = meth.invoke(methobj, arglist);
                Integer retval = (Integer) retobj;
                System.out.println(retval.intValue());
            } catch (Throwable e) {
                System.err.println(e);
            }
        }
    }
假如一个程序在执行的某处的时候才知道需要执行某个方法,q个Ҏ的名U是在程序的q行q程中指定的 (例如QJavaBean 开发环境中׃做这L?Q那么上面的E序演示了如何做到?br />     上例中,getMethod 用于查找一个具有两个整型参C名ؓ add 的方法。找到该Ҏq创Z相应?Method 对象之后Q在正确的对象实例中执行它。执行该Ҏ的时候,需要提供一个参数列表,q在上例中是分别包装了整?37 ?47 的两?Integer 对象。执行方法的q回的同h一?Integer 对象Q它装了返回?84?br />     7.创徏新的对象
    对于构造器Q则不能像执行方法那栯行,因ؓ执行一个构造器意味着创徏了一个新的对?(准确的说Q创Z个对象的q程包括分配内存和构造对?。所以,与上例最怼的例子如下:
    import java.lang.reflect.*;
    public class constructor2 {
        public constructor2() {
        }
        public constructor2(int a, int b) {
            System.out.println("a = " + a + " b = " + b);
        }
        public static void main(String args[]) {
            try {
                Class cls = Class.forName("constructor2");
                Class partypes[] = new Class[2];
                partypes[0] = Integer.TYPE;
                partypes[1] = Integer.TYPE;
                Constructor ct = cls.getConstructor(partypes);
                Object arglist[] = new Object[2];
                arglist[0] = new Integer(37);
                arglist[1] = new Integer(47);
                Object retobj = ct.newInstance(arglist);
            } catch (Throwable e) {
                System.err.println(e);
            }
        }
    }
    Ҏ指定的参数类型找到相应的构造函数ƈ执行它,以创Z个新的对象实例。用这U方法可以在E序q行时动态地创徏对象Q而不是在~译的时候创建对象,q一炚w常有价倹{?br />     Q这里如果用无参构造器创徏对象的话Q这可以直接使用Class.forName("...").newInstance();来创建对象)
    8.改变字段(?的?br />     reflection 的还有一个用处就是改变对象数据字D늚倹{reflection 可以从正在运行的E序中根据名U找到对象的字段q改变它Q下面的例子可以说明q一点:
    import java.lang.reflect.*;
    public class field2 {
        public double d;
        public static void main(String args[]) {
            try {
                Class cls = Class.forName("field2");
                Field fld = cls.getField("d");
                field2 f2obj = new field2();
                System.out.println("d = " + f2obj.d);
                fld.setDouble(f2obj, 12.34);
                System.out.println("d = " + f2obj.d);
            } catch (Throwable e) {
                System.err.println(e);
            }
        }
    }
    q个例子中,字段 d 的D变ؓ?12.34?br />     9.使用数组
    本文介绍?reflection 的最后一U用法是创徏的操作数l。数l在 Java 语言中是一U特D的cȝ型,一个数l的引用可以赋给 Object 引用。观察下面的例子看看数组是怎么工作的:
    import java.lang.reflect.*;
    public class array1 {
        public static void main(String args[]) {
            try {
                Class cls = Class.forName("java.lang.String");
                Object arr = Array.newInstance(cls, 10);
                Array.set(arr, 5, "this is a test");
                String s = (String) Array.get(arr, 5);
                System.out.println(s);
            } catch (Throwable e) {
                System.err.println(e);
            }
        }
    }
    例中创徏?10 个单位长度的 String 数组QؓW?5 个位|的字符串赋了|最后将q个字符串从数组中取得ƈ打印了出来?br />     下面q段代码提供了一个更复杂的例子:
    import java.lang.reflect.*;
    public class array2 {
        public static void main(String args[]) {
            int dims[] = new int[]{5, 10, 15};
            Object arr = Array.newInstance(Integer.TYPE, dims);
            Object arrobj = Array.get(arr, 3);
            Class cls = arrobj.getClass().getComponentType();
            System.out.println(cls);
            arrobj = Array.get(arrobj, 5);
            Array.setInt(arrobj, 10, 37);
            int arrcast[][][] = (int[][][]) arr;
            System.out.println(arrcast[3][5][10]);
        }
    }
    例中创徏了一?5 x 10 x 15 的整型数l,qؓ处于 [3][5][10] 的元素赋了gؓ 37。注意,多维数组实际上就是数l的数组Q例如,W一?Array.get 之后Qarrobj 是一?10 x 15 的数l。进而取得其中的一个元素,即长度ؓ 15 的数l,q?Array.setInt 为它的第 10 个元素赋倹{?br />     注意创徏数组时的cd是动态的Q在~译时ƈ不知道其cd?br />

forgood 2009-01-11 17:27 发表评论
]]>
java和jsp中文件上?/title><link>http://m.tkk7.com/forgood/archive/2008/12/01/243774.html</link><dc:creator>forgood</dc:creator><author>forgood</author><pubDate>Mon, 01 Dec 2008 10:19:00 GMT</pubDate><guid>http://m.tkk7.com/forgood/archive/2008/12/01/243774.html</guid><wfw:comment>http://m.tkk7.com/forgood/comments/243774.html</wfw:comment><comments>http://m.tkk7.com/forgood/archive/2008/12/01/243774.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/forgood/comments/commentRss/243774.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/forgood/services/trackbacks/243774.html</trackback:ping><description><![CDATA[<p>jsp文g上传大多采用采用开源项目来化处理,q里列出常用的两个jar包的实现Qƈq行比较Q说明他们的优缺点和应该注意的问题?/p> <p> Commons FileUploadQ可以在<a >http://jakarta.apache.org/commons/fileupload/</a><a >下蝲</a>Q这个包需要Commons IO的支持,可以?a >http://jakarta.apache.org/commons/io/</a><a >下蝲</a></p> <p> com.oreilly.servletQ可以在<a >http://www.servlets.com/cos/</a><a >下蝲</a> <br /> Commons FileUpload提供三种文g上传处理方式QDiskFileUpload、ServletFileUpload和PortletFileUpload三种方式Q其中DiskFileUpload已经在javadoc下已l被标记期的ҎQ徏议用ServletFileUpload代替Q而PortletFileUpload需要配合portlet-api来用,所以这里我们只介绍ServletFileUploadQƈ且这个也是最常用的?/p> <p>com.oreilly.servlet也提供了三种文g上传的处理方式,MultipartWrapper、MultipartRequest和MultipartParser三种方式Q其中MultipartWrapper和MultipartRequest的用法基本相同,q且没有MultipartRequest提供的操作多Q所以这里介lMultipartRequestQMultipartParser和前两者有些不同,可以用来处理某些Ҏ情况Q例如表单中有两个同名的文g上传选择框?/p> <p>我们暂时UC面三U文件上传方式分别ؓQServletFileUpload方式QMultipartTestServletQ、MultipartRequest方式QMultipartTestServlet2Q、MultipartParser方式QMultipartTestServlet3Q?/p> <p>代码如下Q?br /> test.html</p> <p><%@ page language="java" import="java.util.*" contentType="text/html;charset=gbk" pageEncoding="gbk"%><br /> <html><br />   <body><br />     <form action="MultipartTestServlet" enctype="multipart/form-data" method="post"><br />      <input type="text" name="username" /><br /><br />      <input type="file" name="myfile" /><br/><br />      <input type="file" name="myfile" /><br/><br />      <input type="submit" /><br />     </form><br />     <br/><br/><br/><br/><br />     <form action="MultipartTestServlet2" enctype="multipart/form-data" method="post"><br />      <input type="text" name="username" /><br /><br />      <input type="file" name="myfile" /><br/><br />      <input type="file" name="myfile" /><br/><br />      <input type="submit" /><br />     </form><br />     <br/><br/><br/><br/><br />     <form action="MultipartTestServlet3" enctype="multipart/form-data" method="post"><br />      <input type="text" name="username" /><br /><br />      <input type="file" name="myfile" /><br/><br />      <input type="file" name="myfile" /><br/><br />      <input type="submit" /><br />     </form><br />   </body><br /> </html><br /> MultipartTestServlet.java</p> <p>package com.bug.servlet;</p> <p>import java.io.File;<br /> import java.io.IOException;<br /> import java.util.ArrayList;<br /> import java.util.Iterator;<br /> import java.util.List;</p> <p>import javax.servlet.ServletException;<br /> import javax.servlet.http.HttpServlet;<br /> import javax.servlet.http.HttpServletRequest;<br /> import javax.servlet.http.HttpServletResponse;</p> <p>import org.apache.commons.fileupload.FileItem;<br /> import org.apache.commons.fileupload.FileUpload;<br /> import org.apache.commons.fileupload.FileUploadException;<br /> import org.apache.commons.fileupload.RequestContext;<br /> import org.apache.commons.fileupload.disk.DiskFileItemFactory;<br /> import org.apache.commons.fileupload.servlet.ServletFileUpload;<br /> import org.apache.commons.fileupload.servlet.ServletRequestContext;</p> <p>public class MultipartTestServlet extends HttpServlet {</p> <p> public MultipartTestServlet() {<br />   super();<br />  }</p> <p> public void doPost(HttpServletRequest request, HttpServletResponse response)<br />    throws ServletException, IOException {</p> <p>  request.setCharacterEncoding("gbk");<br />   RequestContext requestContext = new ServletRequestContext(request);<br />   <br />   if(FileUpload.isMultipartContent(requestContext)){<br />    <br />    DiskFileItemFactory factory = new DiskFileItemFactory();<br />    factory.setRepository(new File("c:/tmp/"));<br />    ServletFileUpload upload = new ServletFileUpload(factory);<br />    //upload.setHeaderEncoding("gbk");<br />    upload.setSizeMax(2000000);<br />    List items = new ArrayList();<br />     try {<br />      items = upload.parseRequest(request);<br />     } catch (FileUploadException e1) {<br />      System.out.println("文g上传发生错误" + e1.getMessage());<br />     }</p> <p>   Iterator it = items.iterator();<br />    while(it.hasNext()){<br />     FileItem fileItem = (FileItem) it.next();<br />     if(fileItem.isFormField()){      <br />      System.out.println(fileItem.getFieldName() + "   " + fileItem.getName() + "   " + new String(fileItem.getString().getBytes("iso8859-1"), "gbk"));<br />     }else{<br />      System.out.println(fileItem.getFieldName() + "   " + <br />         fileItem.getName() + "   " + <br />         fileItem.isInMemory() + "    " + <br />         fileItem.getContentType() + "   " + <br />         fileItem.getSize());<br />      <br />      if(fileItem.getName()!=null && fileItem.getSize()!=0){<br />       File fullFile = new File(fileItem.getName());<br />       File newFile = new File("c:/temp/" + fullFile.getName());<br />       try {<br />        fileItem.write(newFile);<br />       } catch (Exception e) {<br />        e.printStackTrace();<br />       }<br />      }else{<br />       System.out.println("文g没有选择 ?文g内容为空");<br />      }<br />     }<br />      <br />    }<br />   }<br />  }</p> <p>}</p> <p>MultipartTestServlet2.java</p> <p>package com.bug.servlet;</p> <p>import java.io.IOException;<br /> import java.util.Enumeration;</p> <p>import javax.servlet.ServletException;<br /> import javax.servlet.http.HttpServlet;<br /> import javax.servlet.http.HttpServletRequest;<br /> import javax.servlet.http.HttpServletResponse;</p> <p>import com.oreilly.servlet.MultipartRequest;<br /> import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;</p> <p>public class MultipartTestServlet2 extends HttpServlet {</p> <p> public MultipartTestServlet2() {<br />   super();<br />  }</p> <p> public void doPost(HttpServletRequest request, HttpServletResponse response)<br />    throws ServletException, IOException {</p> <p>  //request.setCharacterEncoding("gbk");  不v作用<br />   System.out.println("start ");<br />   MultipartRequest multi = new MultipartRequest(request, "c:/tmp/", 2*1024*1024, "gbk", new DefaultFileRenamePolicy());<br />   System.out.println("start ");<br />   Enumeration filesName = multi.getFileNames();<br />   Enumeration paramsName = multi.getParameterNames();<br />   while(paramsName.hasMoreElements()){<br />    String paramName = (String) paramsName.nextElement();<br />    System.out.println(multi.getParameter(paramName));<br />   }<br />   while(filesName.hasMoreElements()){<br />    String fileName = (String) filesName.nextElement();<br />    System.out.println(multi.getFilesystemName(fileName) + "  " +<br />           multi.getOriginalFileName(fileName) + "  " + <br />           multi.getContentType(fileName) + "  ");<br />    if(multi.getFilesystemName(fileName)!=null && !multi.getFilesystemName(fileName).equals(""))<br />     System.out.println(multi.getFile(fileName).toURI());<br />   }<br />  }<br />  <br /> }</p> <p>MultipartTestServlet3.java</p> <p>package com.bug.servlet;</p> <p>import java.io.File;<br /> import java.io.IOException;</p> <p>import javax.servlet.ServletException;<br /> import javax.servlet.http.HttpServlet;<br /> import javax.servlet.http.HttpServletRequest;<br /> import javax.servlet.http.HttpServletResponse;</p> <p>import com.oreilly.servlet.multipart.FilePart;<br /> import com.oreilly.servlet.multipart.MultipartParser;<br /> import com.oreilly.servlet.multipart.ParamPart;<br /> import com.oreilly.servlet.multipart.Part;</p> <p>public class MultipartTestServlet3 extends HttpServlet {</p> <p> public MultipartTestServlet3() {<br />   super();<br />  }</p> <p> public void doPost(HttpServletRequest request, HttpServletResponse response)<br />    throws ServletException, IOException {</p> <p>      MultipartParser mp = new MultipartParser(request, 2*1024*1024, false, false, "gbk");<br />       Part part;<br />       while ((part = mp.readNextPart()) != null) {<br />         String name = part.getName();<br />         if (part.isParam()) {<br />           ParamPart paramPart = (ParamPart) part;<br />           String value = paramPart.getStringValue();<br />           System.out.println("param: name=" + name + "; value=" + value);<br />         }<br />         else if (part.isFile()) {<br />           // it's a file part<br />           FilePart filePart = (FilePart) part;<br />           String fileName = filePart.getFileName();<br />           if (fileName != null) {<br />             long size = filePart.writeTo(new File("c:/tmp/"));<br />             System.out.println("file: name=" + name + "; fileName=" + fileName +<br />               ", filePath=" + filePart.getFilePath() + <br />               ", contentType=" + filePart.getContentType() + <br />               ", size=" + size);<br />           }<br />           else { <br />            System.out.println("file: name=" + name + "; EMPTY");<br />           }<br />           System.out.flush();<br />         }<br />       }<br />     } </p> <p>}</p> <p>web.xml中加?/p> <p> <servlet><br />     <servlet-name>MultipartTestServlet</servlet-name><br />     <servlet-class>com.bug.servlet.MultipartTestServlet</servlet-class><br />   </servlet><br />   <servlet><br />     <servlet-name>MultipartTestServlet2</servlet-name><br />     <servlet-class>com.bug.servlet.MultipartTestServlet2</servlet-class><br />   </servlet><br />   <servlet><br />     <servlet-name>MultipartTestServlet3</servlet-name><br />     <servlet-class>com.bug.servlet.MultipartTestServlet3</servlet-class><br />   </servlet><br />   <servlet-mapping><br />     <servlet-name>MultipartTestServlet</servlet-name><br />     <url-pattern>/MultipartTestServlet</url-pattern><br />   </servlet-mapping><br />   <servlet-mapping><br />     <servlet-name>MultipartTestServlet2</servlet-name><br />     <url-pattern>/MultipartTestServlet2</url-pattern><br />   </servlet-mapping><br />   <servlet-mapping><br />     <servlet-name>MultipartTestServlet3</servlet-name><br />     <url-pattern>/MultipartTestServlet3</url-pattern><br />   </servlet-mapping></p> <p>问题1、中文问题:<br />  三种凡是都可以通过自己的方法来讄encoding为gbk开处理和解决中文问题,包括初始化的时候传入gbk作ؓ参数Q或是是初始化后通过setEncoding的方式来实现?br />  另外ServletFileUpload方式也可以通过request.setCharacterEncoding("gbk");的方式来实现Q而其它两U方式不支持q种方式?/p> <p><br /> 问题2、文件大限?br />  ServletFileUpload方式可以讄文g大小限制Q也可以不用讄Q例子中的upload.setSizeMax(2000000)可以注释掉。如果设|upload.setSizeMax(-1)Q表明不限制上传的大。文档中没有指明默认的限制的多少Q我在不讄的情况下上传了一?M的东西,可以上传Q估计默认是不限制大的?br />  而MultipartRequest方式和MultipartParser方式是必设|文件的上传文g的大限制的Q如果不讄Q默认是1M的大限制?/p> <p><br /> 问题3、文件上传发生错?br />  如果文g上传q程中发生Q何错误,或者是文g的大超Z范围Q系l都抛出错误?br />  ServletFileUpload方式在upload.parseRequest(request)时抛出错?br />  MultipartRequest方式在new MultipartRequest(。。?时抛出错?br />  MultipartParser方式在new MultipartParser(。。?时抛出错?/p> <p><br /> 问题4、上传同名文件时Q他们保存到临时目录是的冲突问题<br />  ServletFileUpload方式Q不会有冲突Q系l会把上传得文g按照一定的规则重新命名Q保证不会冲H?br />  MultipartParser方式Q会产生冲突Q系l会把文件按照上传时的文件名Q保存到临时目录下,如果两个用会同时上传文g名相同的文gQ那么就可能会生冲H,一Ҏ另一方的临时文gl替换了?br />  MultipartRequest方式Q在初始化时如果提供了一个名U{换策略,׃会有冲突Q如果不提桶Q就会有冲突。在上面的例子中我们提供了一个new DefaultFileRenamePolicy()保证了文件名不会有冲H发生?/p> <p><br /> 问题5Q表单中有两个同名的文g上传选择框,像我们例子中的myfile一P每个表单中有两个name=“myfile”的上传框<br />  ServletFileUpload方式Q可以处理,可以分别得到他们各自的文Ӟ<br />  MultipartRequest方式Q不可以处理Q会发生冲突Q会有一个上传框的文件覆盖了另外一个?br />  MultipartParser方式Q可以处理,可以分别得到他们各自的文Ӟ</p> <p><br /> 备注Q?br />  代码比较乱,主要是ؓ了说明他们间的区别。他们的详细C用说明还是要参考他的javadoc和domo?/p> <p>参考:<br />  1?a >http://www.servlets.com/cos/#classes</a><br />  2?a >http://jakarta.apache.org/commons/fileupload/apidocs/index.html</a><br />  3?a >http://jakarta.apache.org/commons/fileupload/using.html</a><br />  4?a >http://www.onjava.com/pub/a/onjava/2003/06/25/commons.html?page=3</a></p> <img src ="http://m.tkk7.com/forgood/aggbug/243774.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/forgood/" target="_blank">forgood</a> 2008-12-01 18:19 <a href="http://m.tkk7.com/forgood/archive/2008/12/01/243774.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java栈与?http://m.tkk7.com/forgood/archive/2008/11/30/243536.htmlforgoodforgoodSun, 30 Nov 2008 06:29:00 GMThttp://m.tkk7.com/forgood/archive/2008/11/30/243536.htmlhttp://m.tkk7.com/forgood/comments/243536.htmlhttp://m.tkk7.com/forgood/archive/2008/11/30/243536.html#Feedback0http://m.tkk7.com/forgood/comments/commentRss/243536.htmlhttp://m.tkk7.com/forgood/services/trackbacks/243536.html
----对这两个概念的理解L忘记Q今天从|上搜到一比较好的文章收?br />
1. ?stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同QJava自动理栈和堆,E序员不能直接地讄栈或堆?

2. 栈的优势是,存取速度比堆要快Q仅ơ于直接位于CPU中的寄存器。但~点是,存在栈中的数据大与生存期必L定的,~Z灉|性。另外,栈数据可以共享,详见W?炏V堆的优势是可以动态地分配内存大小Q生存期也不必事先告诉编译器QJava的垃圾收集器会自动收走这些不再用的数据。但~点是,׃要在q行时动态分配内存,存取速度较慢?

3. Java中的数据cd有两U?

一U是基本cd(primitive types), 共有8U,即int, short, long, byte, float, double, boolean, char(注意Qƈ没有string的基本类?。这U类型的定义是通过诸如int a = 3; long b = 255L;的Ş式来定义的,UCؓ自动变量。值得注意的是Q自动变量存的是字面|不是cȝ实例Q即不是cȝ引用Q这里ƈ没有cȝ存在。如int a = 3; q里的a是一个指向intcd的引用,指向3q个字面倹{这些字面值的数据Q由于大可知,生存期可?q些字面值固定定义在某个E序块里面,E序块退出后Q字D值就消失?Q出于追求速度的原因,存在于栈中?

另外Q栈有一个很重要的特D性,是存在栈中的数据可以共享。假设我们同时定义:
复制内容到剪贴板代码:
int a = 3;
int b = 3Q?
~译器先处理int a = 3Q首先它会在栈中创徏一个变量ؓa的引用,然后查找有没有字面gؓ3的地址Q没扑ֈQ就开辟一个存?q个字面值的地址Q然后将a指向3的地址。接着处理int b = 3Q在创徏完b的引用变量后Q由于在栈中已经?q个字面|便将b直接指向3的地址。这P出Ca与b同时均指?的情c?

特别注意的是Q这U字面值的引用与类对象的引用不同。假定两个类对象的引用同时指向一个对象,如果一个对象引用变量修改了q个对象的内部状态,那么另一个对象引用变量也卛_反映个变化。相反,通过字面值的引用来修改其|不会D另一个指向此字面值的引用的g跟着改变的情c如上例Q我们定义完a与b的值后Q再令a=4Q那么,b不会{于4Q还是等?。在~译器内部,遇到a=4Q时Q它׃重新搜烦栈中是否?的字面|如果没有Q重新开辟地址存放4的|如果已经有了Q则直接a指向q个地址。因此a值的改变不会影响到b的倹{?

另一U是包装cL据,如Integer, String, Double{将相应的基本数据类型包装v来的cR这些类数据全部存在于堆中,Java用new()语句来显C地告诉~译器,在运行时才根据需要动态创建,因此比较灉|Q但~点是要占用更多的时间?4. String是一个特D的包装cL据。即可以用String str = new String("abc");的Ş式来创徏Q也可以用String str = "abc"Q的形式来创?作ؓҎQ在JDK 5.0之前Q你从未见过Integer i = 3;的表辑ּQ因为类与字面值是不能通用的,除了String。而在JDK 5.0中,q种表达式是可以的!因ؓ~译器在后台q行Integer i = new Integer(3)的{?。前者是规范的类的创E,卛_Java中,一切都是对象,而对象是cȝ实例Q全部通过new()的Ş式来创徏。Java中的有些c,如DateFormatc,可以通过该类的getInstance()Ҏ来返回一个新创徏的类Q似乎违反了此原则。其实不然。该c运用了单例模式来返回类的实例,只不q这个实例是在该cd部通过new()来创建的Q而getInstance()向外部隐藏了此细节。那Z么在String str = "abc"Q中Qƈ没有通过new()来创建实例,是不是违反了上述原则Q其实没有?

5. 关于String str = "abc"的内部工作。Java内部此语句转化Z下几个步骤:

(1)先定义一个名为str的对Stringcȝ对象引用变量QString strQ?

(2)在栈中查找有没有存放gؓ"abc"的地址Q如果没有,则开辟一个存攑֭面gؓ"abc"的地址Q接着创徏一个新的Stringcȝ对象oQƈo的字W串值指向这个地址Q而且在栈中这个地址旁边Cq个引用的对象o。如果已l有了gؓ"abc"的地址Q则查找对象oQƈq回o的地址?

(3)str指向对象o的地址?

值得注意的是Q一般StringcM字符串值都是直接存值的。但像String str = "abc"Q这U场合下Q其字符串值却是保存了一个指向存在栈中数据的引用Q?

Z更好地说明这个问题,我们可以通过以下的几个代码进行验证?
复制内容到剪贴板代码:
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
注意Q我们这里ƈ不用str1.equals(str2)Q的方式Q因比较两个字W串的值是否相{?=PҎJDK的说明,只有在两个引用都指向了同一个对象时才返回真倹{而我们在q里要看的是Qstr1与str2是否都指向了同一个对象?
l果说明QJVM创徏了两个引用str1和str2Q但只创Z一个对象,而且两个引用都指向了q个对象?

我们再来更进一步,以上代码改成:
复制内容到剪贴板代码:
String str1 = "abc";
String str2 = "abc";
str1 = "bcd";
System.out.println(str1 + "," + str2); //bcd, abc
System.out.println(str1==str2); //false
q就是说Q赋值的变化D了类对象引用的变化,str1指向了另外一个新对象Q而str2仍旧指向原来的对象。上例中Q当我们str1的值改?bcd"ӞJVM发现在栈中没有存放该值的地址Q便开辟了q个地址Qƈ创徏了一个新的对象,其字W串的值指向这个地址?

事实上,Stringc被设计成ؓ不可改变(immutable)的类。如果你要改变其|可以Q但JVM在运行时Ҏ新值悄悄创Z一个新对象Q然后将q个对象的地址q回l原来类的引用。这个创E虽说是完全自动q行的,但它毕竟占用了更多的旉。在Ҏ间要求比较敏感的环境中,会带有一定的不良影响?

再修改原来代码:
复制内容到剪贴板代码:
String str1 = "abc";
String str2 = "abc";

str1 = "bcd";

String str3 = str1;
System.out.println(str3); //bcd

String str4 = "bcd";
System.out.println(str1 == str4); //true
str3q个对象的引用直接指向str1所指向的对?注意Qstr3q没有创建新对象)。当str1改完其值后Q再创徏一个String的引用str4Qƈ指向因str1修改D创建的新的对象。可以发玎ͼq回str4也没有创建新的对象,从而再ơ实现栈中数据的׃n?

我们再接着看以下的代码?
复制内容到剪贴板代码:
String str1 = new String("abc");
String str2 = "abc";
System.out.println(str1==str2); //false 创徏了两个引用。创Z两个对象。两个引用分别指向不同的两个对象?

String str1 = "abc";
String str2 = new String("abc");
System.out.println(str1==str2); //false
创徏了两个引用。创Z两个对象。两个引用分别指向不同的两个对象?

以上两段代码说明Q只要是用new()来新建对象的Q都会在堆中创徏Q而且其字W串是单独存值的Q即使与栈中的数据相同,也不会与栈中的数据共享?

6. 数据cd包装cȝg可修攏V不仅仅是Stringcȝg可修改,所有的数据cd包装c都不能更改其内部的倹{?
7. l论与徏议:

(1)我们在用诸如String str = "abc"Q的格式定义cLQL惛_然地认ؓQ我们创ZStringcȝ对象str。担心陷阱!对象可能q没有被创徏Q唯一可以肯定的是Q指向Stringcȝ引用被创Z。至于这个引用到底是否指向了一个新的对象,必须Ҏ上下文来考虑Q除非你通过new()Ҏ来显要地创徏一个新的对象。因此,更ؓ准确的说法是Q我们创Z一个指向Stringcȝ对象的引用变量strQ这个对象引用变量指向了某个gؓ"abc"的StringcR清醒地认识到这一点对排除E序中难以发现的bug是很有帮助的?

(2)使用String str = "abc"Q的方式Q可以在一定程度上提高E序的运行速度Q因为JVM会自动根据栈中数据的实际情况来决定是否有必要创徏新对象。而对于String str = new String("abc")Q的代码Q则一概在堆中创徏新对象,而不其字符串值是否相{,是否有必要创建新对象Q从而加重了E序的负担。这个思想应该是n元模式的思想Q但JDK的内部在q里实现是否应用了这个模式,不得而知?

(3)当比较包装类里面的数值是否相{时Q用equals()ҎQ当试两个包装cȝ引用是否指向同一个对象时Q用==?

(4)׃Stringcȝimmutable性质Q当String变量需要经常变换其值时Q应该考虑使用StringBufferc,以提高程序效率?

forgood 2008-11-30 14:29 发表评论
]]>
java中压~与解压~的实现http://m.tkk7.com/forgood/archive/2008/09/16/229247.htmlforgoodforgoodTue, 16 Sep 2008 12:52:00 GMThttp://m.tkk7.com/forgood/archive/2008/09/16/229247.htmlhttp://m.tkk7.com/forgood/comments/229247.htmlhttp://m.tkk7.com/forgood/archive/2008/09/16/229247.html#Feedback0http://m.tkk7.com/forgood/comments/commentRss/229247.htmlhttp://m.tkk7.com/forgood/services/trackbacks/229247.html阅读全文

forgood 2008-09-16 20:52 发表评论
]]>
JAVA解析XML配置文g的读取操?http://m.tkk7.com/forgood/archive/2008/09/09/227916.htmlforgoodforgoodTue, 09 Sep 2008 04:49:00 GMThttp://m.tkk7.com/forgood/archive/2008/09/09/227916.htmlhttp://m.tkk7.com/forgood/comments/227916.htmlhttp://m.tkk7.com/forgood/archive/2008/09/09/227916.html#Feedback0http://m.tkk7.com/forgood/comments/commentRss/227916.htmlhttp://m.tkk7.com/forgood/services/trackbacks/227916.html    在apache的XML目l中Q目前有Xerces Xalan Cocoon几个开发XML相关技术的project.Tomcat本n使用的是 Sun ?JAXPQ而其XSL Taglib project中用Xerces解析器?

    好了Q上面都是比较烦人的理论问题Q还是赶快切入XML的配|文件的d吧?

    在我们的E序中,通常要有一些根据主机环境确定的变量。比如数据库讉K用户名和密码Q不同的L可能讄不一栗只要更改XML配置文gQ就可以正常q行?


localhost
sqlname
username
password

    上面q个myenv.xml配置文g一般是攑֜tomcat的WEB-INF/classes目录?

    我们~制一个JavaE序直接d,dbhost dbuser dbpassword提取出来供其他程序访问数据库?

    目前使用SAX比较的多,与DOM主要区别?SAX是一行一行读取XML文gq行分析,适合比较大文?DOM是一ơ性读入内?昄不能对付大文?q里我们使用SAX解析,׃SAX解析器不断在发展,|上有不文章是针对老版本的.如果你用JDK1.4 ,可以参?使用SAX处理XML文档 一?q里的程序是Ҏ其改qƈ且经q实践调试得来的.

对上面myenv.xmld的JavaE序:


import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXException;
import java.util.Properties;

//使用DefaultHandler的好??不必陈列出所有方?
public class ConfigParser extends DefaultHandler {

////定义一个Properties 用来存放 dbhost dbuser dbpassword的?br /> private Properties props;

private String currentSet;
private String currentName;
private StringBuffer currentValue = new StringBuffer();

//构徏器初始化props
public ConfigParser() {

this.props = new Properties();
}

public Properties getProps() {
return this.props;
}

//定义开始解析元素的Ҏ. q里是将 中的名称xxx提取出来.
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
currentValue.delete(0, currentValue.length());
this.currentName =qName;

}

//q里是将 之间的值加入到currentValue

public void characters(char[] ch, int start, int length) throws SAXException {

currentValue.append(ch, start, length);

}

//在遇?l束?之前的名称和g一对应保存在props?br />
public void endElement(String uri, String localName, String qName) throws SAXException {

props.put(qName.toLowerCase(), currentValue.toString().trim());
}

}

    上面的这个解析程序比较简单吧? 其实解析XML是q么?

    现在我们已经dbhost dbuser dbpassword的值localhost sqlname username password提取了出?但是q只是在在解析器内部,我们的程序还不能讉K.需要再~制一个程?


import java.util.Properties;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.net.URL;

public class ParseXML{

//定义一个Properties 用来存放 dbhost dbuser dbpassword的?br /> private Properties props;

//q里的props
public Properties getProps() {
return this.props;
}

public void parse(String filename) throws Exception {

//我们的解析器对象化
ConfigParser handler = new ConfigParser();

//获取SAX工厂对象
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);

//获取SAX解析
SAXParser parser = factory.newSAXParser();

//得到配置文gmyenv.xml所在目? tomcat中是在WEB-INF/classes
//下例中BeansConstants是用来存放xml文g中配|信息的c?可以自己代替或定?br /> URL confURL = BeansConstants.class.getClassLoader().getResource(filename);

try
{
//解析器和解析对象myenv.xml联系h,开始解?br /> parser.parse(confURL.toString(), handler);
//获取解析成功后的属?以后 我们其他应用E序只要调用本程序的props可以提取出属性名U和g
props = handler.getProps();
}finally{
factory=null;
parser=null;
handler=null;
}

}

}

    ׃我们的XML文g是用最单的形式 ,因此解析器相对简?但是q已l够对付我们的配置文g?

    判断一个程序系l的先进?我们先看看他的配|文?如果q在使用老套的xxx=123 q样cM.ini的文?



forgood 2008-09-09 12:49 发表评论
]]>
怎么得到ucs2字符串中制定位数http://m.tkk7.com/forgood/archive/2008/09/08/227824.htmlforgoodforgoodMon, 08 Sep 2008 15:02:00 GMThttp://m.tkk7.com/forgood/archive/2008/09/08/227824.htmlhttp://m.tkk7.com/forgood/comments/227824.htmlhttp://m.tkk7.com/forgood/archive/2008/09/08/227824.html#Feedback0http://m.tkk7.com/forgood/comments/commentRss/227824.htmlhttp://m.tkk7.com/forgood/services/trackbacks/227824.htmlC#?a class="channel_keylink" target="_blank">Java内部采用的都?Unicode 16QUCS2Q编码,在这U编码中所有的字符都是两个字符Q因此,如果要截取的字符串是中、英文、数字؜合的Q就会生问题,如下面的字符Ԍ

String s = "a加b{于cQ如果a{?、b{于2Q那么c{?";

    上面的字W串既有汉字Q又有英文字W和数字。如果要截取?个字节的字符Q应该是”a加b{?Q但如果用substringҎ截取?个字W就成了"a 加b{于c"。生这个问题的原因是将substringҎ双字节的汉字当成一个字节的字符QUCS2字符Q处理了。要解决q个问题的方法是首先得到该字W串的UCS2~码的字节数l,如下面的代码如下Q?br />
byte[] bytes = s.getBytes("Unicode");

    ׃上面生成的字节数l中前两个字节是标志位,bytes[0] = -2Qbytes[1] = -1Q因此,要从W三个字节开始扫描,对于一个英文或数字字符QUCS2~码的第二个字节是相应的ASCIIQ第一个字节是0Q如a的UCS2~码?  97Q而汉字两个字节都不ؓ0Q因此,可以利于UCS2~码的这个规则来计算实际的字节数Q该Ҏ的实C码如下:

    public static String bSubstring(String s, int length) throws Exception
    {

        
byte[] bytes = s.getBytes("Unicode");
        
int n = 0// 表示当前的字节数
        int i = 2// 要截取的字节?/span>Q从W?个字节开?br />         for (; i < bytes.length && n < length; i++)
        {
            
// 奇数位置Q如3??{,为UCS2~码中两个字节的W二个字?/span>
            if (i % 2 == 1)
            {
                n
++// 在UCS2W二个字节时n?
            }
            
else
            {
                
// 当UCS2~码的第一个字节不{于0Ӟ该UCS2字符为汉字,一个汉字算两个字节
                if (bytes[i] != 0)
                {
                    n
++;
                }
            }
        }
        
// 如果i为奇数时Q处理成偶数
        if (i % 2 == 1)

        {
            
// 该UCS2字符是汉字时Q去掉这个截一半的汉字
            if (bytes[i - 1] != 0)
                i 
= i - 1;
            
// 该UCS2字符是字母或数字Q则保留该字W?/span>
            else
                i 
= i + 1;
        }

        
return new String(bytes, 0, i, "Unicode");
    }

    下面代码使用了bSubstringҎQ?br />
String s = "a加b{于cQ如果a{?、b{于2Q那么c{?";
System.out.println(bSubstring(s,
6));

    上面的代码截取的字符串是"a加b{?span style="color: #000000" twffan="done">"?

forgood 2008-09-08 23:02 发表评论
]]>
详解Eclipse+MyEclipse完全l色版制作方?http://m.tkk7.com/forgood/archive/2008/08/07/220783.htmlforgoodforgoodThu, 07 Aug 2008 15:00:00 GMThttp://m.tkk7.com/forgood/archive/2008/08/07/220783.htmlhttp://m.tkk7.com/forgood/comments/220783.htmlhttp://m.tkk7.com/forgood/archive/2008/08/07/220783.html#Feedback0http://m.tkk7.com/forgood/comments/commentRss/220783.htmlhttp://m.tkk7.com/forgood/services/trackbacks/220783.html[转蝲] 详解Eclipse+MyEclipse完全l色版制作方?/a>

         现在在Java开发中Q用的开发工具大部分都是EclipseQƈ且和Eclipse关系紧密的要数MyEclipse了,但是MyEclipse是一个EXE可执行程序,对于没有安装Eclipse与MyEclilpse的电脑来_首先得先解压EclipseQ然后再安装MyEclipseQ这不光很麻烦,而且q很ҎQ对于已l安装好的电脑来_如果哪天电脑Z问题或是Eclipse崩溃了,D工具不能用,q时又不得不重新安装Ӟ那可真够郁闷_~~Q因此,大象本着我ؓZhQhZؓ我的奉献_Q在此,Eclipse+MyEclipse的完全绿色版制作Ҏ写出来,和大家一起分享,让大安能n受到q种方便?br />         在这里,大象采用Eclipse3.3.1与MyEclipse_6.0.1GA_E3.3.1_Installer版来举例说明Q其它的版本做法与此相同?/span>
        W?步:下蝲Eclipse3.3.1和MyEclipse_6.0.1GA
           q里我要提醒大家注意一下:下蝲Eclipse时不要选择3.2的版本,因ؓMyEclipse6.0需?/span>3.3版本以上的支持,另外是下蝲MyEclipse时不要下完全版,而应该只下插件版Q我的这?/span>MyEclipse6.0.1的插件版?/span>176M?br />
        W?/span>2步:解压Eclipse3.3.1 
          ?/span>Eclipse3.3.1的压~包解压?/span>D盘根目录下?br />

          做这个绿色版Q把它放在根目录下是因ؓq样做很方便Q?span style="color: #ff0000">在这里,大象以D盘ؓ例,来说明制作方法?/span>
    W?步:安装MyEclipse6.0.1GA
           双击"MyEclipse_6.0.1GA_E3.3.1_Installer.exe"开始安装MyEclipseQ在W??"Choose Eclipse Folder"Ӟ注意 "Please Choose Existing Eclipse Installation Folder"Q点?Choose...",请选择你解压的Eclipse文g夹,选择好之后如下图Q?br />
          点击"Next"Q出?Where Would You Like to Install MyEclipse 6.0.1?",点击"Choose...",选择上面的eclipse文g夹,q时记得在eclipse后面加一个目录名Q否则,MyEclipse的安装文件就会全部放在eclipse的根目录下,q可不是我们希望看到_讄好之后如下图:

           下面的安装没什么好说的Q就是一路Next了。安装结束后Q可以在eclipse目录下看到有一?MyEclipse 6.0.1GA"q个文g?q去看看Q是不是有两个文件夹Q两个文Ӟ

           OK,到此MyEclipse插g已经安装完成了,下面来进行我们的l色插g制作?br />     W?步:插g制作
           在eclipse目录下,新徏一个文件夹Q命名ؓ"ThirdPlugins"Q你要取别的名字也可以,不过一定要和links目录里面的配|文件中的\径一_后面会有说明),?MyEclipse 6.0.1GA"q个文g夹复制到"ThirdPlugins"目录下,别用剪切喔,q可是刚才安装MyEclipse的目录,{会q要~MyEclipseQ如果这个目录没有了Q到时D载不了,Z什么问题可不要怪大象喔Q?br />            MyEclipse安装好之后,会在eclipse目录下生成一个links文g夹,里面有一?com.genuitec.eclipse.MyEclipse.link"文gQ我们删除它Q另外新Z?MyEclipse 6.0.1GA.ini"文gQ内容ؓQ?span style="color: #ff0000">path=ThirdPlugins/MyEclipse 6.0.1GA
           保存完之后,我们的插件制作也l束了,然后是~MyEclipseQ千万不要直接把那个文g夹删掉,而应该D载它?br />

           其实所有的插g都可以按q个方式来做Q这样做的好处就是,想用放q去Q不想用删掉,如果攑ֈeclipse的features和plugins里面Q会很不好管理?br />     W?步:配置参数
           虽然插g已经安装好了Q但是,此时我们q不能启动它Q应该对eclipse的启动参数设|一下,提高它的启动速度和运行时的稳定性。在eclipse.exe上点右键Q选择"创徏快捷方式"Q在快捷方式上点右键Q选择"属?Q在"D:\eclipse\eclipse.exe后面加上I格Q将q些参数加在后面Q?br />            -vmargs -Xverify:none -XX:+UseParallelGC -XX:PermSize=20M -XX:MaxPermSize=128M -Xms256M -Xmx512M
           -Xms256M -Xmx512MQ这是堆Q根据内存大来讄Q比如大象的内存?G,我就设成256?12Q这样一般都够用了?br />            当然了,你也可以什么都不设|,不过大象q是讄q些参数Q可以很大程度上提升eclipse的启动速度。在安装完MyEclipseӞq会生成一个eclipse.ini的备份文Ӟq个不需要,删掉。我们可以修改下eclipse.ini文gQ原始的如下Q?/p>

-showsplash
com.genuitec.myeclipse.product
--launcher.XXMaxPermSize
256m
-vmargs
-Xms128m
-Xmx512m
-Dosgi.splashLocation=D:\eclipse\MyEclipse 6.0.1GA\eclipse\MyEclipseSplash.bmp
-Duser.language=en 
-XX:PermSize=128M 
-XX:MaxPermSize=256M
           其实q个文g为空都没关系Q大象试q,全部删除Q没有错误,不过我还是徏议大安面至保留这些东?br />
-vmargs
-Xms256m
-Xmx512m
           我将128Ҏ?56Q如果你惛_MyEclipse插g中用"MyEclipse 6.0.1"快捷方式来启动的话,可以写成q样
-vmargs
-Xms256m
-Xmx512m
-Dosgi.splashLocation=D:\Eclipse-3.3.1\ThirdPlugins\MyEclipse 6.0.1GA\eclipse\MyEclipseSplash.bmp

           最下面一行是启动Ӟ昄MyEclipse的图片,如果没有q句话运?MyEclipse 6.0.1"快捷方式Q则会显Ceclipse的启动画面,其实"MyEclipse 6.0.1"快捷方式q是q接着eclipse.exeq个执行E序Q在"MyEclipse 6.0.1"上点右键Q选择属性,在目标里可以看到?br />     W?步:注册MyEclipse
           MyEclipse6.0的注册一定要断开|络Q否则肯定不成功Q?br />            6.0.1GA注册?br />            Subscriber: administrator
           Subscription Code: nLR7ZL-655342-54657656405281154
           q里有一点大象要提醒大家注意Q如果你电脑上现在正有用的MyEclipseQ就是说已经注册了,那么在C:\Documents and Settings\"自己的用户名" 目录下,会有一?.myeclipse.properties"文gQ这时请先备份此文gQ然后删除它Q断开|络Q再来注册MyEclipse6.0.1Q成功后如下Q?br />

    W?步:打包eclipse
           到现在所有的工作都已l完成,启动eclipse的速度快不快?好了Q该做最后一步操作了Q将"configuration"文g夹下的内定w"config.ini"文g外全部删除,另外再把workspace文g夹删除,大象一般会把workspace攑֜eclipse根目录下Q方法是在第一ơ启动选择路径时把前面的目录都删除Q只保留workspaceQ前面什么都不要保留Q。这h便管理,你要攑֜其它的地斚w便,q个看各人喜好。做完这两步之后Q最好还是在eclipse目录下徏一个txt文本文gQ把上面的注册码攑ֈ里面Q另外加上一句话:"注册时一定要断开|络,否则肯定注册不成?"q样以后用时Q可以提醒自׃下。里面有注册码,要用时很方便?br />            在eclipse文g夹上点右键,选择"d到eclipse.rar"Q等到压~完成,xQ终于大功告成!
    大家管攑ֿ按着我的Ҏ试,大象前前后后做了不下十遍Q今天又在公司的电脑上做了一遍,囄都是刚刚截取的,嘿嘿Q今天老板不在Q大象小的放松一下,写写博客。有了这个压~包Q以后大家在使用时就会方便很多,特别是保存到Ud盘里,惛_哪用在哪用。哇哈哈哈哈~~~~~~~~大家好q,都成功做出来Q?br />     此帖萝大象原创,如要转蝲h明出处?/font>


forgood 2008-08-07 23:00 发表评论
]]>
java中用oracle的exp/imp导出、导入数?/title><link>http://m.tkk7.com/forgood/archive/2008/06/13/207623.html</link><dc:creator>forgood</dc:creator><author>forgood</author><pubDate>Fri, 13 Jun 2008 03:57:00 GMT</pubDate><guid>http://m.tkk7.com/forgood/archive/2008/06/13/207623.html</guid><wfw:comment>http://m.tkk7.com/forgood/comments/207623.html</wfw:comment><comments>http://m.tkk7.com/forgood/archive/2008/06/13/207623.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/forgood/comments/commentRss/207623.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/forgood/services/trackbacks/207623.html</trackback:ping><description><![CDATA[<span style="color: #000000">          今天在学习的q程中遇C一关于java中用oracle导入导出的文章,感觉q不错,Z学习和以后工作的需要,我整理如下:<br />            String[] cmds </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> String[</span><span style="color: #000000">3</span><span style="color: #000000">];<br /> <img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align="top" alt="" />        cmds[</span><span style="color: #000000">0</span><span style="color: #000000">] </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">cmd</span><span style="color: #000000">"</span><span style="color: #000000">;<br /> <img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align="top" alt="" />        cmds[</span><span style="color: #000000">1</span><span style="color: #000000">] </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">/C</span><span style="color: #000000">"</span><span style="color: #000000">;<br /> <img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align="top" alt="" />        cmds[</span><span style="color: #000000">2</span><span style="color: #000000">]</span><span style="color: #000000">=</span><span style="color: #000000">commandBuf.toString();<br /> <img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align="top" alt="" />        Process process</span><span style="color: #000000">=</span><span style="color: #000000">Runtime.getRuntime().exec(cmds);<br /> <img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align="top" alt="" />        </span><span style="color: #0000ff">boolean</span><span style="color: #000000"> shouldClose</span><span style="color: #000000">=</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br /> <img id="Codehighlighter1_187_459_Open_Image" onclick="this.style.display='none'; Codehighlighter1_187_459_Open_Text.style.display='none'; Codehighlighter1_187_459_Closed_Image.style.display='inline'; Codehighlighter1_187_459_Closed_Text.style.display='inline';" src="http://m.tkk7.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_187_459_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_187_459_Closed_Text.style.display='none'; Codehighlighter1_187_459_Open_Image.style.display='inline'; Codehighlighter1_187_459_Open_Text.style.display='inline';" src="http://m.tkk7.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">try</span><span style="color: #000000"> </span><span id="Codehighlighter1_187_459_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://m.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_187_459_Open_Text"><span style="color: #000000">{<br /> <img src="http://m.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />            InputStreamReader isr </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> InputStreamReader(process.getErrorStream());<br /> <img src="http://m.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />            BufferedReader br </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> BufferedReader(isr);<br /> <img src="http://m.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />            String line </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;<br /> <img id="Codehighlighter1_377_455_Open_Image" onclick="this.style.display='none'; Codehighlighter1_377_455_Open_Text.style.display='none'; Codehighlighter1_377_455_Closed_Image.style.display='inline'; Codehighlighter1_377_455_Closed_Text.style.display='inline';" src="http://m.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_377_455_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_377_455_Closed_Text.style.display='none'; Codehighlighter1_377_455_Open_Image.style.display='inline'; Codehighlighter1_377_455_Open_Text.style.display='inline';" src="http://m.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />            </span><span style="color: #0000ff">while</span><span style="color: #000000"> ((line </span><span style="color: #000000">=</span><span style="color: #000000"> br.readLine()) </span><span style="color: #000000">!=</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">)</span><span id="Codehighlighter1_377_455_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://m.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_377_455_Open_Text"><span style="color: #000000">{<br /> <img id="Codehighlighter1_409_450_Open_Image" onclick="this.style.display='none'; Codehighlighter1_409_450_Open_Text.style.display='none'; Codehighlighter1_409_450_Closed_Image.style.display='inline'; Codehighlighter1_409_450_Closed_Text.style.display='inline';" src="http://m.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_409_450_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_409_450_Closed_Text.style.display='none'; Codehighlighter1_409_450_Open_Image.style.display='inline'; Codehighlighter1_409_450_Open_Text.style.display='inline';" src="http://m.tkk7.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />                </span><span style="color: #0000ff">if</span><span style="color: #000000">(line.indexOf(</span><span style="color: #000000">"</span><span style="color: #000000">错误</span><span style="color: #000000">"</span><span style="color: #000000">)</span><span style="color: #000000">!=-</span><span style="color: #000000">1</span><span style="color: #000000">)</span><span id="Codehighlighter1_409_450_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://m.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_409_450_Open_Text"><span style="color: #000000">{<br /> <img src="http://m.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />                    shouldClose</span><span style="color: #000000">=</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /> <img src="http://m.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />                    </span><span style="color: #0000ff">break</span><span style="color: #000000">;<br /> <img src="http://m.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />                }</span></span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />            }</span></span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />        }</span></span><span style="color: #000000"> <br /> <img id="Codehighlighter1_488_513_Open_Image" onclick="this.style.display='none'; Codehighlighter1_488_513_Open_Text.style.display='none'; Codehighlighter1_488_513_Closed_Image.style.display='inline'; Codehighlighter1_488_513_Closed_Text.style.display='inline';" src="http://m.tkk7.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_488_513_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_488_513_Closed_Text.style.display='none'; Codehighlighter1_488_513_Open_Image.style.display='inline'; Codehighlighter1_488_513_Open_Text.style.display='inline';" src="http://m.tkk7.com/Images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (IOException ioe) </span><span id="Codehighlighter1_488_513_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://m.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_488_513_Open_Text"><span style="color: #000000">{<br /> <img src="http://m.tkk7.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />            shouldClose</span><span style="color: #000000">=</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /> <img src="http://m.tkk7.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />        }</span></span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align="top" alt="" />        </span><span style="color: #0000ff">if</span><span style="color: #000000">(shouldClose)<br /> <img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align="top" alt="" />            process.destroy();<br /> <img src="http://m.tkk7.com/Images/OutliningIndicators/None.gif" align="top" alt="" />        </span><span style="color: #0000ff">int</span><span style="color: #000000"> exitVal </span><span style="color: #000000">=</span><span style="color: #000000"> process.waitFor();<br /> <br />         下面q有一UŞ式:<br /> exp和imp的输出是要从ErrorStream中获取,q是我以前写?<br /> Process proc = null; <br /> try <br /> { <br /> proc = Runtime.getRuntime().exec(cmd.toString()); <br /> InputStream istr = proc.getErrorStream(); <br /> BufferedReader br = new BufferedReader(new InputStreamReader(istr)); <br /> String str; <br /> while ((str=br.readLine()) != null) <br /> { <br /> errorInfo.append(str + "\n"); <br /> } <br /> proc.waitFor(); <br /> } <br /> catch (Exception e) <br /> { <br /> ... <br /> } <br /> if (proc.exitValue() == 0) <br /> { <br /> proc.destroy(); <br /> return true; <br /> } <br /> else <br /> { <br /> if(logger.isDebugEnabled()) <br /> logger.debug(errorInfo); <br /> proc.destroy(); <br /> return false; <br /> } <br /> 两者可以比较的看看<br /> 注意Q在执行oracle的expӞ出现了一个很怪的现象Q就是exp在console输出的信息没有被攑օInputStreamQ反而是攑ֈ了ErrorStream?即正确的情况也?Q这导致了按照正常的情况去写这D代码的话反而会出问题?--q是在jdk1.4环境下实现的?br /> <br /> <br /> <br /> q有中徏议是在jdk1.5环境下:可以如下实现<br /> 1Q把对InputStream的处理放C个单独Thread里面?<br /> 2Q用ProcessBuilder的redirectErrorStream来合qOutputStream和ErrorStream。注意子q程的InputStream对应父进E的OutStream。如果不合ƈq两个流的话则必dƈ行排I它们,序的排IZD思烦?<br /> </span> <img src ="http://m.tkk7.com/forgood/aggbug/207623.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/forgood/" target="_blank">forgood</a> 2008-06-13 11:57 <a href="http://m.tkk7.com/forgood/archive/2008/06/13/207623.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://js06vip.com" target="_blank">պƷרվ</a>| <a href="http://cc006.com" target="_blank">һƵ </a>| <a href="http://arkinbokis.com" target="_blank">޹㽶ˬAVƬþ</a>| <a href="http://cqtchtwq.com" target="_blank">޹V߹ۿ</a>| <a href="http://137499.com" target="_blank">߾Ʒһ </a>| <a href="http://ningxialanh.com" target="_blank">޻Ƭֻѹۿ</a>| <a href="http://www-715111.com" target="_blank">йһëƬƵѿ</a>| <a href="http://zhuguangbaoyu.com" target="_blank">޹ƷƵ</a>| <a href="http://qdhengjun.com" target="_blank">ˬִ̼APP</a>| <a href="http://pengkaimjg.com" target="_blank">պƵ</a>| <a href="http://onisterwines.com" target="_blank">þþþþAŷAV</a>| <a href="http://tzkanglong.com" target="_blank">AVպAV̾ </a>| <a href="http://cndianxian.com" target="_blank">91һ߹ۿ</a>| <a href="http://www-774220.com" target="_blank">mvƷmvձmv</a>| <a href="http://xdxdl.com" target="_blank">ƷƬ߻</a>| <a href="http://www-c559.com" target="_blank">aձѿ</a>| <a href="http://3fsf.com" target="_blank">ŮҹëƬƵ</a>| <a href="http://tiantiantegou.com" target="_blank">˳վ7777Ƶ</a>| <a href="http://8mav958.com" target="_blank">ŷ߹ۿ</a>| <a href="http://bjowj.com" target="_blank">ؼؼŷһ</a>| <a href="http://sdshfengji.com" target="_blank">caopornѹ</a>| <a href="http://yhanalati.com" target="_blank">Ļ߾Ʒ</a>| <a href="http://55xxb.com" target="_blank">ִӲëƬ</a>| <a href="http://koukoub.com" target="_blank">91޾ƷƵ</a>| <a href="http://51ykz.com" target="_blank">һ߹ۿ</a>| <a href="http://5gz0z.com" target="_blank">69ƷƵ</a>| <a href="http://8mav950.com" target="_blank">޾Ʒվ߹ۿ޹</a>| <a href="http://zz773.com" target="_blank">91޾Ʒר</a>| <a href="http://51ykz.com" target="_blank">Ƶ߹ۿѲӰԺ </a>| <a href="http://ddhlj.com" target="_blank">ҹƵվ</a>| <a href="http://www-36664.com" target="_blank">þþƷž޾Ʒ</a>| <a href="http://mlhcd.com" target="_blank">ۺһ뾫Ʒ</a>| <a href="http://cao9999.com" target="_blank">þerƷѹۿ2</a>| <a href="http://www998xe.com" target="_blank">պҹƵ</a>| <a href="http://715686.com" target="_blank">ۺþþ</a>| <a href="http://www62hth.com" target="_blank">ѾƷƵ</a>| <a href="http://www55nana.com" target="_blank">ҹѸƵ</a>| <a href="http://bying100.com" target="_blank">޾Ʒר߲</a>| <a href="http://zanyoo.com" target="_blank">͵͵߳վý </a>| <a href="http://yixinbanks.com" target="_blank">ѿƵվ</a>| <a href="http://xianliwang.com" target="_blank">͵޾Ʒ1ҳ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>