我使用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();
}
答案 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();
}
}