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();
}
Foi útil?

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

}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top