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