回车\用Java换行

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

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

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

我的问题是,我从Windows系统中的邮件下载文本文件后,如果我打开该文本文件的数据没有正确alignment。 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(); } 

Java只知道它正在运行的平台,所以它只能在该平台上给你一个依赖于平台的输出(使用bw.newLine() )。 事实上,你打开它在Windows系统意味着你要么在使用它之前转换文件(使用你写的东西,或使用像unix2dos的程序),或者你必须输出文件的Windows格式回车它最初在你的Java程序中。 所以,如果你知道文件总是在Windows机器上打开,你将不得不输出

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

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

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

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

bw.newLine(); 不能确保与所有系统兼容。

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

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

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

如果我理解你的话,我们谈论一个文本文件附件。 这很不幸,因为如果是邮件的邮件正文,你可以使用“\ r \ n”,参考http://www.faqs.org/rfcs/rfc822.html

但是,因为这是一种依恋,你必须忍受系统的差异。 如果我在你的鞋子,我会select其中的一个选项:

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

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

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

封装你的作家提供字符replace,如下所示:

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