Java中的回车\换行
Posted
技术标签:
【中文标题】Java中的回车\\换行【英文标题】:Carriage Return\Line feed in JavaJava中的回车\换行 【发布时间】:2011-02-19 10:31:03 【问题描述】:我在 Unix 环境中使用 Java 代码创建了一个文本文件。
为了编写文本文件,我使用了java.io.FileWriter
和BufferedWriter
。对于每一行之后的换行符,我使用bw.newLine()
方法(其中bw
是BufferedWriter
的对象)。
我通过从 Unix 环境本身附加邮件来发送该文本文件(使用 Unix 命令自动执行)。
我的问题是,在我从 Windows 系统的邮件中下载文本文件后,如果我
打开该文本文件,数据未正确对齐。 newline()
字符是
不工作,我想是的。
如果我打开 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();
【问题讨论】:
你为文本使用了代码块? 打开文件的目标系统会一直是windows,还是会有所不同? 【参考方案1】:Java 只知道它当前运行的平台,因此它只能在该平台上为您提供与平台相关的输出(使用bw.newLine()
)。你在windows系统上打开它意味着你要么必须在使用它之前转换文件(使用你写的东西,或者使用像unix2dos这样的程序),或者你必须用windows格式输出文件最初在您的 Java 程序中返回。因此,如果您知道文件将始终在 Windows 机器上打开,则必须输出
bw.write(rs.getString(1)==null? "":rs.getString(1));
bw.write("\r\n");
值得注意的是,如果您使用的只是纯文本,您将无法输出在两个平台上看起来都正确的文件,如果是电子邮件,您可能需要考虑使用 html,或者xml 如果是数据。或者,您可能需要某种客户端来读取数据,然后针对查看器使用的平台对其进行格式化。
【讨论】:
Windows 上的行尾序列是 CR LF,而不是 LF CR,所以我将其更改为br.write("\r\n");
(而不是 \n\r
)。
@Jesper - 谢谢,我已经相应地更新了它,我知道它在那里或附近
如果我在 Windows 系统中运行相同的代码,我会得到相同的文本文件吗?还是文本文件现在有 \r\r\n
(第二个 \r
由 Windows Java 扩展 \n
到 \r\n
)?
没关系,我发现\n
被Windows Java 不转换为\r\n
。在您的字符串中使用\r
和/或\n
实际上强制 特定的行结束样式独立 运行Java 的平台。
@ADTC 没有任何东西可以自动转换 - 在本例中,您将原始字节值写入文件【参考方案2】:
newLine()
方法确保添加了与平台兼容的新行(0Dh 0Ah
用于 DOS,0Dh
用于旧 Mac,0Ah
用于 Unix/Linux)。 Java 无法知道您将在哪个平台上发送文本。这种转换应该由邮件发送实体负责。
【讨论】:
我没有得到你。你能解释一下吗? 假设您在 Linux 中使用您最喜欢的编辑器编辑文本。当你按下回车时它会做什么?它将附加一个换行符。在这样做之前,他会问自己:我的换行符是什么?作为 Linux,他会回答:0Ah
当然。如果将此文本发送到 windows 机器,windows 机器负责将 0Ah
转换为 0Dh 0Ah
否则查看文本将不会很有趣。
@James:当前目标系统是 Windows。但一段时间后可能会有所不同。任何帮助将不胜感激。【参考方案3】:
不知道谁在查看您的文件,但如果您在写字板而不是记事本中打开它,则换行符会显示正确。如果您使用特殊的文件扩展名,请将其与写字板相关联,然后就完成了。或者使用任何其他更高级的文本编辑器。
【讨论】:
记事本可能是唯一显示错误文件的编辑器【参考方案4】:bw.newLine();
无法确保与所有系统兼容。
如果确定要在windows中打开,可以格式化为windows换行符。
如果您已经在使用原生 unix 命令,请尝试 unix2dos
并将已生成的文件转换为 windows 格式,然后发送邮件。
如果您不使用 unix 命令并且更喜欢在 java 中执行,请使用 ``bw.write("\r\n")`,如果它不会使您的程序复杂化,请使用一种方法来找出操作系统并写入适当的换行符。
【讨论】:
@james:我正在尝试使用 bw.write("\r\n");完成后,让你们知道...现在 嗨哥们..它的工作..暂时我会用它。如果有任何其他可用的解决方案..请告诉我....【参考方案5】:如果我没听错的话,我们讨论的是文本文件附件。 这很不幸,因为如果它是电子邮件的消息正文,您总是可以使用“\r\n”,指的是http://www.faqs.org/rfcs/rfc822.html
但由于它是一种依恋,你必须忍受系统差异。如果我处于你的位置,我会选择以下选项之一:
a) 仅支持 windows 客户端,使用 "\r\n" 作为行尾。
b) 提供两个附件文件,一个是linux格式的,一个是windows格式的。
c) 我不知道附件是供人阅读还是机器阅读,但如果是人,我会考虑附加 HTML 文件而不是纯文本。更便携也更漂亮:)
【讨论】:
【参考方案6】:封装您的编写器以提供字符替换,如下所示:
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();
【讨论】:
以上是关于Java中的回车\换行的主要内容,如果未能解决你的问题,请参考以下文章