我尝试复制包含一些必需参数的文件: inputEncoding , outputEncoding 和 outputLineSeparator 。
但是当我运行以下代码时,带有 CRLF 最终字符的文件不能很好地复制,最后 CRLF 字符消失了。
我认为readLine在第3行后返回null,因为第4行是空的......
我的目标是找到可以严格复制以下两个文件的copyfile函数。
有没有办法复制这个最后的空行(最后一个换行符)?
提前感谢您的帮助。
输入文件
文件testInEndNL.txt(显式字符)
A<CRLF>
B<CRLF>
C<CRLF>
文件testOutEndEOF.txt(显式字符)
A<CRLF>
B<CRLF>
C
输出文件
文件testOutEndNL.txt(显式字符) KO 对我来说
A<LF>
B<LF>
C
文件testInEndEOF.txt(显式字符)确定对我来说
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();
}
}
}
答案 0 :(得分:1)
简短的回答是,您无法使用.readLine()
,因为它会删除行尾字符。
您需要使用.read()
代替,它将逐个字符地读取,并执行您自己的EOL处理。这会返回int
,但您可以将其转换为char
:
char c = (char)reader.read();
CR / LF将作为两个单独的字符出现,因此您必须注意并相应地处理。如果您知道您的文件只有CR / LF或只有LF,那么它会更容易一些,因为无论何时阅读CR,您都知道LF正在紧随其后。
您正在阅读的字节不会发生变化。默认情况下,您将以UTF-8的形式读取它们,它始终将CR和LF编码为单字节字符。在int
条款中,它们分别为13和10。