Reputation: 20063
I have the following code and I want to make the outputstream use utf-8. Basically I have characters like é
that appear as é
so it looks like an encoding issue.
I've seen lots of examples that use...
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(path),"UTF-8");
My current code though is...
BufferedWriter out = new
BufferedWriter(new FileWriter(DatabaseProps.fileLocation + "Output.xml"));
Is it possible to define this object as UTF-8 without having to use the OutputStreamWriter?
Thanks,
Upvotes: 44
Views: 113776
Reputation: 1500903
No. FileWriter
doesn't let you specify the encoding, which is extremely annoying. It always uses the system default encoding. Just suck it up and use OutputStreamWriter
wrapping a FileOutputStream
. You can still wrap the OutputStreamWriter in a BufferedWriter of course:
BufferedWriter out = new BufferedWriter
(new OutputStreamWriter(new FileOutputStream(path), StandardCharsets.UTF_8));
Or, as of Java 8:
BufferedWriter out = Files.newBufferedWriter(Paths.get(path));
(Of course, you could change your system default encoding to UTF-8, but that seems a bit of an extreme measure.)
Upvotes: 152
Reputation: 436
Use the method, Files.newBufferedWriter(Path path, Charset cs, OpenOption... options)
As requested by Toby, here is the sample code.
String errorFileName = (String) exchange.getIn().getHeader(HeaderKey.ERROR_FILE_NAME.getKey());
String errorPathAndFile = dir + "/" + errorFileName;
writer = Files.newBufferedWriter(Paths.get(errorPathAndFile), StandardCharsets.UTF_8, StandardOpenOption.CREATE_NEW);
try {
writer.write(MESSAGE_HEADER + "\n");
} finally {
writer.close();
}
Upvotes: 1
Reputation: 119
You can use improved FileWriter, improved by me.
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;
/**
* Created with IntelliJ IDEA.
* User: Eugene Chipachenko
* Date: 20.09.13
* Time: 10:21
*/
public class BufferedFileWriter extends OutputStreamWriter
{
public BufferedFileWriter( String fileName ) throws IOException
{
super( new FileOutputStream( fileName ), Charset.forName( "UTF-8" ) );
}
public BufferedFileWriter( String fileName, boolean append ) throws IOException
{
super( new FileOutputStream( fileName, append ), Charset.forName( "UTF-8" ) );
}
public BufferedFileWriter( String fileName, String charsetName, boolean append ) throws IOException
{
super( new FileOutputStream( fileName, append ), Charset.forName( charsetName ) );
}
public BufferedFileWriter( File file ) throws IOException
{
super( new FileOutputStream( file ), Charset.forName( "UTF-8" ) );
}
public BufferedFileWriter( File file, boolean append ) throws IOException
{
super( new FileOutputStream( file, append ), Charset.forName( "UTF-8" ) );
}
public BufferedFileWriter( File file, String charsetName, boolean append ) throws IOException
{
super( new FileOutputStream( file, append ), Charset.forName( charsetName ) );
}
}
Upvotes: 5
Reputation: 3621
As the documentation for FileWriter explains,
The constructors of this class assume that the default character encoding and the default byte-buffer size are acceptable. To specify these values yourself, construct an OutputStreamWriter on a FileOutputStream.
There's no reason you can't construct your BufferedWriter on top of the OutputStreamWriter though.
Upvotes: 3