Java中的回车\换行

Posted

技术标签:

【中文标题】Java中的回车\\换行【英文标题】:Carriage Return\Line feed in JavaJava中的回车\换行 【发布时间】:2011-02-19 10:31:03 【问题描述】:

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

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

我通过从 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中的回车\换行的主要内容,如果未能解决你的问题,请参考以下文章

java 控制台输出换行

c语言中 将数组列换行 行换列

python给word添加换行换页符

用于打印输出的明智的 python 源代码行换行

Java中的回车\换行

java中的回车和换行的含义及其区别?