gpt4 book ai didi

java - 如何逐行复制文件并保留其原始换行符

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:23:24 25 4
gpt4 key购买 nike

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

这是我的代码,很常见:

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 上运行)。并且只有一行的文件变成了两行文件。

问题是,如何在逐行复制文件的同时保留原始文件的换行符,或者至少,如何能够确定文件的末尾而不是在末尾添加额外的行?感谢您的帮助。

编辑:删除了无用的 DataInputStream。

最佳答案

您可以使用 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' .但是它使用“零宽度后视”来匹配换行符之后的位置,而不是换行符本身,因此换行符成为 Scanner.next() 返回的标记的一部分。 .

所以 String line将在其末尾包含换行符,除非它是最后一行未被换行符终止的行。所以你所要做的就是假设 replaceKeys保留换行符不变,就是写 String原样,无需手动添加换行符。

如果replaceKeys无法应对 String在其末尾有一个换行符,您必须在调用该方法之前将其拆分并在之后加入。

关于java - 如何逐行复制文件并保留其原始换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25640805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com