J'ai le code suivant et je veux que le flux de sortie utilise utf-8. Fondamentalement, j'ai des caractères comme é
qui apparaissent sous la forme é
.
J'ai vu beaucoup d'exemples qui utilisent ...
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(path),"UTF-8");
Mon code actuel est cependant ...
BufferedWriter out = new
BufferedWriter(new FileWriter(DatabaseProps.fileLocation + "Output.xml"));
Est-il possible de définir cet objet comme UTF-8 sans avoir à utiliser OutputStreamWriter?
Merci,
FileWriter
ne vous permet pas de spécifier le codage, ce qui est extrêmement gênant. Il utilise toujours le codage par défaut du système. Suffit de sucer et utiliser OutputStreamWriter
en enveloppant une FileOutputStream
. Vous pouvez toujours envelopper OutputStreamWriter dans un BufferedWriter bien sûr:
BufferedWriter out = new BufferedWriter
(new OutputStreamWriter(new FileOutputStream(path), StandardCharsets.UTF_8));
Ou à partir de Java 8:
BufferedWriter out = Files.newBufferedWriter(Paths.of(path));
(Vous pouvez bien entendu modifier le codage par défaut de votre système en UTF-8, mais cela semble un peu extrême.)
Vous pouvez utiliser FileWriter amélioré, amélioré par moi.
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 ) );
}
}
Comme l'explique la documentation de FileWriter,
Les constructeurs de cette classe supposent que le codage de caractères par défaut et la taille de tampon d'octets par défaut sont acceptables. Pour spécifier vous-même ces valeurs, construisez un OutputStreamWriter sur un FileOutputStream.
Il n'y a aucune raison pour que vous ne puissiez pas construire votre BufferedWriter sur le OutputStreamWriter.
Utilisez la méthode, Files.newBufferedWriter (chemin d'accès, options Charset cs, OpenOption ...)
À la demande de Toby, voici l'exemple de 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();
}