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