Retorno de transporte Feed de linha em Java
-
26-09-2019 - |
Pergunta
Eu criei um arquivo de texto no ambiente Unix usando o código Java.
Para escrever o arquivo de texto que estou usando java.io.FileWriter
e BufferedWriter
. E para newline após cada linha, estou usando bw.newLine()
método (onde bw
é objeto de BufferedWriter
).
E estou enviando esse arquivo de texto anexando em e -mail do próprio ambiente do Unix (automatizado com os comandos do UNIX).
Meu problema é que, depois de baixar o arquivo de texto do correio em um sistema Windows, se eu abrir esse arquivo de texto, os dados não estão alinhados corretamente. newline()
O personagem não está funcionando, acho que sim.
Eu quero o mesmo alinhamento de arquivo de texto que está no ambiente do UNIX, se também abrir o arquivo de texto no ambiente do Windows.
Como resolvo o problema?
Código Java abaixo para sua referência (em execução no ambiente 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();
}
Solução
Java sabe apenas sobre a plataforma em que está em execução atualmente, para que só possa fornecer uma saída dependente da plataforma nessa plataforma (usando bw.newLine()
). O fato de você abri -lo em um sistema Windows significa que você precisa converter o arquivo antes de usá -lo (usando algo que você escreveu ou usando um programa como unix2dos), ou você deve emitir o arquivo com o retorno do transporte do formato do Windows originalmente no seu programa Java. Portanto, se você souber que o arquivo sempre será aberto em uma máquina Windows, você terá que produzir
bw.write(rs.getString(1)==null? "":rs.getString(1));
bw.write("\r\n");
Vale a pena notar que você não será capaz de produzir um arquivo que parecerá correto nas duas plataformas, se for apenas um texto simples que você está usando, considere usar o HTML se for um email ou XML se ele são dados. Como alternativa, você pode precisar de algum tipo de cliente que lê os dados e o formate para a plataforma que o espectador está usando.
Outras dicas
O método newLine()
Garante que seja adicionada uma nova linha compatível com a plataforma (0Dh 0Ah
para dos, 0Dh
Para Macs mais velhos, 0Ah
para Unix/Linux). Java não tem como saber em qual plataforma você enviará o texto. Essa conversão deve ser atendida pelas entidades de envio de correio.
Não sei quem olha para o seu arquivo, mas se você o abrir no WordPad em vez do bloco de notas, os linebreaks mostrarão correto. Caso você esteja usando uma extensão de arquivo especial, associe -o ao WordPad e termine. Ou use qualquer outro editor de texto mais avançado.
bw.newLine();
não pode garantir a compatibilidade com todos os sistemas.
Se você tem certeza de que será aberto no Windows, você pode formatá -lo no Windows Newline.
Se você já está usando comandos nativos do Unix, tente unix2dos
e converta o arquivo já gerado no formato do Windows e envie o e -mail.
Se você não estiver usando comandos do Unix e preferir fazê -lo em java, use `` bw.write (" r n") `e se não complicar seu programa, tenha um método que descobre o sistema operacional e grava a nova linha apropriada.
Se eu entendi bem, falamos sobre um anexo de arquivo de texto. Isso é lamentável porque, se fosse o corpo da mensagem do e -mail, você sempre pode usar " r n", referindo -se a http://www.faqs.org/rfcs/rfc822.html
Mas, como é um anexo, você deve viver com diferenças do sistema. Se eu estivesse no seu lugar, escolheria uma dessas opções:
a) Apoie apenas clientes do Windows usando " r n" como final de linha.
b) Forneça dois arquivos de anexo, um com formato Linux e outro com formato Windows.
c) Não sei se o anexo deve ser lido por pessoas ou máquinas, mas se forem pessoas, eu consideraria anexar um arquivo HTML em vez de texto simples. mais portátil e muito mais bonito também :)
Encapsule seu escritor para fornecer a substituição de char, assim:
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();
}
}