gpt4 book ai didi

Java 6 使用 readline 复制文件

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

我尝试使用一些强制参数复制文件:inputEncodingoutputEncodingoutputLineSeparator

但是当我运行下面的代码时,我的带有 CRLF 最终字符的文件没有很好地复制,最后一个 CRLF 字符消失了。

我认为 readLine 在第 3 行之后返回 null,因为第 4 行是空的......


我的目标是找到可以严格复制以下两个文件的复制文件函数。
有没有办法复制最后的空行(最后一个换行符)?


在此先感谢您的帮助。


输入文件
文件 testInEndNL.txt(显式字符)

A<CRLF>
B<CRLF>
C<CRLF>

文件 testOutEndEOF.txt(显式字符)

A<CRLF>
B<CRLF>
C


输出文件
文件 testOutEndNL.txt(explicit char) KO 给我

A<LF>
B<LF>
C

文件 testInEndEOF.txt(explicit char) OK 对我来说

A<LF>
B<LF>
C


代码

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;


public class TestEncoding {

public static void main(String[] args) {
File src;
File dst;
Charset inputEncoding;
Charset outputEncoding;
String outputLineSeparator;

inputEncoding = Charset.defaultCharset();
outputEncoding = Charset.forName("UTF-16");
outputLineSeparator = "\n";

src = new File("C:\\Users\\Dam\\Desktop\\testFiles\\testInEndNL.txt");
dst = new File("C:\\Users\\Dam\\Desktop\\testFiles\\testOutEndNL.txt");
copyFile(src, dst, inputEncoding, outputEncoding, outputLineSeparator);

src = new File("C:\\Users\\Dam\\Desktop\\testFiles\\testInEndEOF.txt");
dst = new File("C:\\Users\\Dam\\Desktop\\testFiles\\testOutEndEOF.txt");
copyFile(src, dst, inputEncoding, outputEncoding, outputLineSeparator);

}

private static void copyFile(File src, File dst, Charset inputEncoding, Charset outputEncoding, String outputLineSeparator) {
try {
String oldLineBreak = System.setProperty("line.separator", outputLineSeparator);
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(src), inputEncoding));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(dst), outputEncoding));
String line = reader.readLine();
if(line != null) writer.write(line);
while ((line = reader.readLine()) != null) {
writer.newLine();
writer.write(line);
}
reader.close();
writer.close();
System.setProperty("line.separator", oldLineBreak);
}
catch(Exception e) {
e.printStackTrace();
}
}
}

最佳答案

简短的回答是您不能使用 .readLine() 来完成它,因为它会去除行尾字符。

您将需要改用 .read(),它将逐个字符地读取,并执行您自己的 EOL 处理。这将返回一个 int,但您可以将其转换为 char:

char c = (char)reader.read();

CR/LF 将作为两个单独的字符出现,因此您必须注意这一点并进行相应处理。如果您知道您的文件将只有 CR/LF 或只有 LF,那么它会更容易一些,因为每当您阅读 CR 时,您就知道 LF 紧随其后。

您正在读取的字节不会改变。默认情况下,您将以 UTF-8 格式读取它们,这将始终将 CR 和 LF 编码为单字节字符。在 int 术语中,它们将分别显示为 13 和 10。

关于Java 6 使用 readline 复制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26788931/

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