2014-09-03 31 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