java carriage-return line-endings eol linefeed

Carriage Return / Line feed en Java



carriage-return line-endings (6)

Creé un archivo de texto en un entorno Unix usando código Java.

Para escribir el archivo de texto, estoy usando java.io.FileWriter y BufferedWriter . Y para newline después de cada fila estoy usando el método bw.newLine() (donde bw es el objeto de BufferedWriter ).

Y estoy enviando ese archivo de texto adjuntándolo por correo desde el propio entorno de Unix (automatizado que usa comandos de Unix).

Mi problema es que, después de descargar el archivo de texto del correo en un sistema Windows, si abrí ese archivo de texto, los datos no están alineados correctamente. newline() no funciona, creo que sí.

Quiero la misma alineación de archivos de texto que en el entorno Unix, si también abrí el archivo de texto en el entorno de Windows.

¿Cómo resuelvo el problema?

Código de Java a continuación para su referencia (ejecutándose en entorno Unix):

File f = new File(strFileGenLoc); BufferedWriter bw = new BufferedWriter(new FileWriter(f, false)); rs = stmt.executeQuery("select * from jpdata"); while ( rs.next() ) { bw.write(rs.getString(1)==null? "":rs.getString(1)); bw.newLine(); }


El método newLine() garantiza que se newLine() una nueva línea compatible con plataforma ( 0Dh 0Ah para DOS, 0Dh para Mac antiguas, 0Ah para Unix / Linux). Java no tiene forma de saber en qué plataforma va a enviar el texto. Esta conversión debe ser atendida por las entidades de envío de correo.


Encapsule a su escritor para proporcionar reemplazo de carbón, como este:

public class WindowsFileWriter extends Writer { private Writer writer; public WindowsFileWriter(File file) throws IOException { try { writer = new OutputStreamWriter(new FileOutputStream(file), "ISO-8859-15"); } catch (UnsupportedEncodingException e) { writer = new FileWriter(logfile); } } @Override public void write(char[] cbuf, int off, int len) throws IOException { writer.write(new String(cbuf, off, len).replace("/n", "/r/n")); } @Override public void flush() throws IOException { writer.flush(); } @Override public void close() throws IOException { writer.close(); } }


Java solo conoce la plataforma en la que se está ejecutando actualmente, por lo que solo puede proporcionarle una salida dependiente de la plataforma en esa plataforma (utilizando bw.newLine() ). El hecho de que lo abra en un sistema de Windows significa que debe convertir el archivo antes de usarlo (usando algo que haya escrito, o usar un programa como unix2dos ), o tiene que generar el archivo con el formato de Windows. originalmente en tu programa Java. Entonces, si sabe que el archivo siempre se abrirá en una máquina con Windows, tendrá que imprimir

bw.write(rs.getString(1)==null? "":rs.getString(1)); bw.write("/r/n");

Vale la pena señalar que no podrá generar un archivo que se verá correcto en ambas plataformas si solo está utilizando texto sin formato, puede considerar usar html si es un correo electrónico o xml si son datos. Alternativamente, puede necesitar algún tipo de cliente que lea los datos y luego los formatee para la plataforma que el espectador está usando.


No sé quién mira tu archivo, pero si lo abres en un juego de palabras en lugar de en un bloc de notas, los saltos de línea se mostrarán correctos. En caso de que esté utilizando una extensión de archivo especial, asóciela con un juego de palabras y termine de usarla. O use cualquier otro editor de texto más avanzado.


Si entiendo bien, hablamos de un archivo adjunto de texto. Eso es desafortunado porque si fuera el cuerpo del mensaje del correo electrónico, siempre podría usar "/ r / n", haciendo referencia a http://www.faqs.org/rfcs/rfc822.html

Pero como es un archivo adjunto, debes vivir con las diferencias del sistema. Si estuviera en tu lugar, elegiría una de esas opciones:

a) solo admite clientes de Windows utilizando "/ r / n" como fin de línea.

b) proporcionar dos archivos adjuntos, uno con formato de Linux y otro con formato de Windows.

c) No sé si el archivo adjunto debe ser leído por personas o máquinas, pero si se trata de personas, consideraría adjuntar un archivo HTML en lugar de texto sin formato. más portátil y mucho más bonito, también :)


bw.newLine(); no puede garantizar la compatibilidad con todos los sistemas.

Si está seguro de que se va a abrir en Windows, puede formatearlo en Windows newline.

Si ya está utilizando comandos nativos de Unix, pruebe unix2dos y convierta el archivo generado al formato de Windows y luego envíe el correo.

Si no está usando comandos de Unix y prefiere hacerlo en Java, use `` bw.write ("/ r / n") `y si no complica su programa, tenga un método que descubra el sistema operativo y escriba la nueva línea apropiada.