2010-05-14 36 views
46

He creado un archivo de texto en entorno Unix usando código Java.Carriage Return Line feed en Java

Para escribir el archivo de texto Estoy usando java.io.FileWriter y BufferedWriter. Y para la nueva línea 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 adjuntando en el correo del 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 I los datos no están alineados correctamente. newline() personaje es 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 Java abajo para su referencia (que se ejecuta en el 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(); 
} 
+0

ha utilizado un bloque de código para el texto? –

+0

¿El sistema de destino para abrir el archivo siempre será Windows, o variará? –

Respuesta

56

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 (usando bw.newLine()). El hecho de que lo abra en un sistema de Windows significa que o bien debe convertir el archivo antes de usarlo (utilizando 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. Así que si usted sabe que el archivo se abrirá siempre en una máquina Windows, tendrá que dar salida

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

Vale la pena señalar que no va a ser capaz de sacar un archivo que se verá correcta en ambas plataformas si solo está utilizando texto sin formato, puede considerar usar html si es un correo electrónico o xml si se trata de 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.

+6

La secuencia de fin de línea en Windows es CR LF, no LF CR, así que cambiaría eso a 'br.write ("\ r \ n"); '(en lugar de' \ n \ r'). – Jesper

+0

@Jesper - gracias, lo he actualizado en consecuencia, sabía que estaba allí o por los alrededores –

+1

Si ejecutaba el mismo código en un sistema Windows, ¿obtendría el mismo archivo de texto? ¿O el archivo de texto ahora tiene '\ r \ r \ n' (el segundo' \ r' resultante de Windows Java está expandiendo '\ n' a' \ r \ n')? – ADTC

6

El método newLine() asegura una nueva línea compatible con la plataforma se añade (0Dh 0Ah para DOS, 0Dh para Macs más antiguos, 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.

+0

no te entiendo. ¿Podrías por favor explicarlo? – Manu

+1

Supongamos que edita un texto con su editor favorito en Linux. ¿Qué hará cuando presione enter? Anexará un carácter de nueva línea. Antes de hacerlo, se preguntará a sí mismo: ¿cuál es mi carácter de nueva línea? Siendo Linux él responderá: '0Ah' por supuesto. Si envía este texto a una máquina de Windows, la máquina de Windows es responsable de convertir '0Ah' a' 0Dh 0Ah'; de lo contrario, ver el texto no será muy divertido. – nc3b

+0

@Juegos: actualmente el sistema de destino es Windows. pero puede variar después de un tiempo. Cualquier ayuda sería apreciada. – Manu

2

bw.newLine(); no se 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á usando 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 escribe la nueva línea apropiada.

+0

@james: estoy intentando con bw.write ("\ r \ n"); Una vez hecho, deja que ustedes tomen k ... ahora – Manu

+0

Hola amigo ... está funcionando ... por el momento lo usaré. Si hay otra solución disponible ... por favor, avíseme ... – Manu

+0

Gracias por todos los esfuerzos – Manu

2

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

Pero ya que es un archivo adjunto, debe vivir con las diferencias del sistema. Si estuviera en su lugar, elegiría una de esas opciones:

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

b) proporcionan 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 podría considerar adjuntar un archivo HTML en lugar de texto sin formato. más portátil y mucho más bonito, también :)

3

No sé quién mira tu archivo, pero si lo abres en wordpad en lugar de 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.

0

encapsular su escritor para proporcionar reemplazo de carbón, así:

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

}