Java中的回车换行符("\r\n")

3

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

为了写入文本文件,我使用java.io.FileWriter和BufferedWriter。 每一行后面都要用bw.write("\r\n")方法换行。 (其中bw是BufferedWriter对象)并将该文本文件作为附件从Unix环境本身发送到其他环境,如(主机,Windows)

我的问题是,如果我的客户在Mainframe系统中下载文本文件, 他们会发现在文本文件中存在一个“特殊字符”(如小矩形框) 呈现,数据未正确对齐。

我认为bw.write("\r\n")不起作用..(但在Windows中运行良好)。

我希望文本文件与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();
}

他们正在使用哪个大型计算机系统?他们使用什么程序打开它? - Matthew Flaschen
适用于所有主机版本的“@”。 - Manu
1
所以你想要一个文件,可以在任何主机上的任何操作系统上打开,不仅不考虑它使用的行终止符,而且还要考虑它的默认字符编码是什么?祝你好运... - Jon Skeet
@Jon,你的理解完全正确...... - Manu
2个回答

7
与您的说法相反,您的代码显然没有在每行后面写入"\r\n"。它调用了BufferedWriter.newLine(),该方法使用当前平台的默认换行符(除非您明确设置了line.separator系统属性)。在Unix系统上,这将是"\n"。
现在,您需要考虑在将其读取的目标系统上希望得到什么结果。对于Windows系统,这意味着您应该明确地写入"\r\n"...但我不知道您提到的大型计算机的情况 - 您需要提供更多详细信息。
请注意,有不同的换行符可用意味着没有一个文本文件将是普遍适用的。许多不同平台上的文本编辑器都可以处理任何换行符...但总会有一些不能:(

1
写入环境正确的行尾的文件,推荐使用的类是PrintWriterprintln(String) 方法将给定的字符串和适当的行尾输出到输出文件。

Jon Skeet是正确的,你的问题不是技术上的,而是要弄清楚在哪个系统上需要哪种文件格式。如果一个文件在Windows系统上处理,那么预期行末应该是\r\n;在Unix系统上,只有\n

当你使用FTP在不同的系统之间传输文件时,所有这些都变得更加复杂:ASCII模式将自动为您翻译行尾,而二进制则不会。

电子邮件对文本格式也不友好:Outlook经常会毁坏跨系统边界发送的文本文件。

在SO上的人们了解这种情况。给我们更多细节,我们可以提出解决方案。但很可能无法在一个系统上编写正确读取任何系统的文件。


PrintWriter很讨厌 - 它会吞掉异常,这是一个非常糟糕的想法。个人建议明确写入行分隔符,如果你想要的不是平台的默认值。 (我不喜欢为此设置系统属性。只需明确即可。) - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接