當前位置:
首頁 > 知識 > Java程序員的日常——經驗貼:純乾貨

Java程序員的日常——經驗貼:純乾貨












Java程序員的日常——經驗貼:純乾貨


2017-05-18 java學習吧


工作當中遇到的事情比較雜,因此涉及的知識點也很多。這裡暫且記錄一下,今天遇到的知識點,純乾貨~

關於文件的解壓和壓縮


如果你的系統不支持tar -z命令


如果是古老的Unix系統,可能並不認識tar -z命令,因此如果你想要壓縮或者解壓tar.gz的文件,就需要使用gzip或者gunzip以及tar命令了。


關於tar.gz可以這麼理解,tar結尾的壓縮包,其實只負責把文件打包,並沒有進行壓縮;而gz結尾的包,則是進行壓縮操作。


因此,tar.gz的文件可以理解為,先進行打包,再進行壓縮。


那麼,壓縮的命令就可以這樣寫:


執行完這兩個命令,當前文件夾就會出現一個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的編碼不對,內部進行的文件處理當然也就會出現亂碼。


首先查看系統的默認編碼:

# localeLANG=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.jarfileMonitor.jar中沒有主清單屬性


這是因為這個jar中缺少了Main方法的定義。此時你可以這麼做,通過解壓工具進入到jar包中,修改META-INF下的MENIFEST.MF文件。

Manifest-Version: 1.0Main-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/shPRG="$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程序員的日常——經驗貼:純乾貨


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自
的精彩文章:

揭秘黑海古城墓室3000年前神秘海底人魚,美人魚是人類的分支
媳婦最拿手的四道菜,分分鐘被搶光,全家人都愛吃!
男人這五個表現,才是用情至深的深愛你
這樣畫眼線,快速又迷人,還不學起來?
Facebook直播再出命案:阿根廷男童擺弄長槍誤殺同屋女孩

TAG:
|