Java 6使用readline复制文件

时间:2014-11-06 20:36:23

标签: java copy java-6 bufferedwriter

我尝试复制包含一些必需参数的文件: 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();
        }
    }
}

1 个答案:

答案 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。