Java中的回车\换行

时间:2010-05-14 08:25:02

标签: java carriage-return line-endings eol linefeed

我使用Java代码在Unix环境中创建了一个文本文件。

为了编写文本文件,我使用的是java.io.FileWriterBufferedWriter。对于每行后的换行符,我使用的是bw.newLine()方法(其中bwBufferedWriter的对象)。

我通过附加来自Unix环境本身的邮件(使用Unix命令自动执行)发送该文本文件。

我的问题是,在我从Windows系统中的邮件下载文本文件后,如果我 打开该文本文件,数据未正确对齐。 newline()字符是 不工作,我想是的。

我希望在Unix环境中使用相同的文本文件对齐,如果我打开了 Windows环境中的文本文件也是。

如何解决问题?

以下Java代码供您参考(在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 个答案:

答案 0 :(得分:59)

Java只知道它当前运行的平台,因此它只能在该平台上为您提供与平台相关的输出(使用bw.newLine())。您在Windows系统上打开它的事实意味着您必须在使用之前转换文件(使用您编写的内容或使用unix2dos之类的程序),或者您必须使用Windows输出文件格式化进程最初在Java程序中返回。因此,如果您知道该文件将始终在Windows机器上打开,则必须输出

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

值得注意的是,如果它只是您正在使用的纯文本,您将无法输出在两个平台上看起来都正确的文件,如果是电子邮件,您可能需要考虑使用html,或者xml如果是数据。或者,您可能需要某种类型的客户端来读取数据,然后将其格式化为查看者正在使用的平台。

答案 1 :(得分:7)

方法newLine()确保添加与平台兼容的新行(0Dh 0Ah用于DOS,0Dh用于较旧的Mac,0Ah用于Unix / Linux)。 Java无法知道您要在哪个平台上发送文本。邮件发送实体应该对此转换进行处理。

答案 2 :(得分:4)

不知道是谁查看了您的文件,但如果您在wordpad而不是记事本中打开它,则换行符将显示正确。如果您正在使用特殊的文件扩展名,请将其与wordpad相关联,然后您就完成了它。或者使用任何其他更高级的文本编辑器。

答案 3 :(得分:2)

bw.newLine();无法确保与所有系统的兼容性。

如果您确定要在Windows中打开它,可以将其格式化为windows换行符。

如果您已经在使用本机unix命令,请尝试unix2dos并将已生成的文件转换为Windows格式,然后发送邮件。

如果您没有使用unix命令并且更喜欢在java中使用它,请使用``bw.write(“\ r \ n”)`并且如果它不会使您的程序复杂化,请使用一种方法来查找操作系统并写入适当的换行符。

答案 4 :(得分:2)

如果我理解正确,我们会谈论文本文件附件。 多数民众赞成不幸,因为如果是电子邮件的邮件正文,你可以随时使用“\ r \ n”,参考http://www.faqs.org/rfcs/rfc822.html

但是因为它是一个附件,你必须忍受系统差异。如果我在你的鞋子里,我会选择其中一种选择:

a)仅使用“\ r \ n”作为行结束来支持Windows客户端。

b)提供两个附件文件,一个是linux格式,另一个是windows格式。

c)我不知道附件是由人或机器读取,但如果是人,我会考虑附加HTML文件而不是纯文本。更便携,更漂亮:))

答案 5 :(得分:0)

封装你的编写器以提供char替换,如下所示:

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

}