如何逐行复制文件,保持其原始换行符

时间:2014-09-03 09:28:42

标签: java file-io copy newline

我需要替换各种文件中的密钥(所有类型和换行符格式)。 为此,我尝试逐行复制文件并替换行中的键。这有效但原始的换行符丢失了。

这是我的代码,很常见:

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。

1 个答案:

答案 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,则必须在调用方法之前将其拆分并在之后加入。