55

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

为了编写我正在使用的文本文件java.io.FileWriterBufferedWriter. 对于每一行之后的换行符,我正在使用bw.newLine()方法(bw对象在哪里BufferedWriter)。

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

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

如果我也在 Windows 环境中打开文本文件,我想要与 Unix 环境中相同的文本文件对齐方式。

我该如何解决问题?

下面的 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();
}
4

6 回答 6

62

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

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

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

于 2010-05-14T08:44:48.297 回答
7

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

于 2010-05-14T08:30:03.987 回答
4

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

于 2010-05-14T13:55:22.223 回答
2

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

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

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

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

于 2010-05-14T08:44:20.213 回答
2

如果我理解正确,我们将讨论文本文件附件。这很不幸,因为如果它是电子邮件的消息正文,您总是可以使用“\r\n”,指的是http://www.faqs.org/rfcs/rfc822.html

但既然是执着,就必须忍受制度差异。如果我站在你的立场上,我会选择以下选项之一:

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

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

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

于 2010-05-14T09:16:56.160 回答
0

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

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

}
于 2017-09-11T12:23:16.190 回答