web-dev-qa-db-fra.com

Retour chariot\Line feed en Java

J'ai créé un fichier texte dans un environnement Unix à l'aide de code Java.

Pour écrire le fichier texte, j'utilise Java.io.FileWriter et BufferedWriter. Et pour newline après chaque ligne, j'utilise la méthode bw.newLine() (où bw est un objet de BufferedWriter).

Et j’envoie ce fichier texte en joignant un courrier provenant de l’environnement Unix lui-même (automatisé à l’aide de commandes Unix).

Mon problème est, après avoir téléchargé le fichier texte à partir d'un courrier sous un système Windows, si j'ouvre ce fichier texte, les données ne sont pas correctement alignées. Le caractère newline() est ne fonctionne pas, je pense que oui.

Je veux le même alignement de fichier texte que dans l’environnement Unix, si j’ouvrais aussi le fichier texte Dans l’environnement Windows.

Comment résoudre le problème?

Code Java ci-dessous pour votre référence (fonctionnant dans un environnement 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();
}
49
Manu

Java ne connaît que la plate-forme sur laquelle il s'exécute actuellement, il ne peut donc vous fournir qu'une sortie dépendante de la plate-forme sur cette plate-forme (à l'aide de bw.newLine()). Le fait que vous l'ouvriez sur un système Windows signifie que vous devez soit convertir le fichier avant de l'utiliser (en utilisant quelque chose que vous avez écrit, soit en utilisant un programme tel que unix2dos ), ou vous devez le sortir avec Windows format chariot retourne dedans à l'origine dans votre programme Java. Donc, si vous savez que le fichier sera toujours ouvert sur une machine Windows, vous devrez sortir 

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

Il est à noter que vous ne pourrez pas sortir un fichier qui aura l'air correct sur les deux plates-formes s'il s'agit simplement de texte brut, vous pouvez envisager d'utiliser le langage HTML s'il s'agit d'un courrier électronique ou xml s'il s'agit est des données. Sinon, vous aurez peut-être besoin d'un type de client qui lit les données, puis les formate pour la plate-forme utilisée par le visualiseur.

59
James B

La méthode newLine() permet d’ajouter une nouvelle ligne compatible avec la plate-forme (0Dh 0Ah pour DOS, 0Dh pour les anciens Mac, 0Ah pour Unix/Linux). Java n'a aucun moyen de savoir sur quelle plate-forme vous allez envoyer le texte. Cette conversion devrait être prise en charge par les entités d'envoi de courrier.

7
nc3b

Je ne sais pas qui regarde votre fichier, mais si vous l'ouvrez dans WordPad au lieu de Bloc-notes, les sauts de ligne seront corrects Si vous utilisez une extension de fichier spéciale, associez-la à WordPad et vous avez terminé. Ou utilisez un autre éditeur de texte plus avancé.

4
Axel

Si je vous ai bien compris, nous parlons d’une pièce jointe à un fichier texte . C’est regrettable, car s’il s’agissait du corps du message, vous pouvez toujours utiliser "\ r\n" en faisant référence à http: //www.faqs .org/rfcs/rfc822.html

Mais comme c'est une pièce jointe, vous devez vivre avec les différences de système. Si j'étais à votre place, je choisirais l'une de ces options:

a) supporte uniquement les clients Windows en utilisant "\ r\n" comme fin de ligne.

b) fournissez deux fichiers joints, l’un au format Linux et l’autre au format Windows.

c) Je ne sais pas si la pièce jointe doit être lue par des personnes ou des machines, mais si ce sont des personnes, je envisagerais de joindre un fichier HTML au lieu d'un texte brut. plus portable et beaucoup plus joli aussi :)

2
rompetroll

bw.newLine(); ne peut pas assurer la compatibilité avec tous les systèmes.

Si vous êtes sûr que cela va s'ouvrir dans Windows, vous pouvez le formater en windows newline.

Si vous utilisez déjà des commandes Unix natives, essayez unix2dos et convertissez le fichier déjà généré au format Windows, puis envoyez le courrier.

Si vous n'utilisez pas de commandes unix et préférez le faire en Java, utilisez `` bw.write ("\ r\n") `et si cela ne complique pas votre programme, utilisez une méthode qui détecte le système d'exploitation et écrit la nouvelle ligne appropriée.

2
Vaishak Suresh

Encapsulez votre rédacteur pour fournir le remplacement de caractères, comme ceci:

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

}
0
The Felis Leo