Retour chariotsaut de ligne en Java

J'ai créé un fichier texte dans un environnement Unix en utilisant du code Java.

Pour écrire le fichier texte que j'utilise java.io.FileWriter et BufferedWriter. Et pour la nouvelle ligne après chaque ligne, j'utilise la méthode bw.newLine() (où {[4] } est l'objet de BufferedWriter).

Et j'envoie ce fichier texte en attachant dans le courrier de L'environnement Unix lui-même (automatisé à l'aide des commandes Unix).

Mon problème est, après avoir téléchargé le fichier texte à partir de mail dans un système Windows, si je ouvert ce fichier texte les données ne sont pas correctement aligner. newline() le caractère est pas de travail, je pense que oui.

Je veux le même alignement de fichier texte que dans L'environnement Unix, si j'ai ouvert le fichier texte dans L'environnement Windows aussi.

Comment puis-je résoudre le problème?

Code Java ci-dessous pour votre référence (en cours D'exécution 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();
}
46
demandé sur ADTC 2010-05-14 12:25:02

6 réponses

Java ne connaît que la plate-forme sur laquelle il s'exécute actuellement, donc il ne peut vous donner qu'une sortie dépendante de la plate-forme sur cette plate-forme (en utilisant bw.newLine()). Le fait que vous l'ouvriez sur un système windows signifie que vous devez convertir le fichier avant de l'utiliser (en utilisant quelque chose que vous avez écrit, ou en utilisant un programme comme unix2dos), ou vous devez sortir le fichier avec des retours chariot au format windows à l'origine dans votre programme Java. Donc si vous savez 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 que vous utilisez, vous pouvez envisager d'utiliser html s'il s'agit d'un e-mail, ou xml s'il s'agit de données. Alternativement, vous pouvez avoir besoin d'un type de client qui lit les données, puis les formate pour la plate-forme que le spectateur utilise.

58
répondu James B 2016-02-12 12:09:17

La méthode newLine() assure l'ajout d'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 doit être prise en charge par les entités d'envoi de courrier.

6
répondu nc3b 2010-05-14 08:30:03

Je ne sais pas qui regarde votre fichier, mais si vous l'ouvrez dans wordpad au lieu de notepad, les sauts de ligne s'afficheront corrects. Dans le cas où vous utilisez une extension de fichier spéciale, l'associer à wordpad et vous avez terminé avec elle. Ou utilisez tout autre éditeur de texte plus avancé.

3
répondu Axel 2010-05-14 13:55:22

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

Si vous êtes sûr qu'il va être ouvert dans windows, vous pouvez le formater pour 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, ayez une méthode qui découvre le fonctionnement système et écrit la nouvelle ligne appropriée.

2
répondu Vaishak Suresh 2010-05-14 08:52:32

Si je vous comprends bien, nous parlons d'une pièce jointe au fichier texte. C'est malheureux parce que si c'était le corps du message de l'e-mail, vous pouvez toujours utiliser "\ r \ n", se référant à http://www.faqs.org/rfcs/rfc822.html

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

A) ne prend en charge que les clients windows en utilisant "\r\n" Comme fin de ligne.

B) fournir deux fichiers joints, dont un avec linux format et un avec le 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 considérerais attacher un fichier HTML au lieu de texte brut. plus portable et beaucoup plus jolie, aussi:)

2
répondu rompetroll 2010-05-14 09:16:56

Encapsulez votre writer pour fournir le remplacement de char, 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
répondu The Felis Leo 2017-09-11 12:23:16