2014-09-03 89 views
2

我需要替換各種文件(所有類型和換行符格式)中的鍵。 爲此,我試圖逐行復制文件並替換行中的鍵。這可以工作,但原始的換行符會丟失。如何通過保留原始換行符的行來複制文件行

這裏是我的代碼,很常見:

FileInputStream fis = new FileInputStream(file); 
BufferedReader reader = new BufferedReader(new InputStreamReader(fis)); 

FileWriter writer = new FileWriter(tmpFile); 
BufferedWriter out = new BufferedWriter(writer); 

String line; 
while ((line = reader.readLine() != null) { 
    String updatedLine = replaceKeys(line); 
    out.write(updatedLine); 
    out.newLine(); 
} 

我需要逐行讀取文件中的行,以便能夠正確地更換密鑰(密鑰是由一些分隔符確定的時候,一定不要文件中被削減讀)。

問題是我的unix文件(.sh)在替換後有錯誤的換行符(代碼在windows上運行)。只有一行的文件會變成2行文件。

問題是,如何在逐行復制文件的同時保持原始文件行中斷,或者至少如何能夠確定文件末尾不在最後添加額外的行?謝謝你的幫助。

編輯:無用的DataInputStream刪除。

+0

DataInputStream的用途是什麼?爲什麼不直接將'FileInputStream'傳遞給'InputStreamReader'? – Holger 2014-09-03 09:50:23

+0

看得見,謝謝你的提示。這是一個錯誤的複製粘貼。沒有DataInputStream,它工作得很好。 – Kloe2378231 2014-09-03 10:09:09

回答

2

可以使用Scanner這個工作:

try(Scanner s=new Scanner(file).useDelimiter("(?<=\n)|(?!\n)(?<=\r)"); 
    FileWriter out=new FileWriter(tmpFile)) { 

    while(s.hasNext()){ 
     String line=s.next(); 
     String updatedLine = replaceKeys(line); 
     out.write(updatedLine); 
    } 
} 

的關鍵點是指定爲分隔符regex。上面使用的模式將匹配BufferedReader.readLine()匹配的換行符,即'\n','\r'後跟'\n'或單獨'\r'。但它使用「零寬度lookbehind」來匹配位置在換行符之後,而不是換行符本身,因此換行符成爲由Scanner.next()返回的令牌的一部分。

因此,String line將在其結尾處包含換行符,除非它的最後一行未被換行符終止。所以你所要做的,假設replaceKeys沒有觸及換行符,就是按原樣編寫String而不用手動追加換行符。

如果replaceKeys無法應付在末尾有換行符的String,則必須在調用方法並在之後加入之前將其拆分。

+0

它就像一個魅力!我被封鎖在這一個。由於我無法在谷歌上找到一個好的方法,這也可以幫助其他人。非常感謝你的幫助。 – Kloe2378231 2014-09-03 11:18:39

相關問題