背景
今天一直在排查一個問題,同樣的配置,爲什麼有的機器讀出來是正確的,有的機器則不能正確解析,通過不斷的思考驗證,發現是一個因爲轉義字符引起的問題。特此在這裏記錄一下
配置文件格式與讀取過程
配置文件是一個文本文件,裏面是一行行的鍵值對類似於這樣的
aaa bbb
aaa bbb
aaa bbb
解析配置文件的代碼是通過字符串的拆分進行的,簡單來說就是:
String[] kvPair = config.split("\r\n")
for(String kv:kvPair){
String key = ke.split(" ")[0];
String key = ke.split(" ")[1];
}
這個\r\n
是在調試的時候看到的,所以寫代碼的時候就按照這樣進行切分了,結果這就是導致問題的導火索。
別人同步代碼後,發現配置文件並沒有生效因爲,別人讀取的文件字符串的是按照\n
進行分割的。
問題排查
知道問題,也就對應的知道了答案,按行讀取文件就可以完美的解決問題,但是問題的排查過程纔有記錄意義。
有人說linux 和windows 的換行符有一定的區別,也確實是這樣。於是我猜測,Windows是按照\r\n
進行分割的,而我把代碼提交到git上,自動的切換成\n, 於是我把工程刪除,重新clone一次,然而並沒有什麼用,於是不斷的加日誌,讓別人同步代碼,最後我比對這兩個版本的日誌,最後發現讀取的配置有問題。
具體導致這個問題的原因還沒搞清楚。
正確的解決方法
if(inputStream != null){
InputStreamReader inputreader = new InputStreamReader(inputStream);
BufferedReader buffreader = new BufferedReader(inputreader);
String line;
while (( line = buffreader.readLine()) != null) {
//todo
}
}