crontab命令是Unix/Linux中的一個常用命令,用于設(shè)置周期性被執(zhí)行的指令。沒有用過的可以查一下,在運行服務(wù)端程序時會經(jīng)常用到。 程序使用Java讀取一個含有中文的文件,進行處理后,將結(jié)果寫到一個結(jié)果文件中。在運行的程序時,出現(xiàn)了這樣一個問題:在本地環(huán)境下,運行正確;但是當(dāng)使用crontab定時執(zhí)行時,得到的卻是錯誤的結(jié)果。 經(jīng)過一定的調(diào)研發(fā)現(xiàn)原來是對crontab的機制沒有弄明白導(dǎo)致的。crontab運行程序時,會使用它自己的環(huán)境變量,這個環(huán)境變量與你本地的環(huán)境變量可能會不同。比如,在你本地情況下,環(huán)境變量的語言為en_US.UTF-8,而在crontab中,環(huán)境變量可能是zh_CN.GBK,這樣會導(dǎo)致讀寫文件時——尤其是讀寫中文文件時內(nèi)容編碼錯誤,進而導(dǎo)致結(jié)果出錯。 所以在使用Java讀寫文件時,一定要指定編碼格式,而不是使用環(huán)境變量的格式。例如下面的語句用于讀取utf-8格式的文件:
String encodeType = "utf-8";
File in_file = new File("test.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(in_file), encodeType));
網(wǎng)上也有關(guān)于修改crontab環(huán)境變量的方法,但是我不建議使用,因為一個系統(tǒng)可能是很多人共用的,修改crontab環(huán)境變量可能會引起他人程序的問題,最好修改自己的程序,保證它不依賴具體的環(huán)境變量。