
posted @ 2008-12-16 09:37 追風(fēng)舞者 閱讀(162) | 評論 (0) | 編輯 收藏
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
轉(zhuǎn)載自:www.aygfsteel.com/zhaobin
來自 勤勞的蜜蜂的博客: 來自Phrancol的博客:
來自八進制的博客: 來自羅明的博客: 來自yangbutao的博客: 來自erylee的博客: posted @ 2008-12-11 14:40 追風(fēng)舞者 閱讀(226) | 評論 (0) | 編輯 收藏 剛剛找到的面試題目。自己做了一下,反正挺慘不人睹的。貼出來就想幫幫有需要的人
并且問問為什么是這個結(jié)果呢?有的題的答案真的想不到啊~想不到~ 一、判斷題(30分) 1.Java程序里,創(chuàng)建新的類對象用關(guān)鍵字new,回收無用的類對象使用關(guān)鍵字free。 2.對象可以賦值,只要使用賦值號(等號)即可,相當(dāng)于生成了一個各屬性與賦值對象相同的新對象。 3.有的類定義時可以不定義構(gòu)造函數(shù),所以構(gòu)造函數(shù)不是必需的。 4.類及其屬性、方法可以同時有一個以上的修飾符來修飾。 5.Java的屏幕坐標是以像素為單位,容器的左下角被確定為坐標的起點 6.抽象方法必須在抽象類中,所以抽象類中的方法都必須是抽象方法。 7.Final類中的屬性和方法都必須被final修飾符修飾。 8.最終類不能派生子類,最終方法不能被覆蓋。 9.子類要調(diào)用父類的方法,必須使用super關(guān)鍵字。 10.一個Java類可以有多個父類。 11.如果p是父類Parent的對象,而c是子類Child的對象,則語句c = p是正確的。 12.在java集合中,Vector和HashMap是線程安全的。 13.當(dāng)一個方法在運行過程中產(chǎn)生一個異常,則這個方法會終止,但是整個程序不一定終止運行。 14.接口是特殊的類,所以接口也可以繼承,子接口將繼承父接口的所有常量和抽象方法。 15.用“+”可以實現(xiàn)字符串的拼接,用- 可以從一個字符串中去除一個字符子串。 二、選擇題(30分) 1、關(guān)于垃圾收集的哪些敘述是正確的( ): A.程序開發(fā)者必須自己創(chuàng)建一個線程進行內(nèi)存釋放的工作 B.垃圾收集允許程序開發(fā)者明確指定并立即釋放該內(nèi)存 C.垃圾收集將檢查并釋放不再使用的內(nèi)存 D.垃圾收集能夠在期望的時間釋放被java對象使用的內(nèi)存 2、下面的哪些賦值語句是不正確的( ): A.float f=11.1; B.double d=5.3E12; C.double d=3.14159; D.double d=3.14D; 3、下面關(guān)于變量及其范圍的陳述哪些是不正確的( ): A.實例變量是類的成員變量 B.實例變量用關(guān)鍵字static聲明 C.在方法中定義的局部變量在該方法被執(zhí)行時創(chuàng)建 D.局部變量在使用前必須被初始化 4、下列關(guān)于修飾符混用的說法,錯誤的是( ): A.a(chǎn)bstract不能與final并列修飾同一個類 B.a(chǎn)bstract類中不可以有private的成員 C.a(chǎn)bstract方法必須在abstract類中 D.static方法中能處理非static的屬性 5、容器Panel和Applet缺省使用的布局編輯策略是( ): A、BorderLayout B、FlowLayout C、GridLayout D、CardLayout 6、以下標識符中哪項是不合法的( ): A、 BigMeaninglessName B、$int C、1 st D、$1 7、main方法是Java Application程序執(zhí)行的入口點,關(guān)于main方法的方法頭以下哪項是合法的( ): A、 public static void main() B、 public static void main(String[ ] args) C、 public static int main(String[ ] arg) D、 public void main(String arg[ ]) 8、執(zhí)行完以下代碼int [ ] x = new int[25];后,以下哪項說明是正確的( ): A、 x[24]為0 B、 x[24]未定義 C、 x[25]為0 D、 x[0]為空 9、以下代碼段執(zhí)行后的輸出結(jié)果為( ): int x=3; int y=10; System.out.println(y%x); A、0 B、1 C、2 D、3 10、以下哪個表達式是不合法的( ): A、String x=”Hello”; int y=9; x+=y; B、String x=”Hello”; int y=9; if(x= =y) { } C、String x=”Hello”; int y=9; x=x+y; D、String x=null; int y=(x!=null)&&(x.length()>0) ? x.length : 0 11、編譯運行以下程序后,關(guān)于輸出結(jié)果的說明正確的是 ( ): public class Conditional{ public static void main(String args[ ]){ int x=4; System.out.println(“value is “+ ((x>4) ? 99.9 :9)); } } A、 輸出結(jié)果為:value is 99.99 B、 輸出結(jié)果為:value is 9 C、 輸出結(jié)果為:value is 9.0 D、 編譯錯誤 12、以下聲明合法的是( ): A、 default String s; B、 public final static native int w( ) C、 abstract double d; D、 abstract final double hyperbolicCosine( ) 13、關(guān)于以下application的說明,正確的是( ): 1. class StaticStuff 2. { 3. static int x=10; 4. static { x+=5;} 5. public static void main(String args[ ]) 6. { 7. System.out.println(“x=” + x); 8. } 9. static { x/=3;} 10. } A、 4行與9行不能通過編譯,因為缺少方法名和返回類型 B、 9行不能通過編譯,因為只能有一個靜態(tài)初始化器 C、 編譯通過,執(zhí)行結(jié)果為:x=5 D、編譯通過,執(zhí)行結(jié)果為:x=3 14、關(guān)于以下程序代碼的說明正確的是( ): 1.class HasStatic{ 2. private static int x=100; 3. public static void main(String args[ ]){ 4. HasStatic hs1=new HasStatic( ); 5. hs1.x++; 6. HasStatic hs2=new HasStatic( ); 7. hs2.x++; 8. hs1=new HasStatic( ); 9. hs1.x++; 10. HasStatic.x- -; 11. System.out.println(“x=”+x); 12. } 13.} A、5行不能通過編譯,因為引用了私有靜態(tài)變量 B、10行不能通過編譯,因為x是私有靜態(tài)變量 C、程序通過編譯,輸出結(jié)果為:x=103 D、程序通過編譯,輸出結(jié)果為:x=102 15、以下選項中循環(huán)結(jié)構(gòu)合法的是( ): A、while (int i<7){ i++; System.out.println(“i is “+i); } B、int j=3; while(j){ System.out.println(“ j is “+j); } C、int j=0; for(int k=0; j + k !=10; j++,k++){ System.out.println(“ j is “+ j + “k is”+ k); } D、int j=0; do{ System.out.println( “j is “+j++); if (j = = 3) {continue loop;} }while (j<10); 三、簡答題(40分) 1. 寫出下列程序的運行結(jié)果 public class Cat { void mi( ) throws NullPointerException { System.out.println( “Cat mi mi .. “ ); } } public class SmallCat extends Cat {int i=8; void mi( ) throws Exception { System.out.println( “SmallCat mi mi .. “ ); } public static void main( String[] a ) throws Exception { Cat cat = new SmallCat(); cat.mi(); } } 寫出下列程序的運行結(jié)果 interface Playable { void play(); } interface Bounceable { void play(); } interface Rollable extends Playable, Bounceable { Ball ball = new Ball("PingPang"); } class Ball implements Rollable { private String name; public String getName() { return name; } public Ball(String name) { this.name = name; } public void play() { ball = new Ball("Football"); System.out.println(ball.getName()); } } 寫出下列程序的運行結(jié)果 class Value{ public int i = 15; } public class Test{ public static void main(String argv[]){ Test t = new Test(); t.first(); } public void first(){ int i = 5; Value v = new Value(); v.i = 25; second(v, i); System.out.println(v.i); } public void second(Value v, int i){ i = 0; v.i = 20; Value val = new Value(); v = val; System.out.println(v.i + " " + i); } } 寫出下列程序的運行結(jié)果 class MyThread extends Thread{ public void run(){ System.out.println("MyThread: run()"); } public void start(){ System.out.println("MyThread: start()"); } } class MyRunnable implements Runnable{ public void run(){ System.out.println("MyRunnable: run()"); } public void start(){ System.out.println("MyRunnable: start()"); } } public class MyTest { public static void main(String args[]){ MyThread myThread = new MyThread(); MyRunnable myRunnable = new MyRunnable(); Thread thread = new Thread(myRunnable); myThread.start(); thread.start(); } } posted @ 2008-12-03 09:57 追風(fēng)舞者 閱讀(398) | 評論 (0) | 編輯 收藏 一、參考資料:
二、基本概念 1、堆(Heap) JVM管理的內(nèi)存叫堆。在32Bit操作系統(tǒng)上有1.5G-2G的限制,而64Bit的就沒有。 JVM初始分配的內(nèi)存由-Xms指定,默認是物理內(nèi)存的1/64但小于1G。 JVM最大分配的內(nèi)存由-Xmx指定,默認是物理內(nèi)存的1/4但小于1G。 默認空余堆內(nèi)存小于40%時,JVM就會增大堆直到-Xmx的最大限制,可以由-XX:MinHeapFreeRatio=指定。 服務(wù)器一般設(shè)置-Xms、-Xmx相等以避免在每次GC 后調(diào)整堆的大小,所以上面的兩個參數(shù)沒啥用。
2.基本收集算法
可見,沒有免費的午餐,無論采用復(fù)制還是標記清除算法,自動的東西都要付出很大的性能代價。 3.分代 分代是Java垃圾收集的一大亮點,根據(jù)對象的生命周期長短,把堆分為3個代:Young,Old和Permanent,根據(jù)不同代的特點采用不同的收集算法,揚長避短也。 Young(Nursery),年輕代。研究表明大部分對象都是朝生暮死,隨生隨滅的。因此所有收集器都為年輕代選擇了復(fù)制算法。 Young的默認值為4M,隨堆內(nèi)存增大,約為1/15,JVM會根據(jù)情況動態(tài)管理其大小變化。 Young的大小非常非常重要,見“后面暫停時間優(yōu)先收集器”的論述。 Young里面又分為3個區(qū)域,一個Eden,所有新建對象都會存在于該區(qū),兩個Survivor區(qū),用來實施復(fù)制算法。每次復(fù)制就是將Eden和第一塊Survior的活對象復(fù)制到第2塊,然后清空Eden與第一塊Survior。Eden與Survivor的比例由-XX:SurvivorRatio=設(shè)置,默認為32。Survivio大了會浪費,小了的話,會使一些年輕對象潛逃到老人區(qū),引起老人區(qū)的不安,但這個參數(shù)對性能并不重要。 Old(Tenured),年老代。年輕代的對象如果能夠挺過數(shù)次收集,就會進入老人區(qū)。老人區(qū)使用標記整理算法。因為老人區(qū)的對象都沒那么容易死的,采用復(fù)制算法就要反復(fù)的復(fù)制對象,很不合算,只好采用標記清理算法,但標記清理算法其實也不輕松,每次都要遍歷區(qū)域內(nèi)所有對象,所以還是沒有免費的午餐啊。 -XX:MaxTenuringThreshold=設(shè)置熬過年輕代多少次收集后移入老人區(qū),CMS中默認為0,熬過第一次GC就轉(zhuǎn)入,可以用-XX:+PrintTenuringDistribution查看。 Permanent,持久代。裝載Class信息等基礎(chǔ)數(shù)據(jù),默認64M,如果是類很多很多的服務(wù)程序,需要加大其設(shè)置-XX:MaxPermSize=,否則它滿了之后會引起fullgc()或Out of Memory。 注意Spring,Hibernate這類喜歡AOP動態(tài)生成類的框架需要更多的持久代內(nèi)存。 4.minor/major collection 每個代滿了之后都會促發(fā)collection,(另外Concurrent Low Pause Collector默認在老人區(qū)68%的時候促發(fā))。GC用較高的頻率對young進行掃描和回收,這種叫做minor collection。 5.小結(jié) Young -- minor collection -- 復(fù)制算法 Old(Tenured) -- major colletion -- 標記清除/標記整理算法
三、收集器 1.古老的串行收集器(Serial Collector) 使用 -XX:+UseSerialGC,策略為年輕代串行復(fù)制,年老代串行標記整理。 2.吞吐量優(yōu)先的并行收集器(Throughput Collector) 使用 -XX:+UseParallelGC ,也是JDK5 -server的默認值。策略為: 所以需要2+的CPU時才會優(yōu)于串行收集器,適用于后臺處理,科學(xué)計算。 可以使用-XX:MaxGCPauseMillis= 和 -XX:GCTimeRatio 來調(diào)整GC的時間。 3.暫停時間優(yōu)先的并發(fā)收集器(Concurrent Low Pause Collector-CMS) 前面說了這么多,都是為了這節(jié)做鋪墊...... 使用-XX:+UseConcMarkSweepGC,策略為: 3.1 年老代詳述 并行(Parallel)與并發(fā)(Concurrent)僅一字之差,并行指多條垃圾收集線程并行,并發(fā)指用戶線程與垃圾收集線程并發(fā),程序在繼續(xù)運行,而垃圾收集程序運行于另一個個CPU上。 并發(fā)收集一開始會很短暫的停止一次所有線程來開始初始標記根對象,然后標記線程與應(yīng)用線程一起并發(fā)運行,最后又很短的暫停一次,多線程并行的重新標記之前可能因為并發(fā)而漏掉的對象,然后就開始與應(yīng)用程序并發(fā)的清除過程。可見,最長的兩個遍歷過程都是與應(yīng)用程序并發(fā)執(zhí)行的,比以前的串行算法改進太多太多了!!! 串行標記清除是等年老代滿了再開始收集的,而并發(fā)收集因為要與應(yīng)用程序一起運行,如果滿了才收集,應(yīng)用程序就無內(nèi)存可用,所以系統(tǒng)默認68%滿的時候就開始收集。內(nèi)存已設(shè)得較大,吃內(nèi)存又沒有這么快的時候,可以用-XX:CMSInitiatingOccupancyFraction=恰當(dāng)增大該比率。 3.2 年輕代詳述 可惜對年輕代的復(fù)制收集,依然必須停止所有應(yīng)用程序線程,原理如此,只能靠多CPU,多收集線程并發(fā)來提高收集速度,但除非你的Server獨占整臺服務(wù)器,否則如果服務(wù)器上本身還有很多其他線程時,切換起來速度就..... 所以,搞到最后,暫停時間的瓶頸就落在了年輕代的復(fù)制算法上。 因此Young的大小設(shè)置挺重要的,大點就不用頻繁GC,而且增大GC的間隔后,可以讓多點對象自己死掉而不用復(fù)制了。但Young增大時,GC造成的停頓時間攀升得非常恐怖,比如在我的機器上,默認8M的Young,只需要幾毫秒的時間,64M就升到90毫秒,而升到256M時,就要到300毫秒了,峰值還會攀到恐怖的800ms。誰叫復(fù)制算法,要等Young滿了才開始收集,開始收集就要停止所有線程呢。 3.3 持久代 可設(shè)置-XX:+CMSClassUnloadingEnabled 4.增量(train算法)收集器(Incremental Collector) 已停止維護,–Xincgc選項默認轉(zhuǎn)為并發(fā)收集器。 四、暫停時間顯示 加入下列參數(shù) (請將PrintGC和Details中間的空格去掉,CSDN很怪的認為是禁止字句)
會程序運行過程中將顯示如下輸出 9.211: [GC 9.211: [ParNew: 7994K->0K(8128K), 0.0123935 secs] 427172K->419977K(524224K), 0.0125728 secs] 顯示在程序運行的9.211秒發(fā)生了Minor的垃圾收集,前一段數(shù)據(jù)針對新生區(qū),從7994k整理為0k,新生區(qū)總大小為8128k,程序暫停了12ms,而后一段數(shù)據(jù)針對整個堆。 對于年老代的收集,暫停發(fā)生在下面兩個階段,CMS-remark的中斷是17毫秒: [GC [1 CMS-initial-mark: 80168K(196608K)] 81144K(261184K), 0.0059036 secs] [1 CMS-remark: 80168K(196608K)] 82493K(261184K),0.0168943 secs] 再加兩個參數(shù) -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime對暫停時間看得更清晰。 五、真正不停的BEA JRockit 與Sun RTS2.0 Bea的JRockit 5.0 R27 的特色之一是動態(tài)決定的垃圾收集策略,用戶可以決定自己關(guān)心的是吞吐量,暫停時間還是確定的暫停時間,再由JVM在運行時動態(tài)決定、改變改變垃圾收集策略。 最可惜JRockt的license很奇怪,雖然平時使用免費,但這個30ms的選項就需要購買整個Weblogic Real Time Server的license。 其他免費選項,有:
JavaOne2007上有Sun的 Java Real-Time System 2.0 的介紹,RTS2.0基于JDK1.5,在Real-Time Garbage Collctor上又有改進,但還在beta版狀態(tài),只供給OEM,更怪。 六、JDK 6.0的改進 因為JDK5.0在Young較大時的表現(xiàn)還是不夠讓人滿意,又繼續(xù)看JDK6.0的改進,結(jié)果稍稍失望,不涉及我最頭痛的年輕代復(fù)制收集改良。 1.年老代的標識-清除收集,并行執(zhí)行標識 2.加大了Young區(qū)的默認大小 3.System.gc()可以與應(yīng)用程序并發(fā)執(zhí)行 七、小結(jié) 1. JDK5.0/6.0 對于服務(wù)器應(yīng)用,我們使用Concurrent Low Pause Collector,對年輕代,暫停時多線程并行復(fù)制收集;對年老代,收集器與應(yīng)用程序并行標記--整理收集,以達到盡量短的垃圾收集時間。 本著沒有深刻測試前不要胡亂優(yōu)化的宗旨,命令行屬性只需簡單寫為: ![]() 然后要根據(jù)應(yīng)用的情況,在測試軟件輔助可以下看看有沒有JVM的默認值和自動管理做的不夠的地方可以調(diào)整,如-xmn 設(shè)Young的大小,-XX:MaxPermSize設(shè)持久代大小等。 2. JRockit 6.0 R27.2 但因為JDK5的測試結(jié)果實在不能滿意,后來又嘗試了JRockit,總體效果要好些。 ![]() posted @ 2008-12-03 09:51 追風(fēng)舞者 閱讀(221) | 評論 (0) | 編輯 收藏 1.垃圾收集算法的核心思想 Java語言建立了垃圾收集機制,用以跟蹤正在使用的對象和發(fā)現(xiàn)并回收不再使用(引用)的對象。該機制可以有效防范動態(tài)內(nèi)存分配中可能發(fā)生的兩個危險:因內(nèi)存垃圾過多而引發(fā)的內(nèi)存耗盡,以及不恰當(dāng)?shù)膬?nèi)存釋放所造成的內(nèi)存非法引用。 垃圾收集算法的核心思想是:對虛擬機可用內(nèi)存空間,即堆空間中的對象進行識別,如果對象正在被引用,那么稱其為存活對象,反之,如果對象不再被引用,則為垃圾對象,可以回收其占據(jù)的空間,用于再分配。垃圾收集算法的選擇和垃圾收集系統(tǒng)參數(shù)的合理調(diào)節(jié)直接影響著系統(tǒng)性能,因此需要開發(fā)人員做比較深入的了解。 2.觸發(fā)主GC(Garbage Collector)的條件 JVM進行次GC的頻率很高,但因為這種GC占用時間極短,所以對系統(tǒng)產(chǎn)生的影響不大。更值得關(guān)注的是主GC的觸發(fā)條件,因為它對系統(tǒng)影響很明顯。總的來說,有兩個條件會觸發(fā)主GC: ①當(dāng)應(yīng)用程序空閑時,即沒有應(yīng)用線程在運行時,GC會被調(diào)用。因為GC在優(yōu)先級最低的線程中進行,所以當(dāng)應(yīng)用忙時,GC線程就不會被調(diào)用,但以下條件除外。 ②Java堆內(nèi)存不足時,GC會被調(diào)用。當(dāng)應(yīng)用線程在運行,并在運行過程中創(chuàng)建新對象,若這時內(nèi)存空間不足,JVM就會強制地調(diào)用GC線程,以便回收內(nèi)存用于新的分配。若GC一次之后仍不能滿足內(nèi)存分配的要求,JVM會再進行兩次GC作進一步的嘗試,若仍無法滿足要求,則 JVM將報“out of memory”的錯誤,Java應(yīng)用將停止。 由于是否進行主GC由JVM根據(jù)系統(tǒng)環(huán)境決定,而系統(tǒng)環(huán)境在不斷的變化當(dāng)中,所以主GC的運行具有不確定性,無法預(yù)計它何時必然出現(xiàn),但可以確定的是對一個長期運行的應(yīng)用來說,其主GC是反復(fù)進行的。 3.減少GC開銷的措施 根據(jù)上述GC的機制,程序的運行會直接影響系統(tǒng)環(huán)境的變化,從而影響GC的觸發(fā)。若不針對GC的特點進行設(shè)計和編碼,就會出現(xiàn)內(nèi)存駐留等一系列負面影響。為了避免這些影響,基本的原則就是盡可能地減少垃圾和減少GC過程中的開銷。具體措施包括以下幾個方面: (1)不要顯式調(diào)用System.gc() 此函數(shù)建議JVM進行主GC,雖然只是建議而非一定,但很多情況下它會觸發(fā)主GC,從而增加主GC的頻率,也即增加了間歇性停頓的次數(shù)。 (2)盡量減少臨時對象的使用 臨時對象在跳出函數(shù)調(diào)用后,會成為垃圾,少用臨時變量就相當(dāng)于減少了垃圾的產(chǎn)生,從而延長了出現(xiàn)上述第二個觸發(fā)條件出現(xiàn)的時間,減少了主GC的機會。 (3)對象不用時最好顯式置為Null 一般而言,為Null的對象都會被作為垃圾處理,所以將不用的對象顯式地設(shè)為Null,有利于GC收集器判定垃圾,從而提高了GC的效率。 (4)盡量使用StringBuffer,而不用String來累加字符串(詳見blog另一篇文章JAVA中String與StringBuffer) 由于String是固定長的字符串對象,累加String對象時,并非在一個String對象中擴增,而是重新創(chuàng)建新的String對象,如Str5=Str1+Str2+Str3+Str4,這條語句執(zhí)行過程中會產(chǎn)生多個垃圾對象,因為對次作“+”操作時都必須創(chuàng)建新的String對象,但這些過渡對象對系統(tǒng)來說是沒有實際意義的,只會增加更多的垃圾。避免這種情況可以改用StringBuffer來累加字符串,因StringBuffer是可變長的,它在原有基礎(chǔ)上進行擴增,不會產(chǎn)生中間對象。 (5)能用基本類型如Int,Long,就不用Integer,Long對象 基本類型變量占用的內(nèi)存資源比相應(yīng)對象占用的少得多,如果沒有必要,最好使用基本變量。 (6)盡量少用靜態(tài)對象變量 靜態(tài)變量屬于全局變量,不會被GC回收,它們會一直占用內(nèi)存。 (7)分散對象創(chuàng)建或刪除的時間 集中在短時間內(nèi)大量創(chuàng)建新對象,特別是大對象,會導(dǎo)致突然需要大量內(nèi)存,JVM在面臨這種情況時,只能進行主GC,以回收內(nèi)存或整合內(nèi)存碎片,從而增加主GC的頻率。集中刪除對象,道理也是一樣的。它使得突然出現(xiàn)了大量的垃圾對象,空閑空間必然減少,從而大大增加了下一次創(chuàng)建新對象時強制主GC的機會。 4.gc與finalize方法 ⑴gc方法請求垃圾回收 使用System.gc()可以不管JVM使用的是哪一種垃圾回收的算法,都可以請求Java的垃圾回收。需要注意的是,調(diào)用System.gc()也僅僅是一個請求。JVM接受這個消息后,并不是立即做垃圾回收,而只是對幾個垃圾回收算法做了加權(quán),使垃圾回收操作容易發(fā)生,或提早發(fā)生,或回收較多而已。 ⑵finalize方法透視垃圾收集器的運行 在JVM垃圾收集器收集一個對象之前 ,一般要求程序調(diào)用適當(dāng)?shù)姆椒ㄡ尫刨Y源,但在沒有明確釋放資源的情況下,Java提供了缺省機制來終止化該對象釋放資源,這個方法就是finalize()。它的原型為: protected void finalize() throws Throwable 在finalize()方法返回之后,對象消失,垃圾收集開始執(zhí)行。原型中的throws Throwable表示它可以拋出任何類型的異常。 因此,當(dāng)對象即將被銷毀時,有時需要做一些善后工作。可以把這些操作寫在finalize()方法里。
java 代碼
⑶代碼示例 java 代碼
5.Java 內(nèi)存泄漏 考慮下面的程序,在ObjStack類中,使用push和pop方法來管理堆棧中的對象。兩個方法中的索引(index)用于指示堆棧中下一個可用位置。push方法存儲對新對象的引用并增加索引值,而pop方法減小索引值并返回堆棧最上面的元素。在main方法中,創(chuàng)建了容量為64的棧,并64次調(diào)用push方法向它添加對象,此時index的值為64,隨后又32次調(diào)用pop方法,則index的值變?yōu)?2,出棧意味著在堆棧中的空間應(yīng)該被收集。但事實上,pop方法只是減小了索引值,堆棧仍然保持著對那些對象的引用。故32個無用對象不會被GC回收,造成了內(nèi)存滲漏。
java 代碼
6.如何消除內(nèi)存泄漏 雖然Java虛擬機(JVM)及其垃圾收集器(garbage collector,GC)負責(zé)管理大多數(shù)的內(nèi)存任務(wù),Java軟件程序中還是有可能出現(xiàn)內(nèi)存泄漏。實際上,這在大型項目中是一個常見的問題。避免內(nèi)存泄漏的第一步是要弄清楚它是如何發(fā)生的。本文介紹了編寫Java代碼的一些常見的內(nèi)存泄漏陷阱,以及編寫不泄漏代碼的一些最佳實踐。一旦發(fā)生了內(nèi)存泄漏,要指出造成泄漏的代碼是非常困難的。因此本文還介紹了一種新工具,用來診斷泄漏并指出根本原因。該工具的開銷非常小,因此可以使用它來尋找處于生產(chǎn)中的系統(tǒng)的內(nèi)存泄漏。 垃圾收集器的作用 雖然垃圾收集器處理了大多數(shù)內(nèi)存管理問題,從而使編程人員的生活變得更輕松了,但是編程人員還是可能犯錯而導(dǎo)致出現(xiàn)內(nèi)存問題。簡單地說,GC循環(huán)地跟蹤所有來自“根”對象(堆棧對象、靜態(tài)對象、JNI句柄指向的對象,諸如此類)的引用,并將所有它所能到達的對象標記為活動的。程序只可以操縱這些對象;其他的對象都被刪除了。因為GC使程序不可能到達已被刪除的對象,這么做就是安全的。 雖然內(nèi)存管理可以說是自動化的,但是這并不能使編程人員免受思考內(nèi)存管理問題之苦。例如,分配(以及釋放)內(nèi)存總會有開銷,雖然這種開銷對編程人員來說是不可見的。創(chuàng)建了太多對象的程序?qū)韧瓿赏瑯拥墓δ芏鴦?chuàng)建的對象卻比較少的程序更慢一些(在其他條件相同的情況下)。 而且,與本文更為密切相關(guān)的是,如果忘記“釋放”先前分配的內(nèi)存,就可能造成內(nèi)存泄漏。如果程序保留對永遠不再使用的對象的引用,這些對象將會占用并耗盡內(nèi)存,這是因為自動化的垃圾收集器無法證明這些對象將不再使用。正如我們先前所說的,如果存在一個對對象的引用,對象就被定義為活動的,因此不能刪除。為了確保能回收對象占用的內(nèi)存,編程人員必須確保該對象不能到達。這通常是通過將對象字段設(shè)置為null或者從集合(collection)中移除對象而完成的。但是,注意,當(dāng)局部變量不再使用時,沒有必要將其顯式地設(shè)置為null。對這些變量的引用將隨著方法的退出而自動清除。 概括地說,這就是內(nèi)存托管語言中的內(nèi)存泄漏產(chǎn)生的主要原因:保留下來卻永遠不再使用的對象引用。 典型泄漏 既然我們知道了在Java中確實有可能發(fā)生內(nèi)存泄漏,就讓我們來看一些典型的內(nèi)存泄漏及其原因。 全局集合 在大的應(yīng)用程序中有某種全局的數(shù)據(jù)儲存庫是很常見的,例如一個JNDI樹或一個會話表。在這些情況下,必須注意管理儲存庫的大小。必須有某種機制從儲存庫中移除不再需要的數(shù)據(jù)。 這可能有多種方法,但是最常見的一種是周期性運行的某種清除任務(wù)。該任務(wù)將驗證儲存庫中的數(shù)據(jù),并移除任何不再需要的數(shù)據(jù)。 另一種管理儲存庫的方法是使用反向鏈接(referrer)計數(shù)。然后集合負責(zé)統(tǒng)計集合中每個入口的反向鏈接的數(shù)目。這要求反向鏈接告訴集合何時會退出入口。當(dāng)反向鏈接數(shù)目為零時,該元素就可以從集合中移除了。 緩存 緩存是一種數(shù)據(jù)結(jié)構(gòu),用于快速查找已經(jīng)執(zhí)行的操作的結(jié)果。因此,如果一個操作執(zhí)行起來很慢,對于常用的輸入數(shù)據(jù),就可以將操作的結(jié)果緩存,并在下次調(diào)用該操作時使用緩存的數(shù)據(jù)。 緩存通常都是以動態(tài)方式實現(xiàn)的,其中新的結(jié)果是在執(zhí)行時添加到緩存中的。典型的算法是: 檢查結(jié)果是否在緩存中,如果在,就返回結(jié)果。 如果結(jié)果不在緩存中,就進行計算。 將計算出來的結(jié)果添加到緩存中,以便以后對該操作的調(diào)用可以使用。 該算法的問題(或者說是潛在的內(nèi)存泄漏)出在最后一步。如果調(diào)用該操作時有相當(dāng)多的不同輸入,就將有相當(dāng)多的結(jié)果存儲在緩存中。很明顯這不是正確的方法。 為了預(yù)防這種具有潛在破壞性的設(shè)計,程序必須確保對于緩存所使用的內(nèi)存容量有一個上限。因此,更好的算法是: 檢查結(jié)果是否在緩存中,如果在,就返回結(jié)果。 如果結(jié)果不在緩存中,就進行計算。 如果緩存所占的空間過大,就移除緩存最久的結(jié)果。 將計算出來的結(jié)果添加到緩存中,以便以后對該操作的調(diào)用可以使用。 通過始終移除緩存最久的結(jié)果,我們實際上進行了這樣的假設(shè):在將來,比起緩存最久的數(shù)據(jù),最近輸入的數(shù)據(jù)更有可能用到。這通常是一個不錯的假設(shè)。 新算法將確保緩存的容量處于預(yù)定義的內(nèi)存范圍之內(nèi)。確切的范圍可能很難計算,因為緩存中的對象在不斷變化,而且它們的引用包羅萬象。為緩存設(shè)置正確的大小是一項非常復(fù)雜的任務(wù),需要將所使用的內(nèi)存容量與檢索數(shù)據(jù)的速度加以平衡。 解決這個問題的另一種方法是使用java.lang.ref.SoftReference類跟蹤緩存中的對象。這種方法保證這些引用能夠被移除,如果虛擬機的內(nèi)存用盡而需要更多堆的話。 ClassLoader Java ClassLoader結(jié)構(gòu)的使用為內(nèi)存泄漏提供了許多可乘之機。正是該結(jié)構(gòu)本身的復(fù)雜性使ClassLoader在內(nèi)存泄漏方面存在如此多的問題。ClassLoader的特別之處在于它不僅涉及“常規(guī)”的對象引用,還涉及元對象引用,比如:字段、方法和類。這意味著只要有對字段、方法、類或ClassLoader的對象的引用,ClassLoader就會駐留在JVM中。因為ClassLoader本身可以關(guān)聯(lián)許多類及其靜態(tài)字段,所以就有許多內(nèi)存被泄漏了。 確定泄漏的位置 通常發(fā)生內(nèi)存泄漏的第一個跡象是:在應(yīng)用程序中出現(xiàn)了OutOfMemoryError。這通常發(fā)生在您最不愿意它發(fā)生的生產(chǎn)環(huán)境中,此時幾乎不能進行調(diào)試。有可能是因為測試環(huán)境運行應(yīng)用程序的方式與生產(chǎn)系統(tǒng)不完全相同,因而導(dǎo)致泄漏只出現(xiàn)在生產(chǎn)中。在這種情況下,需要使用一些開銷較低的工具來監(jiān)控和查找內(nèi)存泄漏。還需要能夠無需重啟系統(tǒng)或修改代碼就可以將這些工具連接到正在運行的系統(tǒng)上。可能最重要的是,當(dāng)進行分析時,需要能夠斷開工具而保持系統(tǒng)不受干擾。 雖然OutOfMemoryError通常都是內(nèi)存泄漏的信號,但是也有可能應(yīng)用程序確實正在使用這么多的內(nèi)存;對于后者,或者必須增加JVM可用的堆的數(shù)量,或者對應(yīng)用程序進行某種更改,使它使用較少的內(nèi)存。但是,在許多情況下,OutOfMemoryError都是內(nèi)存泄漏的信號。一種查明方法是不間斷地監(jiān)控GC的活動,確定內(nèi)存使用量是否隨著時間增加。如果確實如此,就可能發(fā)生了內(nèi)存泄漏。 posted @ 2008-12-03 09:41 追風(fēng)舞者 閱讀(1311) | 評論 (1) | 編輯 收藏 public class Search {
/** * 前提條件array數(shù)組已排序 */ public static boolean binarySearch(int[] array, int target) { boolean result = false; int bottom = 0; int top = array.length-1; while (bottom <= top) { int mid = (top + bottom) / 2; if (target == array[mid]) { result = true; break; } else if (target < array[mid]) { top = mid - 1; } else if (target > array[mid]) { bottom = mid + 1; } } return result; } public static void main(String[] args) { int [] array = {1,3,5,7,9,10}; boolean result = binarySearch(array, 10); System.out.println(result); } } posted @ 2008-10-10 16:19 追風(fēng)舞者 閱讀(217) | 評論 (0) | 編輯 收藏 import java.io.BufferedReader;
import java.io.IOException; import java.io.InputStreamReader; public class Hanoi { public static void main(String[] args) throws NumberFormatException, IOException { System.out.print("請輸入盤數(shù):"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); move(n, 'A', 'B', 'C'); } /** * 將n個盤子借助b,從 a 移到 c */ public static void move(int n, char a, char b, char c) { if (n == 1) System.out.println("盤 " + n + " 由 " + a + " 移至 " + c); else { move(n - 1, a, c, b); System.out.println("盤 " + n + " 由 " + a + " 移至 " + c); move(n - 1, b, a, c); } } } posted @ 2008-10-10 15:56 追風(fēng)舞者 閱讀(204) | 評論 (0) | 編輯 收藏 public class Sort {
public static void quickSort(int[] array) { quickSort(array, 0, array.length - 1); } private static void quickSort(int[] array, int low, int high) { if (low < high) { int p = partition(array, low, high); quickSort(array, low, p - 1); quickSort(array, p + 1, high); } } private static int partition(int[] array, int low, int high) { int s = array[high]; int i = low - 1; for (int j = low; j < high; j++) { if (array[j] < s) { i++; swap(array, i, j); } } swap(array, ++i, high); return i; } private static void swap(int[] array, int i, int j) { int temp; temp = array[i]; array[i] = array[j]; array[j] = temp; } public static void main(String[] args) { int [] array = {2,5,3,7,4}; quickSort(array); for(int i = 0;i<array.length;i++){ System.out.println(array[i]); } } } posted @ 2008-10-10 15:39 追風(fēng)舞者 閱讀(2061) | 評論 (4) | 編輯 收藏 在Ubuntu 8.04中查看顯卡是否裝好
運行g(shù)lxinfo | grep rendering 如果顯示”direct rendering: Yes”,則已安裝 1、下載驅(qū)動 我下載的就是NVIDIA-Linux-x86_64-173.14.12-pkg2.run這個文件,下載后放到home目錄下吧。 2、刪除原驅(qū)動包 sudo apt-get -–purge remove nvidia-glx nvidia-glx-new 然后刪除 /lib/linux-restricted-modules/2.6.22-14-generic/文件夾下面帶有nvidia字樣的內(nèi)容,注意里面有一個隱藏文件.nvidia-new-installer也要刪掉 這里是內(nèi)核自帶的驅(qū)動 再檢查一下這兩個文件是否存在,/etc/init.d/nvidia-glx /etc/init.d/nvidia-kernel 如果存在,刪除掉。 3、安裝要用到的軟件 sudo apt-get install build-essential pkg-config xserver-xorg-dev linux-headers-`uname -r` 安裝編譯包。 我在安裝的時候提示說沒有l(wèi)ib,驅(qū)動安裝時候要安裝Kernel Interface,如果采用自己編譯的方式則要求系統(tǒng)中有l(wèi)ibc的源碼。我想一般人都是沒有的,呵呵。這個時候我們可以在安裝驅(qū)動之前先自己把這個源碼給安裝好,問題就解決了。如何安裝?呵呵,更簡單,強大的 apt install阿, 運行: sudo apt-get install libc6-dev 一行命令搞定。 4、備份 備份文件是一個好習(xí)慣。 sudo cp /etc/default/linux-restricted-modules-common ~/linux-restricted-modules-common.backup sudo cp /etc/X11/xorg.conf ~/xorg.conf.backup 5、禁止系統(tǒng)使用默認的驅(qū)動 sudo gedit /etc/default/linux-restricted-modules-common 在最后的雙引號中添加nv nvidia_new,即把文件中的“”,改成“nv nvidia_new” 如果前面第二步刪除完整了其實也可以不用執(zhí)行這一步。 6、將后面的操作記錄在紙上,因為后面會完全在終端字符界面下操作。 7、停止GDM進程 sudo /etc/init.d/gdm stop 按Ctrl+Alt+F1,登錄后進入第7步。 8、安裝驅(qū)動 進入下好的驅(qū)動所在目錄 執(zhí)行:sudo sh ./NVIDIA-Linux-x86_64-173.14.12-pkg2.run 安裝過程中 如果提示有舊驅(qū)動,詢問是否刪除舊驅(qū)動,選Yes; 如果提示缺少某某模塊(modules),詢問是否上網(wǎng)下載,選no; 如果提示編譯模塊,詢問是否進行編譯,選ok; 如果提示將要修改Xorg.conf,詢問是否允許,選Yes; 接下來就是等待安裝完成。 9、安裝完成就回到終端,重啟GDM sudo /etc/init.d/gdm restart 如果失敗,就重啟機子:sudo shutdown -r now 好了,當(dāng)看到NV的logo后,才表示安裝成功。 如果不想看NVIDIA的LOGO,可以修改 /etc/X11/xorg.conf 在Section “Device”中添加Option “NoLogo” “True” 如: Section “Device” Identifier “通用顯示卡” Driver “nvidia” Option “NoLogo” “True” EndSection 10.顯示高級設(shè)置 如果想進行顯示方面的高級設(shè)置,在終端下輸入:nvidia-settings命令。 左邊第二項是設(shè)置分辨率(server display configuration),從右邊的resolution中選擇分辨率,再點擊apply, 預(yù)覽一下,不好取消就行了。 至此,安裝完畢。 如果御載的話就用這個命令 sh NVIDIA-Linux-x86_64-173.14.12-pkg2.run –uninstall 安裝成功,就這么簡單,一般nvidia 會自動配置好所有~` 重新配置x server: sudo apt-get install pkg-config xserver-xorg-dev3 sudo dpkg-reconfigure xserver-xorg posted @ 2008-09-19 13:23 追風(fēng)舞者 閱讀(514) | 評論 (0) | 編輯 收藏 安裝MySQL sudo apt-get install mysql-server 這個應(yīng)該很簡單了,而且我覺得大家在安裝方面也沒什么太大問題,所以也就不多說了,下面我們來講講配置。 配置MySQL 注意,在Ubuntu下MySQL缺省是只允許本地訪問的,如果你要其他機器也能夠訪問的話,那么需要改變/etc/mysql/my.cnf配置文件了!下面我們一步步地來: 默認的MySQL安裝之后根用戶是沒有密碼的,所以首先用根用戶進入: $mysql -u root 在這里之所以用-u root是因為我現(xiàn)在是一般用戶(firehare),如果不加-u root的話,mysql會以為是firehare在登錄。注意,我在這里沒有進入根用戶模式,因為沒必要。一般來說,對mysql中的數(shù)據(jù)庫進行操作, 根本沒必要進入根用戶模式,只有在設(shè)置時才有這種可能。 進入mysql之后,最要緊的就是要設(shè)置Mysql中的root用戶密碼了,否則,Mysql服務(wù)無安全可言了。 mysql> GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY "123456"; 注意,我這兒用的是123456做為root用戶的密碼,但是該密碼是不安全的,請大家最好使用大小寫字母與數(shù)字混合的密碼,且不少于8位。 這樣的話,就設(shè)置好了MySQL中的root用戶密碼了,然后就用root用戶建立你所需要的數(shù)據(jù)庫。我這里就以xoops為例: mysql>CREATE DATABASE xoops; mysql>GRANT ALL PRIVILEGES ON xoops.* TO xoops_root@localhost IDENTIFIED BY "654321"; 這樣就建立了一個xoops_roots的用戶,它對數(shù)據(jù)庫xoops有著全部權(quán)限。以后就用xoops_root來對xoops數(shù)據(jù)庫進行管理,而無需要再用root用戶了,而該用戶的權(quán)限也只被限定在xoops數(shù)據(jù)庫中。 如果你想進行遠程訪問或控制,那么你要做兩件事: 其一: mysql>GRANT ALL PRIVILEGES ON xoops.* TO xoops_root@"%" IDENTIFIED BY "654321"; 允許xoops_root用戶可以從任意機器上登入MySQL。 其二: $sudo gedit /etc/mysql/my.cnf 老的版本中 >skip-networking => # skip-networking 新的版本中 >bind-address=127.0.0.1 => bind-address= 你機器的IP 這樣就可以允許其他機器訪問MySQL了。posted @ 2008-09-18 17:53 追風(fēng)舞者 閱讀(183) | 評論 (0) | 編輯 收藏 Ubuntu8.04開啟3D桌面特效與設(shè)置方法Ubuntu 8.04 (Hardy Heron) 中集成了強大3D交互界面,Ubuntu 的 3D桌面特效給用戶帶來了一種全新的視覺用戶。想必有很多朋友也因為看到了 Ubuntu 8.04 那炫目的 3D 桌面特效才開始慢慢地了解Ubuntu 8.04 (Hardy Heron) 的。雖然在這之前也不少的朋友寫過設(shè)置 Ubuntu 閱讀全文 類別:Ubuntu 查看評論 文章來源:http://hi.baidu.com/whchensiyuan/blog/item/75a0ddbe9e308d0c18d81fd5.html posted @ 2008-09-18 12:28 追風(fēng)舞者 閱讀(530) | 評論 (0) | 編輯 收藏 Ubuntu 8.04加源安裝Google Gadgets
Google Gadgets是一套跨平臺的桌面工具集,for Linux版本剛剛公布不久。 在ubuntu 8.04中: 編輯源文件:
加入下面兩行:
類別:Ubuntu 查看評論 文章來源:http://hi.baidu.com/whchensiyuan/blog/item/0c2bec1ebdef9a0c314e15bf.html posted @ 2008-09-18 12:28 追風(fēng)舞者 閱讀(101) | 評論 (0) | 編輯 收藏
很多新手面臨的困難和困惑都出現(xiàn)在編譯和打包軟件方面,unubtu的apt-get方式的確很易用,但是也屏蔽了學(xué)習(xí)的空間,對于那些希望好好學(xué)習(xí)linux的而又感到困惑的人,通過以下三個程序的幫助,應(yīng)該可以有效的減輕你的負擔(dān):
第一個,checkinstall 安裝命令:sudo apt-get install checkinstall 程序功能:能跟蹤由“make install”或類似命令安裝的所有文件,并為這些文件創(chuàng)建Slackware、RPM或者Debian安裝包,然后把它添加到已安裝軟件包數(shù)據(jù)庫中,以 閱讀全文 類別:默認分類 查看評論 文章來源:http://hi.baidu.com/whchensiyuan/blog/item/ac02403c7db675e83c6d9745.html posted @ 2008-09-18 12:28 追風(fēng)舞者 閱讀(130) | 評論 (0) | 編輯 收藏
Linux常用命令詳解
來源: LUPA開源社區(qū) 發(fā)布時間: 2007-05-27 05:34 版權(quán)申明 字體: 小 中 大 [點擊圖片可在新窗口打開] 文章來源于http://www.lupaworld.com Linux之所以受到廣大計算機愛好者的喜愛,主要原因有兩個,首先它是自由軟件,用戶不用支付費用就可以使用它,并可根據(jù)自己的需要對它進行修改。另外,它具有Unix的全部功能,任何使用Unix系統(tǒng)或想要學(xué)習(xí)Unix系統(tǒng)的人都可以從中獲益。 讓我們一起從每一個命令開始,走向Linux高手之路吧。 1.Linux進入與退出系 閱讀全文 類別:默認分類 查看評論 文章來源:http://hi.baidu.com/whchensiyuan/blog/item/8a8b9ad58836ab07a08bb74e.html posted @ 2008-09-18 12:28 追風(fēng)舞者 閱讀(148) | 評論 (0) | 編輯 收藏
ubuntu中默認的是gnome桌面,也可以為你的程序設(shè)置快捷方式。
可以以兩種方式生成快捷方式,這里叫做起動器:命令行方式和拖動程序圖標的方式。這里以Lumaqq為例說明之。 1.在應(yīng)用程序菜單中創(chuàng)建起動器: 在命令行中輸入如下命令: sudo gedit /usr/share/applications/LumaQQ.desktop //sudo是以超級用戶權(quán)限執(zhí)行后面命令 //gedit是打開文本編輯器,后面的路徑標識要編輯的文件 //在/usr/share/applications目錄下可以看到許多*.desktop的文件,都是應(yīng)用程序的起動器,所以上述 閱讀全文 類別:默認分類 查看評論 文章來源:http://hi.baidu.com/whchensiyuan/blog/item/df1445e695411c28b83820f4.html posted @ 2008-09-18 12:28 追風(fēng)舞者 閱讀(121) | 評論 (0) | 編輯 收藏
已經(jīng)有一些熱心人寫了Compiz Fusion的設(shè)置指南,但大多是在7.10版下面的,現(xiàn)在系統(tǒng)升級成8.04后,CompizConfig設(shè)置管理器的內(nèi)容有些不同,我等新手摸索了幾天,小有心得,奉獻給大家,寫得有點羅嗦,清見諒。
點擊 系統(tǒng)->首選項->Advanced Desktop Effects Settings 打開CompizConfig設(shè)置管理器(即CCSM) 1、3D桌面設(shè)置:點擊General options,把Desktop Size選項卡里的“Horizontal Virtual Size(水平虛擬大小)”設(shè)置為4,“Vertical Virtual Size(垂直虛擬大小)”設(shè)置為 閱讀全文 類別:默認分類 查看評論 文章來源:http://hi.baidu.com/whchensiyuan/blog/item/43e981eef1e8fee9cf1b3e4a.html posted @ 2008-09-18 12:28 追風(fēng)舞者 閱讀(231) | 評論 (0) | 編輯 收藏 Linux之所以受到廣大計算機愛好者的喜愛,主要原因有兩個,首先它是自由軟件,用戶不用支付費用就可以使用它,并可根據(jù)自己的需要對它進行修改。另外,它具有Unix的全部功能,任何使用Unix系統(tǒng)或想要學(xué)習(xí)Unix系統(tǒng)的人都可以從中獲益。
讓我們一起從每一個命令開始,走向Linux高手之路吧。 1.Linux進入與退出系統(tǒng) 進入Linux系統(tǒng): 必須要輸入用戶的賬號,在系統(tǒng)安裝過程中可以創(chuàng)建以下兩種帳號: 1.root--超級用戶帳號(系統(tǒng)管理員),使用這個帳號可以在系統(tǒng)中做任何事情。 2.普通用戶--這個帳號供普通用戶使用,可以進行有限的操作。 一般的Linux使用者均為普通用戶,而系統(tǒng)管理員一般使用超級用戶帳號完成一些系統(tǒng)管理的工作。如果只需要完成一些由普通帳號就能完成的任務(wù),建議不要使用超級用戶帳號,以免無意中破壞系統(tǒng)。影響系統(tǒng)的正常運行。 用戶登錄分兩步:第一步,輸入用戶的登錄名,系統(tǒng)根據(jù)該登錄名識別用戶;第二步,輸入用戶的口令,該口令是用戶自己設(shè)置的一個字符串,對其他用戶是保密的,是在登錄時系統(tǒng)用來辨別真假用戶的關(guān)鍵字。 當(dāng)用戶正確地輸入用戶名和口令后,就能合法地進入系統(tǒng)。屏幕顯示: [root@loclhost /root] # 這時就可以對系統(tǒng)做各種操作了。注意超級用戶的提示符是“#”,其他用戶的提示符是“$”。 修改口令 為了更好的保護用戶帳號的安全,Linux允許用戶隨時修改自己的口令,修改口令的命令是passwd,它將提示用戶輸入舊口令和新口令,之后還要求用戶再次確認新口令,以避免用戶無意中按錯鍵。如果用戶忘記了口令,可以向系統(tǒng)管理員申請為自己重新設(shè)置一個。 虛擬控制臺 Linux是一個真正的多用戶操作系統(tǒng),它可以同時接受多個用戶登錄。Linux還允許一個用戶進行多次登錄,這是因為Linux和UNIX一樣,提供了 虛擬控制臺的訪問方式,允許用戶在同一時間從控制臺進行多次登錄。虛擬控制臺的選擇可以通過按下Alt鍵和一個功能鍵來實現(xiàn),通常使用F1-F6例如,用 戶登錄后,按一下Alt-F2鍵,用戶又可以看到"login:"提示符,說明用戶看到了第二個虛擬控制臺。然后只需按Alt-F1鍵,就可以回到第一個 虛擬控制臺。一個新安裝的Linux系統(tǒng)默認允許用戶使用Alt-F1到Alt-F6鍵來訪問前六個虛擬控制臺。虛擬控制臺可使用戶同時在多個控制臺上工 作,真正體現(xiàn) Linux系統(tǒng)多用戶的特性。用戶可以在某一虛擬控制臺上進行的工作尚未結(jié)束時,切換到另一虛擬控制臺開始另一項工作。 退出系統(tǒng) 不論是超級用戶,還是普通用戶,需要退出系統(tǒng)時,在shell提示符下,鍵入exit命令即可。 Linux文件的復(fù)制、刪除和移動命令 cp命令 該命令的功能是將給出的文件或目錄拷貝到另一文件或目錄中,同MSDOS下的copy命令一樣,功能十分強大。 語法: cp [選項] 源文件或目錄 目標文件或目錄 說明:該命令把指定的源文件復(fù)制到目標文件或把多個源文件復(fù)制到目標目錄中。 該命令的各選項含義如下: - a 該選項通常在拷貝目錄時使用。它保留鏈接、文件屬性,并遞歸地拷貝目錄,其作用等于dpR選項的組合。 - d 拷貝時保留鏈接。 - f 刪除已經(jīng)存在的目標文件而不提示。 - i 和f選項相反,在覆蓋目標文件之前將給出提示要求用戶確認。回答y時目標文件將被覆蓋,是交互式拷貝。 - p 此時cp除復(fù)制源文件的內(nèi)容外,還將把其修改時間和訪問權(quán)限也復(fù)制到新文件中。 - r 若給出的源文件是一目錄文件,此時cp將遞歸復(fù)制該目錄下所有的子目錄和文件。此時目標文件必須為一個目錄名。 - l 不作拷貝,只是鏈接文件。 需要說明的是,為防止用戶在不經(jīng)意的情況下用cp命令破壞另一個文件,如用戶指定的目標文件名已存在,用cp命令拷貝文件后,這個文件就會被新源文件覆蓋,因此,建議用戶在使用cp命令拷貝文件時,最好使用i選項。 mv命令 用戶可以使用mv命令來為文件或目錄改名或?qū)⑽募梢粋€目錄移入另一個目錄中。該命令如同MSDOS下的ren和move的組合。 語法:mv [選項] 源文件或目錄 目標文件或目錄 說明:視mv命令中第二個參數(shù)類型的不同(是目標文件還是目標目錄),mv命令將文件重命名或?qū)⑵湟浦烈粋€新的目錄中。當(dāng)?shù)诙€參數(shù)類型是文件時,mv 命令完成文件重命名,此時,源文件只能有一個(也可以是源目錄名),它將所給的源文件或目錄重命名為給定的目標文件名。當(dāng)?shù)诙€參數(shù)是已存在的目錄名稱 時,源文件或目錄參數(shù)可以有多個,mv命令將各參數(shù)指定的源文件均移至目標目錄中。在跨文件系統(tǒng)移動文件時,mv先拷貝,再將原有文件刪除,而鏈至該文件 的鏈接也將丟失。 命令中各選項的含義為: - I 交互方式操作。如果mv操作將導(dǎo)致對已存在的目標文件的覆蓋,此時系統(tǒng)詢問是否重寫,要求用戶回答y或n,這樣可以避免誤覆蓋文件。 - f 禁止交互操作。在mv操作要覆蓋某已有的目標文件時不給任何指示,指定此選項后,i選項將不再起作用。 如果所給目標文件(不是目錄)已存在,此時該文件的內(nèi)容將被新文件覆蓋。為防止用戶用mv命令破壞另一個文件,使用mv命令移動文件時,最好使用i選項。 rm命令 用戶可以用rm命令刪除不需要的文件。該命令的功能為刪除一個目錄中的一個或多個文件或目錄,它也可以將某個目錄及其下的所有文件及子目錄均刪除。對于鏈接文件,只是斷開了鏈接,原文件保持不變。 rm命令的一般形式為: rm [選項] 文件… 如果沒有使用- r選項,則rm不會刪除目錄。 該命令的各選項含義如下: - f 忽略不存在的文件,從不給出提示。 - r 指示rm將參數(shù)中列出的全部目錄和子目錄均遞歸地刪除。 - i 進行交互式刪除。 使用rm命令要小心。因為一旦文件被刪除,它是不能被恢復(fù)的。了防止這種情況的發(fā)生,可以使用i選項來逐個確認要刪除的文件。如果用戶輸入y,文件將被刪除。如果輸入任何其他東西,文件則不會刪除。 Linux目錄的創(chuàng)建與刪除命令 mkdir命令 功能:創(chuàng)建一個目錄(類似MSDOS下的md命令)。 語法:mkdir [選項] dir-name 說明:該命令創(chuàng)建由dir-name命名的目錄。要求創(chuàng)建目錄的用戶在當(dāng)前目錄中(dir-name的父目錄中)具有寫權(quán)限,并且dirname不能是當(dāng)前目錄中已有的目錄或 文件名稱。 命令中各選項的含義為: - m 對新建目錄設(shè)置存取權(quán)限。也可以用chmod命令設(shè)置。 - p 可以是一個路徑名稱。此時若路徑中的某些目錄尚不存在, 加上此選項后, 系統(tǒng)將自動建立好那些尚不存在的目錄,即一次可以建立多個目錄。 rmdir 命令 功能:刪除空目錄。 語法:rmdir [選項] dir-name 說明:dir-name表示目錄名。該命令從一個目錄中刪除一個或多個子目錄項。需要 特別注意的是,一個目錄被刪除之前必須是空的。rm - r dir命令可代替 rmdir,但是有危險性。刪除某目錄時也必須具有對父目錄的寫權(quán)限。 命令中各選項的含義為: - p 遞歸刪除目錄dirname,當(dāng)子目錄刪除后其父目錄為空時,也一同被刪除。如果整個路徑被刪除或者由于某種原因保留部分路徑,則系統(tǒng)在標準輸出上顯示相應(yīng) 的信息。 cd 命令 功能:改變工作目錄。 語法:cd [directory] 說明:該命令將當(dāng)前目錄改變至directory所指定的目錄。若沒有指定directory, 則回到用戶的主目錄。為了改變到指定目錄,用戶必須擁有對指定目錄的執(zhí)行和讀 權(quán)限。 該命令可以使用通配符(通配符含義請參見第十章)。 pwd 命令 在Linux層次目錄結(jié)構(gòu)中,用戶可以在被授權(quán)的任意目錄下利用mkdir命令創(chuàng)建新目錄,也可以利用cd命令從一個目錄轉(zhuǎn)換到另一個目錄。然而,沒有提示符來告知用 戶目前處于哪一個目錄中。要想知道當(dāng)前所處的目錄,可以使用pwd命令,該命令顯示整個路徑名。 語法:pwd 說明:此命令顯示出當(dāng)前工作目錄的絕對路徑。 ls 命令 ls是英文單詞list的簡寫,其功能為列出目錄的內(nèi)容。這是用戶最常用的一個命令之一,因為用戶需要不時地查看某個目錄的內(nèi)容。該命令類似于DOS下的dir命令。 語法:ls [選項] [目錄或是文件] 對于每個目錄,該命令將列出其中的所有子目錄與文件。對于每個文件,ls將輸出 其文件名以及所要求的其他信息。默認情況下,輸出條目按字母順序排序。當(dāng)未給出目錄名或是文件名時,就顯示當(dāng)前目錄的信息。 命令中各選項的含義如下: - a 顯示指定目錄下所有子目錄與文件,包括隱藏文件。 - A 顯示指定目錄下所有子目錄與文件,包括隱藏文件。但不列出“.”和 “..”。 - b 對文件名中的不可顯示字符用八進制逃逸字符顯示。 - c 按文件的修改時間排序。 - C 分成多列顯示各項。 - d 如果參數(shù)是目錄,只顯示其名稱而不顯示其下的各文件。往往與l選項一起使 用,以得到目錄的詳細信息。 - f 不排序。該選項將使lts選項失效,并使aU選項有效。 - F 在目錄名后面標記“/”,可執(zhí)行文件后面標記“*”,符號鏈接后面標記 “@”,管道(或FIFO)后面標記“|”,socket文件后面標記“=”。 - i 在輸出的第一列顯示文件的i節(jié)點號。 - l 以長格式來顯示文件的詳細信息。這個選項最常用。 每行列出的信息依次是: 文件類型與權(quán)限 鏈接數(shù) 文件屬主 文件屬組 文件大小 建立或最近修改的時間 名字 對于符號鏈接文件,顯示的文件名之后有“—〉”和引用文件路徑名。 對于設(shè)備文件,其“文件大小”字段顯示主、次設(shè)備號,而不是文件大小。 目錄中的總塊數(shù)顯示在長格式列表的開頭,其中包含間接塊。 - L 若指定的名稱為一個符號鏈接文件,則顯示鏈接所指向的文件。 - m 輸出按字符流格式,文件跨頁顯示,以逗號分開。 - n 輸出格式與l選項相同,只不過在輸出中文件屬主和屬組是用相應(yīng)的UID號和 GID號來表示,而不是實際的名稱。 - o 與l選項相同,只是不顯示擁有者信息。 - p 在目錄后面加一個“/”。 - q 將文件名中的不可顯示字符用“?”代替。 - r 按字母逆序或最早優(yōu)先的順序顯示輸出結(jié)果。 - R 遞歸式地顯示指定目錄的各個子目錄中的文件。 - s 給出每個目錄項所用的塊數(shù),包括間接塊。 - t 顯示時按修改時間(最近優(yōu)先)而不是按名字排序。若文件修改時間相同,則 按字典順序。修改時間取決于是否使用了c或u選頂。缺省的時間標記是最后一次修 改時間。 - u 顯示時按文件上次存取的時間(最近優(yōu)先)而不是按名字排序。即將-t的時間 標記修改為最后一次訪問的時間。 - x 按行顯示出各排序項的信息。 用ls - l命令顯示的信息中,開頭是由10個字符構(gòu)成的字符串,其中第一個字符表示文件類型,它可以是下述類型之一: - 普通文件 d 目錄 l 符號鏈接 b 塊設(shè)備文件 c 字符設(shè)備文件 后面的9個字符表示文件的訪問權(quán)限,分為3組,每組3位。 第一組表示文件屬主的權(quán)限,第二組表示同組用戶的權(quán)限,第三組表示其他用戶的權(quán)限。每一組的三個字 符分別表示對文件的讀、寫和執(zhí)行權(quán)限。 各權(quán)限如下所示: r 讀 w 寫 x 執(zhí)行。對于目錄,表示進入權(quán)限。 s 當(dāng)文件被執(zhí)行時,把該文件的UID或GID賦予執(zhí)行進程的UID(用戶ID)或GID(組 ID)。 t 設(shè)置標志位(留在內(nèi)存,不被換出)。如果該文件是目錄,在該目錄中的文件只能被超級用戶、目錄擁有者或文件屬主刪除。如果它是可執(zhí)行文件,在該文件執(zhí)行 后,指向其正文段的指針仍留在內(nèi)存。這樣再次執(zhí)行它時,系統(tǒng)就能更快地裝入該文件。 Linux文本處理命令 sort命令 sort命令的功能是對文件中的各行進行排序。sort命令有許多非常實用的選項,這些選項最初是用來對數(shù)據(jù)庫格式的文件內(nèi)容進行各種排序操作的。實際上,sort命令可以被認為是一個非常強大的數(shù)據(jù)管理工具,用來管理內(nèi)容類似數(shù)據(jù)庫記錄的文件。 Sort命令將逐行對文件中的內(nèi)容進行排序,如果兩行的首字符相同,該命令將繼續(xù)比較這兩行的下一字符,如果還相同,將繼續(xù)進行比較。 語法: sort [選項] 文件 說明:sort命令對指定文件中所有的行進行排序,并將結(jié)果顯示在標準輸出上。如不指定輸入文件或使用“- ”,則表示排序內(nèi)容來自標準輸入。 sort排序是根據(jù)從輸入行抽取的一個或多個關(guān)鍵字進行比較來完成的。排序關(guān)鍵字定義了用來排序的最小的字符序列。缺省情況下以整行為關(guān)鍵字按ASCII字符順序進行排序。 改變?nèi)笔≡O(shè)置的選項主要有: - m 若給定文件已排好序,合并文件。 - c 檢查給定文件是否已排好序,如果它們沒有都排好序,則打印一個出錯信息,并以狀態(tài)值1退出。 - u 對排序后認為相同的行只留其中一行。 - o 輸出文件 將排序輸出寫到輸出文件中而不是標準輸出,如果輸出文件是輸入文件之一,sort先將該文件的內(nèi)容寫入一個臨時文件,然后再排序和寫輸出結(jié)果。 改變?nèi)笔∨判蛞?guī)則的選項主要有: - d 按字典順序排序,比較時僅字母、數(shù)字、空格和制表符有意義。 - f 將小寫字母與大寫字母同等對待。 - I 忽略非打印字符。 - M 作為月份比較:“JAN”<“FEB” - r 按逆序輸出排序結(jié)果。 +posl - pos2 指定一個或幾個字段作為排序關(guān)鍵字,字段位置從posl開始,到pos2為止(包括posl,不包括pos2)。如不指定pos2,則關(guān)鍵字為從posl到行尾。字段和字符的位置從0開始。 - b 在每行中尋找排序關(guān)鍵字時忽略前導(dǎo)的空白(空格和制表符)。 - t separator 指定字符separator作為字段分隔符。 uniq命令 文件經(jīng)過處理后在它的輸出文件中可能會出現(xiàn)重復(fù)的行。例如,使用cat命令將兩個文件合并后,再使用sort命令進行排序,就可能出現(xiàn)重復(fù)行。這時可以使用uniq命令將這些重復(fù)行從輸出文件中刪除,只留下每條記錄的唯一樣本。 語法: uniq [選項] 文件 說明:這個命令讀取輸入文件,并比較相鄰的行。在正常情況下,第二個及以后更多個重復(fù)行將被刪去,行比較是根據(jù)所用字符集的排序序列進行的。該命令加工后的結(jié)果寫到輸出文件中。輸入文件和輸出文件必須不同。如果輸入文件用“- ”表示,則從標準輸入讀取。 該命令各選項含義如下: - c 顯示輸出中,在每行行首加上本行在文件中出現(xiàn)的次數(shù)。它可取代- u和- d選項。 - d 只顯示重復(fù)行。 - u 只顯示文件中不重復(fù)的各行。 - n 前n個字段與每個字段前的空白一起被忽略。一個字段是一個非空格、非制表符的字符串,彼此由制表符和空格隔開(字段從0開始編號)。 +n 前n個字符被忽略,之前的字符被跳過(字符從0開始編號)。 - f n 與- n相同,這里n是字段數(shù)。 - s n 與+n相同,這里n是字符數(shù)。 Linux備份與壓縮命令 tar命令 tar可以為文件和目錄創(chuàng)建檔案。利用tar,用戶可以為某一特定文件創(chuàng)建檔案(備份文件),也可以在檔案中改變文件,或者向檔案中加入新的文件。 tar最初被用來在磁帶上創(chuàng)建檔案,現(xiàn)在,用戶可以在任何設(shè)備上創(chuàng)建檔案,如軟盤。利用tar命令,可以把一大堆的文件和目錄全部打包成一個文件,這對于 備份文件或?qū)讉€文件組合成為一個文件以便于網(wǎng)絡(luò)傳輸是非常有用的。Linux上的tar是GNU版本的。 語法:tar [主選項+輔選項] 文件或者目錄 使用該命令時,主選項是必須要有的,它告訴tar要做什么事情,輔選項是輔助使用的,可以選用。 主選項: c 創(chuàng)建新的檔案文件。如果用戶想備份一個目錄或是一些文件,就要選擇這個選項。 r 把要存檔的文件追加到檔案文件的未尾。例如用戶已經(jīng)作好備份文件,又發(fā)現(xiàn)還有一個目錄或是一些文件忘記備份了,這時可以使用該選項,將忘記的目錄或文件追加到備份文件中。 t 列出檔案文件的內(nèi)容,查看已經(jīng)備份了哪些文件。 u 更新文件。就是說,用新增的文件取代原備份文件,如果在備份文件中找不到要更新的文件,則把它追加到備份文件的最后。 x 從檔案文件中釋放文件。 輔助選項: b 該選項是為磁帶機設(shè)定的。其后跟一數(shù)字,用來說明區(qū)塊的大小,系統(tǒng)預(yù)設(shè)值為20(20*512 bytes)。 f 使用檔案文件或設(shè)備,這個選項通常是必選的。 k 保存已經(jīng)存在的文件。例如我們把某個文件還原,在還原的過程中,遇到相同的文件,不會進行覆蓋。 m 在還原文件時,把所有文件的修改時間設(shè)定為現(xiàn)在。 M 創(chuàng)建多卷的檔案文件,以便在幾個磁盤中存放。 v 詳細報告tar處理的文件信息。如無此選項,tar不報告文件信息。 w 每一步都要求確認。 z 用gzip來壓縮/解壓縮文件,加上該選項后可以將檔案文件進行壓縮,但還原時也一定要使用該選項進行解壓縮。 gzip命令 減少文件大小有兩個明顯的好處,一是可以減少存儲空間,二是通過網(wǎng)絡(luò)傳輸文件時,可以減少傳輸?shù)臅r間。gzip是在Linux系統(tǒng)中經(jīng)常使用的一個對文件進行壓縮和解壓縮的命令,既方便又好用。 語法:gzip [選項] 壓縮(解壓縮)的文件名 各選項的含義: -c 將輸出寫到標準輸出上,并保留原有文件。 -d 將壓縮文件解壓。 -l 對每個壓縮文件,顯示下列字段: 壓縮文件的大小 未壓縮文件的大小 壓縮比 未壓縮文件的名字 -r 遞歸式地查找指定目錄并壓縮其中的所有文件或者是解壓縮。 -t 測試,檢查壓縮文件是否完整。 -v 對每一個壓縮和解壓的文件,顯示文件名和壓縮比。 -num 用指定的數(shù)字num調(diào)整壓縮的速度,-1或--fast表示最快壓縮方法(低壓縮比),-9或--best表示最慢壓縮方法(高壓縮比)。系統(tǒng)缺省值為6。 unzip命令 用MS Windows下的壓縮軟件winzip壓縮的文件如何在Linux系統(tǒng)下展開呢?可以用unzip命令,該命令用于解擴展名為.zip的壓縮文件。 語法:unzip [選項] 壓縮文件名.zip 各選項的含義分別為: -x 文件列表 解壓縮文件,但不包括指定的file文件。 -v 查看壓縮文件目錄,但不解壓。 -t 測試文件有無損壞,但不解壓。 -d 目錄 把壓縮文件解到指定目錄下。 -z 只顯示壓縮文件的注解。 -n 不覆蓋已經(jīng)存在的文件。 -o 覆蓋已存在的文件且不要求用戶確認。 -j 不重建文檔的目錄結(jié)構(gòu),把所有文件解壓到同一目錄下。 在Linux環(huán)境下運行DOS命令 Linux系統(tǒng)提供了一組稱為mtools的可移植工具,可以讓用戶輕松地從標準的DOS軟盤上讀、寫文件和目錄。它們對DOS和Linux環(huán)境之間交換 文件非常有用。它們是不具備共同的文件系統(tǒng)格式的系統(tǒng)之間交換文件的有力手段。對于一個MSDOS的軟盤,只要把軟盤放在軟驅(qū)中,就可以利用 mtools提供的命令來訪問軟盤上的文件。 mtools的主要命令如下: mcd 目錄名 改變MSDOS目錄; mcopy 源文件 目標文件 在MSDOS和Unix之間復(fù)制文件; mdel 文件名 刪除MSDOS文件; mdir 目錄名 顯示MSDOS目錄; mformat 驅(qū)動器號 在低級格式化的軟盤上創(chuàng)建MSDOS文件系統(tǒng); rnlabel 驅(qū)動器號 產(chǎn)生MSDOS卷標; mmd 目錄名 建立MSDOS目錄; mrd 目錄名 刪除MSDOS目錄; mren 源文件 目標文件 重新命名已存在的MSDOS文件; mtype 文件名 顯示MSDOS文件的內(nèi)容。 提示:這些命令和對應(yīng)的MSDOS命令非常相似。 Linux改變文件或目錄的訪問權(quán)限命令 Linux系統(tǒng)中的每個文件和目錄都有訪問許可權(quán)限,用它來確定誰可以通過何種方式對文件和目錄進行訪問和操作。 文件或目錄的訪問權(quán)限分為只讀,只寫和可執(zhí)行三種。以文件為例,只讀權(quán)限表示只允許讀其內(nèi)容,而禁止對其做任何的更改操作。可執(zhí)行權(quán)限表示允許將該文件作 為一個程序執(zhí)行。文件被創(chuàng)建時,文件所有者自動擁有對該文件的讀、寫和可執(zhí)行權(quán)限,以便于對文件的閱讀和修改。用戶也可根據(jù)需要把訪問權(quán)限設(shè)置為需要的任 何組合。 有三種不同類型的用戶可對文件或目錄進行訪問:文件所有者,同組用戶、其他用戶。所有者一般是文件的創(chuàng)建者。所有者可以允許同組用戶有權(quán)訪問文件,還可以將文件的訪問權(quán)限賦予系統(tǒng)中的其他用戶。在這種情況下,系統(tǒng)中每一位用戶都能訪問該用戶擁有的文件或目錄。 每一文件或目錄的訪問權(quán)限都有三組,每組用三位表示,分別為文件屬主的讀、寫和執(zhí)行權(quán)限;與屬主同組的用戶的讀、寫和執(zhí)行權(quán)限;系統(tǒng)中其他用戶的讀、寫和執(zhí)行權(quán)限。當(dāng)用ls -l命令顯示文件或目錄的詳細信息時,最左邊的一列為文件的訪問權(quán)限。例如: $ ls -l sobsrc. tgz -rw-r--r-- 1 root root 483997 Ju1 l5 17:3l sobsrc. tgz 橫線代表空許可。r代表只讀,w代表寫,x代表可執(zhí)行。注意這里共有10個位置。第一個字符指定了文件類型。在通常意義上,一個目錄也是一個文件。如果第一個字符是橫線,表示是一個非目錄的文件。如果是d,表示是一個目錄。 例如: - rw- r-- r-- 普通文件 文件主 組用戶 其他用戶 是文件sobsrc.tgz 的訪問權(quán)限,表示sobsrc.tgz是一個普通文件;sobsrc.tgz的屬主有讀寫權(quán)限;與sobsrc.tgz屬主同組的用戶只有讀權(quán)限;其他用戶也只有讀權(quán)限。 確定了一個文件的訪問權(quán)限后,用戶可以利用Linux系統(tǒng)提供的chmod命令來重新設(shè)定不同的訪問權(quán)限。也可以利用chown命令來更改某個文件或目錄的所有者。利用chgrp命令來更改某個文件或目錄的用戶組。 下面分別對這些命令加以介紹。 chmod 命令 chmod命令是非常重要的,用于改變文件或目錄的訪問權(quán)限。用戶用它控制文件或目錄的訪問權(quán)限。 該命令有兩種用法。一種是包含字母和操作符表達式的文字設(shè)定法;另一種是包含數(shù)字的數(shù)字設(shè)定法。 1. 文字設(shè)定法 chmod [who] [+ | - | =] [mode] 文件名? 命令中各選項的含義為: 操作對象who可是下述字母中的任一個或者它們的組合: u 表示“用戶(user)”,即文件或目錄的所有者。 g 表示“同組(group)用戶”,即與文件屬主有相同組ID的所有用戶。 o 表示“其他(others)用戶”。 a 表示“所有(all)用戶”。它是系統(tǒng)默認值。 操作符號可以是: + 添加某個權(quán)限。 - 取消某個權(quán)限。 = 賦予給定權(quán)限并取消其他所有權(quán)限(如果有的話)。 設(shè)置mode所表示的權(quán)限可用下述字母的任意組合: r 可讀。 w 可寫。 x 可執(zhí)行。 X 只有目標文件對某些用戶是可執(zhí)行的或該目標文件是目錄時才追加x 屬性。 s 在文件執(zhí)行時把進程的屬主或組ID置為該文件的文件屬主。方式“u+s”設(shè)置文件的用戶ID位,“g+s”設(shè)置組ID位。 t 保存程序的文本到交換設(shè)備上。 u 與文件屬主擁有一樣的權(quán)限。 g 與和文件屬主同組的用戶擁有一樣的權(quán)限。 o 與其他用戶擁有一樣的權(quán)限。 文件名:以空格分開的要改變權(quán)限的文件列表,支持通配符。 在一個命令行中可給出多個權(quán)限方式,其間用逗號隔開。例如:chmod g+r,o+r example 使同組和其他用戶對文件example 有讀權(quán)限。 2. 數(shù)字設(shè)定法 我們必須首先了解用數(shù)字表示的屬性的含義:0表示沒有權(quán)限,1表示可執(zhí)行權(quán)限,2表示可寫權(quán)限,4表示可讀權(quán)限,然后將其相加。所以數(shù)字屬性的格式應(yīng)為3個從0到7的八進制數(shù),其順序是(u)(g)(o)。 例如,如果想讓某個文件的屬主有“讀/寫”二種權(quán)限,需要把4(可讀)+2(可寫)=6(讀/寫)。 數(shù)字設(shè)定法的一般形式為: chmod [mode] 文件名? chgrp命令 功能:改變文件或目錄所屬的組。 語法:chgrp [選項] group filename? 該命令改變指定指定文件所屬的用戶組。其中g(shù)roup可以是用戶組ID,也可以是/etc/group文件中用戶組的組名。文件名是以空格分開的要改變屬組的文件列表,支持通配符。如果用戶不是該文件的屬主或超級用戶,則不能改變該文件的組。 該命令的各選項含義為: - R 遞歸式地改變指定目錄及其下的所有子目錄和文件的屬組。 chown 命令 功能:更改某個文件或目錄的屬主和屬組。這個命令也很常用。例如root用戶把自己的一個文件拷貝給用戶xu,為了讓用戶xu能夠存取這個文件,root用戶應(yīng)該把這個文件的屬主設(shè)為xu,否則,用戶xu無法存取這個文件。 語法:chown [選項] 用戶或組 文件 說明:chown將指定文件的擁有者改為指定的用戶或組。用戶可以是用戶名或用戶ID。組可以是組名或組ID。文件是以空格分開的要改變權(quán)限的文件列表,支持通配符。 該命令的各選項含義如下: - R 遞歸式地改變指定目錄及其下的所有子目錄和文件的擁有者。 - v 顯示chown命令所做的工作。 Linux與用戶有關(guān)的命令 passwd命令 出于系統(tǒng)安全考慮,Linux系統(tǒng)中的每一個用戶除了有其用戶名外,還有其對應(yīng)的用戶口令。因此使用useradd命令增加時,還需使用passwd命令為每一位新增加的用戶設(shè)置口令;用戶以后還可以隨時用passwd命令改變自己的口令。 該命令的一般格式為: passwd [用戶名] 其中用戶名為需要修改口令的用戶名。只有超級用戶可以使用“passwd 用戶名”修改其他用戶的口令,普通用戶只能用不帶參數(shù)的passwd命令修改自己的口令。 該命令的使用方法如下: 輸入 passwd< Enter>; 在(current) UNIX passwd:下輸入當(dāng)前的口令 在new password:提示下輸入新的口令(在屏幕上看不到這個口令): 系統(tǒng)提示再次輸入這個新口令。 輸入正確后,這個新口令被加密并放入/etc/shdow文件。選取一個不易被破譯的口令是很重要的。 選取口令應(yīng)遵守如下規(guī)則: 口令應(yīng)該至少有六位(最好是八位)字符; 口令應(yīng)該是大小寫字母、標點符號和數(shù)字混雜的。 超級用戶修改其他用戶(xxq)的口令的過程如下, # passwd root New UNIX password: Retype new UNIX password: passwd: all authentication tokens updated successfully # su命令 這個命令非常重要。它可以讓一個普通用戶擁有超級用戶或其他用戶的權(quán)限,也可以讓超級用戶以普通用戶的身份做一些事情。普通用戶使用這個命令時必須有超級用戶或其他用戶的口令。如要離開當(dāng)前用戶的身份,可以打exit。 該命令的一般形式為: su [選項] [? ] [使用者帳號] 說明:若沒有指定使用者帳號,則系統(tǒng)預(yù)設(shè)值為超級用戶root。 該命令中各選項的含義分別為: ? c 執(zhí)行一個命令后就結(jié)束。 ? 加了這個減號的目的是使環(huán)境變量和欲轉(zhuǎn)換的用戶相同。 ? m 保留環(huán)境變量不變。 password: 【輸入超級用戶的密碼】 Linux系統(tǒng)管理命令 wall命令 這個命令的功能是對全部已登錄的用戶發(fā)送信息,用戶可以先把要發(fā)送的信息寫好存入一個文件中,然后輸入: # wall < 文件名 這樣就能對所有的用戶發(fā)送信息了。 在上面的例子中符號“<”表示輸入重定向,有關(guān)它的含義和用法請參閱第十章的有關(guān)內(nèi)容。 例如: # wall ‘Thank you!’ Broadcast message from root (tty1) Fri Nov 26 14:15:07 1999… Thank you! # 執(zhí)行以上命令后,用戶的屏幕上顯示出“Thank you!”信息后,并不出現(xiàn)系統(tǒng)提示符$(#),再次按回車鍵后,屏幕出現(xiàn)系統(tǒng)提示符。 write命令 write命令的功能是向系統(tǒng)中某一個用戶發(fā)送信息。 該命令的一般格式為: write 用戶帳號 [終端名稱] 例如: $ write Guest hello 此時系統(tǒng)進入發(fā)送信息狀態(tài),用戶可以輸入要發(fā)送的信息,輸入完畢,希望退出發(fā)送狀態(tài)時,按組合鍵< Ctrl+c>即可。 mesg指令 mesg命令設(shè)定是否允許其他用戶用write命令給自己發(fā)送信息。如果允許別人給自己發(fā)送信息,輸入命令: # mesg y 否則,輸入: # mesg n 對于超級用戶,系統(tǒng)的默認值為 n;而對于一般用戶系統(tǒng)的默認值為y。 如果mesg后不帶任何參數(shù),則顯示當(dāng)前的狀態(tài)是y還是n.。 sync命令 sync命令是在關(guān)閉Linux系統(tǒng)時使用的。用戶需要注意的是,不能用簡單的關(guān)閉電源的方法關(guān)閉系統(tǒng),因為Linux象其他Unix系統(tǒng)一樣,在內(nèi)存中 緩存了許多數(shù)據(jù),在關(guān)閉系統(tǒng)時需要進行內(nèi)存數(shù)據(jù)與硬盤數(shù)據(jù)的同步校驗,保證硬盤數(shù)據(jù)在關(guān)閉系統(tǒng)時是最新的,只有這樣才能確保數(shù)據(jù)不會丟失。一般正常的關(guān)閉 系統(tǒng)的過程是自動進行這些工作的,在系統(tǒng)運行過程中也會定時做這些工作,不需要用戶干預(yù)。 sync命令是強制把內(nèi)存中的數(shù)據(jù)寫回硬盤,以免數(shù)據(jù)的丟失。用戶可以在需要的時候使用此命令。該命令的一般格式為: sync shutdown命令 shutdown 命令可以安全地關(guān)閉或重啟Linux系統(tǒng),它在系統(tǒng)關(guān)閉之前給系統(tǒng)上的所有登錄用戶提示一條警告信息。該命令還允許用戶指定一個時間參數(shù),可以是一個精確 的時間,也可以是從現(xiàn)在開始的一個時間段。精確時間的格式是hh:mm,表示小時和分鐘;時間段由“+”和分鐘數(shù)表示。系統(tǒng)執(zhí)行該命令后,會自動進行數(shù)據(jù) 同步的工作。 該命令的一般格式為: shutdown [選項] [時間] [警告信息] 命令中各選項的含義為: - k 并不真正關(guān)機,而只是發(fā)出警告信息給所有用戶。 - r 關(guān)機后立即重新啟動。 - h 關(guān)機后不重新啟動。 - f 快速關(guān)機,重啟動時跳過fsck。 - n 快速關(guān)機,不經(jīng)過init程序。 - c 取消一個已經(jīng)運行的shutdown。 需要特別說明的是,該命令只能由超級用戶使用。 free命令 free命令的功能是查看當(dāng)前系統(tǒng)內(nèi)存的使用情況,它顯示系統(tǒng)中剩余及已用的物理內(nèi)存和交換內(nèi)存,以及共享內(nèi)存和被核心使用的緩沖區(qū)。 該命令的一般格式為: free [-b | -k | -m] 命令中各選項的含義如下: -b 以字節(jié)為單位顯示。 -k 以K字節(jié)為單位顯示。 -m 以兆字節(jié)為單位顯示。 uptime命令 uptime命令顯示系統(tǒng)已經(jīng)運行了多長時間,它依次顯示下列信息:現(xiàn)在時間、系統(tǒng)已經(jīng)運行了多長時間、目前有多少登錄用戶、系統(tǒng)在過去的1分鐘、5分鐘和15分鐘內(nèi)的平均負載。 該命令的一般格式為: uptime Linux磁盤管理 df命令 功能:檢查文件系統(tǒng)的磁盤空間占用情況。可以利用該命令來獲取硬盤被占用了多少空間,目前還剩下多少空間等信息。 語法:df [選項] 說明:df命令可顯示所有文件系統(tǒng)對i節(jié)點和磁盤塊的使用情況。 該命令各個選項的含義如下: -a 顯示所有文件系統(tǒng)的磁盤使用情況,包括0塊(block)的文件系統(tǒng),如/proc文件系統(tǒng)。 -k 以k字節(jié)為單位顯示。 -i 顯示i節(jié)點信息,而不是磁盤塊。 -t 顯示各指定類型的文件系統(tǒng)的磁盤空間使用情況。 -x 列出不是某一指定類型文件系統(tǒng)的磁盤空間使用情況(與t選項相反)。 -T 顯示文件系統(tǒng)類型。 du命令 du的英文原義為“disk usage”,含義為顯示磁盤空間的使用情況。 功能:統(tǒng)計目錄(或文件)所占磁盤空間的大小。 語法:du [選項] [Names…] 說明:該命令逐級進入指定目錄的每一個子目錄并顯示該目錄占用文件系統(tǒng)數(shù)據(jù)塊(1024字節(jié))的情況。若沒有給出Names,則對當(dāng)前目錄進行統(tǒng)計。 該命令的各個選項含義如下: -s 對每個Names參數(shù)只給出占用的數(shù)據(jù)塊總數(shù)。 -a 遞歸地顯示指定目錄中各文件及子孫目錄中各文件占用的數(shù)據(jù)塊數(shù)。若既不指定-s,也不指定-a,則只顯示Names中的每一個目錄及其中的各子目錄所占的磁盤塊數(shù)。 -b 以字節(jié)為單位列出磁盤空間使用情況(系統(tǒng)缺省以k字節(jié)為單位)。 -k 以1024字節(jié)為單位列出磁盤空間使用情況。 -c 最后再加上一個總計(系統(tǒng)缺省設(shè)置)。 -l 計算所有的文件大小,對硬鏈接文件,則計算多次。 -x 跳過在不同文件系統(tǒng)上的目錄不予統(tǒng)計。 dd命令 功能:把指定的輸入文件拷貝到指定的輸出文件中,并且在拷貝過程中可以進行格式轉(zhuǎn)換。可以用該命令實現(xiàn)DOS下的diskcopy命令的作用。先用dd 命令把軟盤上的數(shù)據(jù)寫成硬盤的一個寄存文件,再把這個寄存文件寫入第二張軟盤上,完成diskcopy的功能。需要注意的是,應(yīng)該將硬盤上的寄存文件用 rm命令刪除掉。系統(tǒng)默認使用標準輸入文件和標準輸出文件。 語法:dd [選項] if =輸入文件(或設(shè)備名稱)。 of =輸出文件(或設(shè)備名稱)。 ibs = bytes 一次讀取bytes字節(jié),即讀入緩沖區(qū)的字節(jié)數(shù)。 skip = blocks 跳過讀入緩沖區(qū)開頭的ibs*blocks塊。 obs = bytes 一次寫入bytes字節(jié),即寫入緩沖區(qū)的字節(jié)數(shù)。 bs = bytes 同時設(shè)置讀/寫緩沖區(qū)的字節(jié)數(shù)(等于設(shè)置ibs和obs)。 cbs = byte 一次轉(zhuǎn)換bytes字節(jié)。 count=blocks 只拷貝輸入的blocks塊。 conv = ASCII 把EBCDIC碼轉(zhuǎn)換為ASCIl碼。 conv = ebcdic 把ASCIl碼轉(zhuǎn)換為EBCDIC碼。 conv = ibm 把ASCIl碼轉(zhuǎn)換為alternate EBCDIC碼。 conv = block 把變動位轉(zhuǎn)換成固定字符。 conv = ublock 把固定位轉(zhuǎn)換成變動位。 conv = ucase 把字母由小寫轉(zhuǎn)換為大寫。 conv = lcase 把字母由大寫轉(zhuǎn)換為小寫。 conv = notrunc 不截短輸出文件。 conv = swab 交換每一對輸入字節(jié)。 conv = noerror 出錯時不停止處理。 conv = sync 把每個輸入記錄的大小都調(diào)到ibs的大小(用NUL填充)。 fdformat 命令 軟盤是用戶常用的存儲介質(zhì)之一。軟盤在使用之前必須先作格式化操作,然后可以用tar、dd、cpio等命令存儲數(shù)據(jù),也可以在軟盤上建立可安裝的文件系統(tǒng)。 功能:低級格式化軟盤 語法:format [-n] device 說明:該命令的作用是對軟盤進行格式化。 -n 軟盤格式化后不作檢驗。 device 指定要進行格式化的設(shè)備,通常是下述設(shè)備之一: /dev/fd0d360 /dev/fd0h1200 /dev/fd0D360 /dev/fd0H360 /dev/fd0D720 /dev/fd0H720 /dev/fd0h360 /dev/fd0h720 /dev/fd0H1440 Linux其它命令 echo命令 echo命令的功能是在顯示器上顯示一段文字,一般起到一個提示的作用。 該命令的一般格式為: echo [ -n ] 字符串 其中選項n表示輸出文字后不換行;字符串可以加引號,也可以不加引號。用echo命令輸出加引號的字符串時,將字符串原樣輸出;用echo命令輸出不加引號的字符串時,將字符串中的各個單詞作為字符串輸出,各字符串之間用一個空格分割。 cal命令 cal命令的功能是顯示某年某月的日歷。 該命令的一般格式為: cal [選項] [月 [年]] 命令中各選項的含義為: - j 顯示出給定月中的每一天是一年中的第幾天(從1月1日算起)。 - y 顯示出整年的日歷。 date命令 date命令的功能是顯示和設(shè)置系統(tǒng)日期和時間。 該命令的一般格式為: date [選項] 顯示時間格式(以+開頭,后面接格式) date 設(shè)置時間格式 命令中各選項的含義分別為: -d datestr, --date datestr 顯示由datestr描述的日期 -s datestr, --set datestr 設(shè)置datestr 描述的日期 -u, --universal 顯示或設(shè)置通用時間 時間域 % H 小時(00..23) % I 小時(01..12) % k 小時(0..23) % l 小時(1..12) % M 分(00..59) % p 顯示出AM或PM % r 時間(hh:mm:ss AM或PM),12小時 % s 從1970年1月1日00:00:00到目前經(jīng)歷的秒數(shù) % S 秒(00..59) % T 時間(24小時制)(hh:mm:ss) % X 顯示時間的格式(%H:%M:%S) % Z 時區(qū) 日期域 % a 星期幾的簡稱( Sun..Sat) % A 星期幾的全稱( Sunday..Saturday) % b 月的簡稱(Jan..Dec) % B 月的全稱(January..December) % c 日期和時間( Mon Nov 8 14:12:46 CST 1999) % d 一個月的第幾天(01..31) % D 日期(mm/dd/yy) % h 和%b選項相同 % j 一年的第幾天(001..366) % m 月(01..12) % w 一個星期的第幾天(0代表星期天) % W 一年的第幾個星期(00..53,星期一為第一天) % x 顯示日期的格式(mm/dd/yy) % y 年的最后兩個數(shù)字( 1999則是99) % Y 年(例如:1970,1996等) 注意:只有超級用戶才有權(quán)限使用date命令設(shè)置時間,一般用戶只能使用date命令顯示時間。 clear命令 clear命令的功能是清除屏幕上的信息,它類似于DOS中的 cls命令。清屏后,提示符移動到屏幕左上角。 文章來源于http://www.lupaworld.com posted @ 2008-09-18 12:15 追風(fēng)舞者 閱讀(380) | 評論 (0) | 編輯 收藏 ubuntu中默認的是gnome桌面,也可以為你的程序設(shè)置快捷方式。
可以以兩種方式生成快捷方式,這里叫做起動器:命令行方式和拖動程序圖標的方式。這里以Lumaqq為例說明之。 1.在應(yīng)用程序菜單中創(chuàng)建起動器: 在命令行中輸入如下命令: sudo gedit /usr/share/applications/LumaQQ.desktop //sudo是以超級用戶權(quán)限執(zhí)行后面命令 //gedit是打開文本編輯器,后面的路徑標識要編輯的文件 //在/usr/share/applications目錄下可以看到許多*.desktop的文件,都是應(yīng)用程序的起動器,所以上述命令是為LunaQQ創(chuàng)建一個起動器配置文件。 在打開的窗口中輸入如下內(nèi)容: [Desktop Entry] Name=LumaQQ Comment=QQ Client Exec=/opt/LumaQQ/lumaqq//這里的路徑應(yīng)該是你的LunaQQ程序的安裝路徑 Icon=/opt/LumaQQ/QQ.png//同上 Terminal=false Type=Application Categories=Application;Network;//這里的內(nèi)容決定創(chuàng)建出的起動器在應(yīng)用程序菜單中的位置,按照上面的寫法創(chuàng)建的起動器將出現(xiàn)在應(yīng)用程序-Internet中,以此類推,如果想在應(yīng)用程序-辦公中創(chuàng)建起動器,上述最后一行應(yīng)該寫成: Categories=Application;Office; 2.在頂部面板中創(chuàng)建起動器(類似windows中的快速啟動): 可以把任意位置的程序圖標拖拽到窗口最頂端的頂部面板(Top Panel)上中間的位置,兩個起動器分別是命令行終端和LumaQQ的,分別是從應(yīng)用程序菜單和文件管理器中拖拽到當(dāng)前位置的,在這個頂部面板中還可以 添加許多給定的起動器,方法是在頂部面板中右鍵單擊選擇添加到面板,可以看到許多內(nèi)容。 3.在桌面創(chuàng)建起動器 方法同2類似,只需簡單拖拽即可。(LumaQQ在桌面上的大圖標好可愛!) posted @ 2008-09-18 12:13 追風(fēng)舞者 閱讀(1915) | 評論 (0) | 編輯 收藏 Evolution是ubuntu,fedora等發(fā)行版本自帶的一個郵件管理軟件,可以幫助你方便的管理和收發(fā)郵件,其設(shè)置步驟如下:
1.確認你的gmail的POP已經(jīng)打開: 登錄gmail-settings-forwarding and POP, 確認“Enable POP for all mail”被選上
2.打開Application→Internet→Evolution Mail
3.添加用戶,如果已經(jīng)創(chuàng)建了gmail用戶,直接點擊edit。
4. 在Receive mail選項,
server type 選 POP
server: pop.gmail.com
username: 你的gmail用戶名(eg.'myname@gmail.com'則填入'myname')
use secure connection: SSL encryption
authentication type: password, remember password
5. 在sending mail選現(xiàn),
server type: SMTP
server: smtp.gmail.com
選中server require authentication
use secure connection: SSL encryption
authentication type: PAIN
username: 你的gmail用戶名(eg.'myname@gmail.com'則填入'myname')
選中remember password
6. OK
有些文檔或許會提到995,465等端口號,根據(jù)我設(shè)置的實驗來看不設(shè)置端口號也可以。 posted @ 2008-09-18 10:29 追風(fēng)舞者 閱讀(448) | 評論 (0) | 編輯 收藏 一、rpm包安裝方式步驟:
2、打開一個終端,su -成root用戶; 3、cd soft.version.rpm所在的目錄; 4、輸入rpm -ivh soft.version.rpm
2、打開一個終端,su -成root用戶; 3、cd soft.version.deb所在的目錄; 4、輸入dpkg -i soft.version.deb
2、打開一個終端,su -成root用戶; 3、cd soft.tar.gz所在的目錄; 4、tar -xvzf soft.tar.gz //一般會生成一個soft目錄 5、cd soft 6、./configure 7、make 8、make install
1、找到相應(yīng)的軟件包,比如soft.tar.bz2,下載到本機某個目錄; 2、打開一個終端,su -成root用戶; 3、cd soft.tar.bz2所在的目錄; 4、tar -xjvf soft.tar.bz2 //一般會生成一個soft目錄 5、cd soft 6、./configure 7、make 8、make install
2、apt-cache search soft 注:soft是你要找的軟件的名稱或相關(guān)信息 3、如果2中找到了軟件soft.version,則用apt-get install soft.version命令安 裝軟件 注:只要你可以上網(wǎng),只需要用apt-cache search查找軟件,用apt-get install軟件
1、打開一個終端,su -成root用戶; 2、chmod +x soft.bin 3、./soft.bin //運行這個命令就可以安裝軟件了
下載的是lumaqq.tar.gz,使用方法如下: 1、打開一個終端,su -成root用戶; 2、tar -xzvf lumaqq.tar.gz //這一步會生成一個叫LumaQQ的目錄 3、cd LumaQQ 4、chmod +x lumaqq //設(shè)置lumaqq這個程序文件為可運行 5、此時就可以運行l(wèi)umaqq了,用命令./lumaqq即可,但每次運行要輸入全路徑或 切換到剛才生成的LumaQQ目錄里 6、為了保證不設(shè)置路徑就可以用,你可以在/bin目錄下建立一個lumaqq的鏈接, 用命令ln -s lumaqq /bin/ 即可,以后任何時候打開一個終端輸入lumaqq就可以 啟動QQ聊天軟件了 7、如果你要想lumaqq有個菜單項,使用菜單編輯工具,比如Alacarte Menu Editor,找到上面生成的LumaQQ目錄里的lumaqq設(shè)置一個菜單項就可以了,當(dāng)然你 也可以直接到 /usr/share/applications目錄,按照里面其它*.desktop文件的格 式生成一個自己的desktop文件即可。 posted @ 2008-09-16 11:24 追風(fēng)舞者 閱讀(141) | 評論 (0) | 編輯 收藏 一.配置 1)framework下的entity里的config里面打開entityengine.xml文件,在此文件里找有四行都是以<delegator name開頭的,請將里面的datasource-name="localderby"都改為datasource-name="localmysql"。 2)在此文件里找到〈datasource-name="localmysql"開頭的代碼區(qū)域,將里面的jdbc-username= 和jdbc-password= 都改為你安裝mysql時的用戶名和密碼。 3)我們要在entity下的lib下的jdbc中導(dǎo)入mysql5.0的驅(qū)動,同時加入xapool.jar。 4)在mysql中建ofbiz數(shù)據(jù)庫,否則在下面部署工程中報錯 二.部署 1) 在命令行下運行 ant run-install (前提:在環(huán)境變量中添加 ant\bin) 2) 運行 startofbiz.bat 三. 工程端口號的修改 修改framework/base/config/ofbiz-containers.xml 1) 修改ofbiz端口號 <property name="http-connector" value="connector"> <property name="port" value="8080"/> </property> 2)修改項目鏈接的端口號 <property name="https-connector" value="connector"> <property name="port" value="8443"/> </property> 四.運行 在瀏覽器中輸入地址 http://localhost:8080
posted @ 2008-09-11 11:44 追風(fēng)舞者 閱讀(2143) | 評論 (0) | 編輯 收藏 1.實體引擎核心應(yīng)用類(客戶端API) 2.服務(wù)引擎應(yīng)用類(服務(wù)器端API) 3.常用工具類 posted @ 2008-09-10 16:33 追風(fēng)舞者 閱讀(145) | 評論 (0) | 編輯 收藏 1. entitymodle.xml中的字段類型參見 opentaps-1.0\framework\entity\fieldtype entity
field
prim-key
relation
更加詳細的內(nèi)容參照: http://ofbiz.apache.org/docs/entity.html posted @ 2008-09-09 10:25 追風(fēng)舞者 閱讀(726) | 評論 (0) | 編輯 收藏 1.將Opentaps項目導(dǎo)入Eclipse中
Filee -> Import -> General -> Existing Projects into Workspace 2.Eclipse中為.bsh,.ftl文件添加編輯器 安裝Freemarker Eclipse plug-in. Windows > Preferences > General > Editors > File Associations and add "*.bsh" and associate it with the Scrapbook editor. 3.修改 startofbiz.bat文件 ECHO OFF "%JAVA_HOME%\bin\java" -Xms256M -Xmx512M -Duser.language=en -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -jar ofbiz.jar > runtime\logs\console.log 4.Eclipse菜單 Run -> Open Debug Dialog 選擇 Remote Java Application 注意: 右側(cè)面板中的 Port 為上面紅色標記,兩者必需一致。 ![]() ![]() posted @ 2008-09-08 18:23 追風(fēng)舞者 閱讀(2074) | 評論 (0) | 編輯 收藏 1.OfBiz中利用delegator訪問數(shù)據(jù)庫
1)創(chuàng)建GenericDelegator對象 1.1 service中 public static Map createHelloPerson(DispatchContext dctx, Map context) { GenericDelegator delegator = dctx.getDelegator(); ... } 1.2手工建立GenericDelegator對象 GenericDelegator delegator = GenericDelegator.getGenericDelegator("default"); 2)Insert a record 通過調(diào)用delegator對象的getNextSeqId(), makeValue(String entityName, Map fields)和create()方法。 例如: String helloPersonId = delegator.getNextSeqId("HelloPerson"); GenericValue helloPerson = delegator.makeValue("HelloPerson", UtilMisc.toMap("helloPersonId", helloPersonId)); // create a GenericValue from ID we just got helloPerson.setNonPKFields(context); // move non-primary key fields from input parameters to GenericValue delegator.create(helloPerson); // store the generic value, ie persists it 3)Remove a record delegator.removeByAnd(String entityName, Map fields); 4)Strore a record 例如: Map pk = UtilMisc.toMap("attribute1", attribute1Value, "attribute2", attribute2Value);//pk中存儲了查詢條件 GenericValue obj = delegator.findByPrimaryKey("ClassName", pk); obj.setNonPKFields(context);//contex為Map類型,存儲了要更新的字段 obj.store(); 5)Store records List resultList = delegator.findAll(String entityName, List orderBy); List toStore = new ArrayList(); toStore.addAll(resultList); delegator.storeAll(toStore); 6)Look for record/records findByAnd,findByCondition、findByLike、findByOr、findByPrimaryKey、 findListIteratorByCondition、 findall、findAllByPrimaryKeys 2) 依據(jù)數(shù)值對象進行訪問 在現(xiàn)有的數(shù)值對象(GenericValue類型)上可以進行下列操作: 根據(jù)關(guān)系查找關(guān)聯(lián)信息getRelated,包括getRelated、getRelatedByAnd、getRelatedDummyPK、getRelatedMulti、getRelatedOrderBy。 刷新本數(shù)值對象refresh 保存本數(shù)值對象store,主要用于修改后的保存 刪除數(shù)值對象remove,包括刪除本數(shù)值對象remove和刪除某個關(guān)聯(lián)的數(shù)值對象removeRelated 在現(xiàn)有數(shù)值對象上的操作是通過調(diào)用 更加具體的信息可參考:http://www.opentaps.org/javadocs/release-1.0.1/framework/api/ posted @ 2008-09-08 17:59 追風(fēng)舞者 閱讀(1238) | 評論 (0) | 編輯 收藏 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||