Java 中的回车\换行

问题描述 投票:0回答:6

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

为了编写文本文件,我使用

java.io.FileWriter
BufferedWriter
。对于每行之后的换行符,我使用
bw.newLine()
方法(其中
bw
BufferedWriter
的对象)。

我通过从 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();
}
java carriage-return line-endings eol linefeed
6个回答
63
投票

"\r\n"

Java 只知道它当前运行的平台,因此它只能为您提供该平台上依赖于平台的输出(使用

bw.newLine()
)。 事实上,你在 Windows 系统上打开它意味着你要么必须在使用它之前转换文件(使用你编写的东西,或使用像 unix2dos 这样的程序),要么你必须使用 windows 格式回车输出文件最初在您的 Java 程序中返回它。 因此,如果您知道该文件将始终在 Windows 计算机上打开,则必须输出

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

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


7
投票

方法

newLine()
确保添加平台兼容的新行(
0Dh 0Ah
适用于DOS,
0Dh
适用于旧版Mac,
0Ah
适用于Unix/Linux)。 Java 无法知道您要在哪个平台上发送文本。此转换应由邮件发送实体负责。


4
投票

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


2
投票

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

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

如果您已经在使用本机unix命令,请尝试

unix2dos
并将已生成的文件转换为Windows格式,然后发送邮件。

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


2
投票

如果我没理解错的话,我们讨论的是文本文件附件。 这很不幸,因为如果它是电子邮件的消息正文,您始终可以使用“ ”,参考http://www.faqs.org/rfcs/rfc822.html

但由于它是附件,因此您必须忍受系统差异。如果我处于你的立场,我会选择以下选项之一:

a) 仅支持 Windows 客户端,使用“ " 作为行尾。

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

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


0
投票

封装您的 writer 以提供字符替换,如下所示:

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

}
© www.soinside.com 2019 - 2024. All rights reserved.