我使用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();
}
"\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这是数据。 或者,您可能需要某种客户端来读取数据,然后针对查看者正在使用的平台对其进行格式化。
方法
newLine()
确保添加平台兼容的新行(0Dh 0Ah
适用于DOS,0Dh
适用于旧版Mac,0Ah
适用于Unix/Linux)。 Java 无法知道您要在哪个平台上发送文本。此转换应由邮件发送实体负责。
不知道谁查看您的文件,但如果您在写字板而不是记事本中打开它,换行符将显示正确。如果您使用特殊的文件扩展名,请将其与写字板关联起来,然后就完成了。或者使用任何其他更高级的文本编辑器。
bw.newLine();
无法保证与所有系统的兼容性。
如果你确定要在windows中打开,可以将其格式化为windows换行符。
如果您已经在使用本机unix命令,请尝试
unix2dos
并将已生成的文件转换为Windows格式,然后发送邮件。
如果您不使用 unix 命令并且更喜欢在 java 中执行此操作,请使用``bw.write(" ")`,如果它不会使您的程序复杂化,请使用一种方法来查找操作系统并写入适当的换行符。
如果我没理解错的话,我们讨论的是文本文件附件。 这很不幸,因为如果它是电子邮件的消息正文,您始终可以使用“ ”,参考http://www.faqs.org/rfcs/rfc822.html
但由于它是附件,因此您必须忍受系统差异。如果我处于你的立场,我会选择以下选项之一:
a) 仅支持 Windows 客户端,使用“ " 作为行尾。
b) 提供两个附件文件,一个是linux格式,一个是windows格式。
c) 我不知道附件是由人还是机器阅读,但如果是人,我会考虑附加 HTML 文件而不是纯文本。更便携,也更漂亮:)
封装您的 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();
}
}