Tengo el siguiente código y quiero hacer el outputstream usar utf-8. Básicamente me han personajes como é que aparecen como é por lo que se ve como un problema de codificación.

He visto un montón de ejemplos que utilizan…

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

Mi código actual, aunque es…

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

Es posible la definición de este objeto como UTF-8 sin tener que utilizar el OutputStreamWriter?

Gracias,

  • Por qué no se puede usar un OutputStreamWriter?
  • O mejor, ¿por qué no se puede usar un serializador de XML? Y si usted está usando un serializador XML, ¿por qué no dejar que la manija de la codificación?
InformationsquelleAutor david99world | 2011-08-09

4 Comentarios

  1. 124

    No. FileWriter no permite especificar la codificación, que es muy molesto. Siempre se utiliza el sistema de codificación predeterminada. Acaba de chupar y uso de OutputStreamWriter envolver un FileOutputStream. Usted todavía puede envolver el OutputStreamWriter en un BufferedWriter de curso:

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

    O como de Java 8:

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

    (Por supuesto, usted puede cambiar el sistema por defecto la codificación a UTF-8, pero que parece un poco de una medida extrema.)

    • Hmm, yo hice eso, pero todavía me pongo é por é. ¿Eso significa que el problema es anterior en la pila? En la base de datos se almacena como é, pero cuando me conecto con jdbc:sqlserver://…… escribe el campo como é en mi archivo. La cadena no está siendo intencionalmente cambiado en de todos modos.
    • No está claro a qué te refieres, pero nada de lo dispuesto en el código que has demostrado es que va a ser la creación de XML/HTML entidades para usted. De hecho el sonido es como el problema está en otro lugar. Estoy seguro de que usted ya tiene el é en su cadena antes de escribir en el búfer de escritor.
    • El problema puede que el programa que está utilizando para leer el archivo no está configurado para utf-8.
    • Ah, muchas gracias, yo no era consciente de que esto tenía que ser configurado a leer y escribir, gracias 🙂
    • Para los lectores futuros, Apache Commons IO FileWriterWithEncoding también es una opción
    • Bien en estos días que acababa de utilizar los Archivos.newBufferedWriter – no hay necesidad de un tercero lib.
    • 4 yo y después de esto sólo me salvó la vida :). Gracias.
    • para el «muy molesto»

  2. 5

    Puede utilizar mejorado FileWriter, 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 ) );
      }
    }
  3. 2

    Como el documentación para FileWriter explica,

    Los constructores de esta clase de suponer que la codificación de caracteres por defecto y el valor predeterminado de bytes-tamaño de búfer son aceptables. Para especificar estos valores a ti mismo, la construcción de un OutputStreamWriter en un FileOutputStream.

    No hay ninguna razón usted no puede construir su BufferedWriter en la parte superior de la OutputStreamWriter aunque.

  4. 0

    Utilice el método, Archivos.newBufferedWriter(Path, Charset cs, OpenOption… opciones)

    Solicitado por Toby, aquí está el código de ejemplo.

    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();
            }
    • Mientras que esto puede ser una valiosa pista para resolver el problema, una buena respuesta también muestra la solución. Por favor, editar para proporcionar un código de ejemplo para mostrar lo que quieres decir. Como alternativa, considere la posibilidad de escribir esto como un comentario en su lugar.

Dejar respuesta

Please enter your comment!
Please enter your name here