Java程序員的日常——經驗貼(純幹貨)
如果是古老的Unix系統,可能並不認識tar -z命令,因此如果你想要壓縮或者解壓tar.gz的文件,就需要使用gzip或者gunzip以及tar命令了。
關於tar.gz可以這麽理解,tar結尾的壓縮包,其實只負責把文件打包,並沒有進行壓縮;而gz結尾的包,則是進行壓縮操作。
因此,tar.gz的文件可以理解為,先進行打包,再進行壓縮。
那麽,壓縮的命令就可以這樣寫:
tar -cvf abc.tar abc
gzip -c abc.tar > abc.tar.gz
最終就會得出一個abc.tar.gz的文件。同理如果想要進行解壓,可以這樣:
gunzip abc.tar.gz
tar -xvf abc.tar
=>該命令完成解壓的步驟
執行完這兩個命令,當前文件夾就會出現一個abc的文件夾了。
如果你的系統支持tar -z命令
如果你的系統級別高一點,就不用這麽費事了,tar命令直接可以對gz進行操作:
tar -zxvf 壓縮文件名.tar.gz
=>這個命令可以直接完成對壓縮文件的解壓
tar -zcvf 壓縮文件名.tar.gz 被壓縮文件名
=>這個命令可以直接完成對tar.gz的壓縮
文件句柄占用導致應用崩潰
在Java中如果執行過多的流操作或者開啟過多未關閉的Socket,並且沒有及時的關閉,就可能會出現too many open files的錯誤。這就是因為系統的文件句柄數不夠了….
在linux中可以使用命令查看文件句柄數:
ulimit -n
也可以使用這個命令,進行修改:
ulimit -n 2048
但是修改這裏,是暫時的解決辦法,如果長時間不釋放文件句柄,仍然會報錯。
所以還是應該回到程序中,檢查流操作:
BufferedReader in = null;
try{
in = new BufferedReader(new FileReader(file));
//你的業務邏輯
}catch(Exception e){
}finally{
if(in != null){
try{
in.close();//及時的進行釋放
}catch(Exception e){
}
}
}
如果是一些可以復用的流,還可以把它提取出來多次使用。
Linux系統下的亂碼問題
亂碼問題經常困擾著程序員的日常開發,關於編碼的問題就不詳細說了。有一個經常遇到的問題就是,我們開發好的一個應用,放在Linux下就會出現亂碼,仔細檢查每個編碼的配置,都是utf-8,簡直是百思不得其解。
其實這是JVM的問題,因為JVM默認會按照系統的編碼來執行,如果JVM的編碼不對,內部進行的文件處理當然也就會出現亂碼。
首先查看系統的默認編碼:
locale
LANG=
LC_CTYPE="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_MESSAGES="C"
LC_ALL=
很多系統的編碼都是這個C,在這邊博客中說,C是系統默認的Locale,默認由ANSI C來支持。也就是說默認的編碼是ANSI C!
這樣,它與我們的UTF-8肯定是不一致了。因此,可以這樣:
java -Dfile.encoding=UTF-8 xxxx
通過添加上面的參數來指定JVM使用的編碼。如果你是在tomcat中啟動的可以修改其中的java相關的參數;如果是其他的程序,那麽就依啟動時的jvm參數為準,修改對應的啟動命令即可。
使用javac以及java執行class
這個算是基礎知識了,但是一般的開發者可能只是用它試驗過helloworld。比如:
javac HelloWorld.java
=>編譯出HelloWorld.class
java HelloWorld
=>執行該類
實際情況中可能遠比這個復雜:
如何啟動eclipse中編譯出來的jar包
通過Eclipse進行打包,比較簡單:
右鍵工程名字-Export
選擇Jar File
選擇指定的工程、以及編譯出的jar包所在的目錄
點擊finish進行打包即可
這個時候,如果你直接執行java -jar xxx.jar,可能會拋出一個異常:
java -jar target.jar
fileMonitor.jar中沒有主清單屬性
這是因為這個jar中缺少了Main方法的定義。此時你可以這麽做,通過解壓工具進入到jar包中,修改META-INF下的MENIFEST.MF文件。
Manifest-Version: 1.0
Main-Class: com.test.類名
註意Main-Class後面的冒號後面要有空格、並且最後一行要空著(如果沒有最後一行的的回車,就會報找不到Main-Class這個屬性的錯誤)。
如果你使用Javac以及java編譯類
如果你有一個類,這個類依賴於其他的jar包,比如:test.java依賴a.jar、b.jar。
那麽可以執行javac進行編譯:
javac -cp a.jar;b.jar test.java
=>註意如果是Linux,分號要換成冒號
javac -cp a.jar:b.jar test.java
然後使用java執行:
java -cp .;a.jar;b.jar test
=>如果是linux,分號換成冒號
java -cp .:a.jar:b.jar test
編寫shell腳本
經常有人會編寫一些類似tomcat一鍵啟動的腳本,這裏以linux為例:
#!/bin/sh
PRG="$0"
PRGDIR=dirname "$PRG"
[ -z "$ROOT_PATH" ] && ROOT_PATH=cd "$PRGDIR/.." >/dev/null; pwd
echo "設置 ROOT_PATH為 $ROOT_PATH"
[ -z "$JRE_HOME" ] && JRE_HOME=cd "$ROOT_PATH/jre" >/dev/null; pwd
echo "設置 JRE_HOME 為 $JRE_HOME"
"$JRE_HOME"/bin/java -Dfile.encoding=UTF-8 -jar "$AGENT_PATH"/lib/test.jar
有幾個可以值得借鑒的地方:
第一點,就是如何設置環境變量,比如使用內置的jre
PRG="$0"
PRGDIR=dirname "$PRG"
這兩句話是為了獲取啟動腳本所在的目錄。
[ -z "$ROOT_PATH" ] && ROOT_PATH=cd "$PRGDIR/.." >/dev/null; pwd
這句話是設置了該啟動腳本所處的應用的根目錄
[ -z "$JRE_HOME" ] && JRE_HOME=cd "$ROOT_PATH/lib/jre" >/dev/null; pwd
這句話是最終設置環境變量的命令。粗俗JRE_HOME就指定為應用內置的jre了。
第二點,是如何啟動我們自己的類
"$JRE_HOME"/bin/java -Dfile.encoding=UTF-8 -jar "$AGENT_PATH"/lib/test.jar
上面這命令,是執行內置的jre中的java命令,使用java命令啟動了一個可執行的jar包,並且設置好了它的編碼。
Java程序員的日常——經驗貼(純幹貨)