web-dev-qa-db-fra.com

Objet Java BufferedWriter avec utf-8

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,

29
david99world

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.)

116
Jon Skeet

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 ) );
  }
}
5
Eugene Chipachenko

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.

2
Richard Campbell

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