我需要替换各种文件中的密钥(所有类型和换行符格式)。 为此,我尝试逐行复制文件并替换行中的键。这有效但原始的换行符丢失了。
这是我的代码,很常见:
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 :(得分: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
,则必须在调用方法之前将其拆分并在之后加入。