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();
}
}
}
source to share
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.
source to share