Java 6 Copying files with readline

I am trying to copy files with some required parameters: inputEncoding , outputEncoding and outputLineSeparator .

But when I run my following code, my final CRLF char file is not copied well, this last CRLF char disappears.

I think readLine returns null after line 3 because line 4 is empty ...


My goal is to find a copyfile function that can strictly copy these two next files.
Is there a way to copy also this final empty string (last newline char)?


Thanks in advance for any help.


Input Files
File testInEndNL.txt (explicit char)

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

      

TestOutEndEOF.txt file (explicit char)

A<CRLF>
B<CRLF>
C

      


Output files
File testOutEndNL.txt (explicit char) KO for me

A<LF>
B<LF>
C

      

TestInEndEOF.txt file (explicit char) OK for me

A<LF>
B<LF>
C

      


code

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();
        }
    }
}

      

+3


source to share


1 answer


The short answer is that you cannot do it with .readLine()

, because it removes the end-of-line characters.

Instead, you will need to use .read()

that will be read character by character and do your own EOL handling. This returns int

, but you can pipe it to char

:

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

      



CR / LF will come out as two separate characters, so you'll have to keep track of that and handle accordingly. If you know your files will only have CR / LF, or just LF, then this is a little easier because whenever you read CR, you know that LF is following it.

The byte you are reading will not change. You will read them as UTF-8 by default, which will always encode CR and LF as single byte characters. In terms int

they will come out as 13 and 10 respectively.

+1


source







All Articles