Objeto Java BufferedWriter con utf-8

Tengo el siguiente código y quiero hacer que el outputtream use utf-8. Básicamente, tengo caracteres como é que aparecen como é por lo que parece un problema de encoding.

He visto muchos ejemplos que usan …

 OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(path),"UTF-8"); 

Aunque mi código actual es …

 BufferedWriter out = new BufferedWriter(new FileWriter(DatabaseProps.fileLocation + "Output.xml")); 

¿Es posible definir este objeto como UTF-8 sin tener que utilizar OutputStreamWriter?

Gracias,

No. FileWriter no le permite especificar la encoding, que es extremadamente molesto. Siempre usa la encoding predeterminada del sistema. Solo agúrelo y use OutputStreamWriter envolviendo un FileOutputStream . Todavía puede ajustar el OutputStreamWriter en un BufferedWriter, por supuesto:

 BufferedWriter out = new BufferedWriter (new OutputStreamWriter(new FileOutputStream(path), StandardCharsets.UTF_8)); 

O a partir de Java 8:

 BufferedWriter out = Files.newBufferedWriter(Paths.of(path)); 

(Por supuesto, puede cambiar la encoding predeterminada de su sistema a UTF-8, pero eso parece ser una medida extrema).

Puede usar FileWriter mejorado, mejorado por mí.

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

Como explica la documentación de FileWriter,

Los constructores de esta clase asumen que la encoding de caracteres predeterminada y el tamaño de byte-buffer predeterminado son aceptables. Para especificar estos valores usted mismo, construya un OutputStreamWriter en un FileOutputStream.

Sin embargo, no hay ninguna razón para que no puedas construir tu BufferedWriter encima del OutputStreamWriter.

Utilice el método, Files.newBufferedWriter (ruta de acceso, Charset cs, opciones de OpenOption …)

Según lo solicitado por Toby, aquí está el código de muestra.

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