Java程序員的日?!樘ù扛苫酰?/div>

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

關于文件的解壓和壓縮

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

如果是古老的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=>該命令會首先得出一個abc.tar的文件

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的編碼不對,內部進行的文件處理當然也就會出現亂碼。

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

# 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.classjava 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包,并且設置好了它的編碼。

來源:CSDN

上一篇: Java多線程之并發協作生產者消費者設計模式

下一篇: IM 去中心化概念模型與架構設計

分享到: 更多
时时彩奖金9.98的平台 高手论坛六肖期期准 额度转换藏分技术 一分赛车计划 河内五分彩计算方法及规律 三公怎么玩才能赢钱 棋牌平台 四人麻将免费打 必富娱乐网站进不去 筒子二八杠技巧口诀 mg游戏平台手机版 玩牛牛拼牌口诀 不倒翁投注法的效果 大富翁棋牌游戏 电子游戏平台 重庆欢乐生肖彩票