回车\用Java换行

回车\用Java换行

问题描述:

我在Unix环境下使用Java代码创建了一个文本文件。回车用Java换行

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

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

我的问题是,在我从Windows系统的邮件下载文本文件后,如果我打开该文本文件,数据未正确对齐。 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(); 
} 
+0

时使用的文字代码块? – 2010-05-14 08:29:31

+0

打开文件的目标系统是否总是窗口,还是会有所不同? – 2010-05-14 08:39:56

Java只知道它正在运行的平台,因此它只能在该平台上为您提供平台相关的输出(使用bw.newLine())。您在Windows系统上打开它的事实意味着您必须在使用该文件之前转换文件(使用您已写入的内容或使用类似unix2dos的程序),或者必须使用windows格式的回车输出文件它最初在你的Java程序中。所以,如果你知道文件将始终在Windows机器上打开,你将不得不输出

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

值得一提的是,你不会是能够输出文件,将寻找正确的两个平台上如果它只是纯文本,您可能需要考虑使用html,如果它是电子邮件,或者xml(如果是数据)。或者,您可能需要某种客户端来读取数据,然后将其格式化为查看器正在使用的平台。

+6

在Windows上的行结束序列是CR LF,而不是LF CR,所以我会将其更改为'br.write( “\ r \ n”);'(而不是\ n \ r')。 – Jesper 2010-05-14 11:43:15

+0

@Jesper - 谢谢,我已经更新了它,我知道它在那里或附近 – 2010-05-14 12:20:36

+1

如果我在Windows系统中运行相同的代码,我会得到相同的文本文件吗?或者文本文件现在有'\ r \ r \ n'(Windows Java将'\ n'扩展为'\ r \ n'的第二个'\ r')? – ADTC 2013-12-12 07:45:30

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

+0

我不明白你的意思。你能解释一下吗? – Manu 2010-05-14 08:38:03

+1

假设您在Linux中使用您最喜欢的编辑器编辑文本。当你按下回车键时,它会做什么?它会附加一个换行符。在这之前,他会问自己:我的换行符是什么?作为Linux,他会回答:当然是“0Ah”。如果您将此文本发送到Windows机器,则Windows机器负责将'0Ah'转换为'0Dh 0Ah',否则查看文本不会太有趣。 – nc3b 2010-05-14 08:43:04

+0

@James:目前的目标系统是Windows。但在一段时间后可能会有所不同。 任何帮助,将不胜感激。 – Manu 2010-05-14 08:43:37

bw.newLine();无法确保与所有系统的兼容性。

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

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

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

+0

@james:我想用bw.write(“\ r \ n”); 一旦完成让你们会...现在 – Manu 2010-05-14 09:34:16

+0

嗨伙计..其工作..暂时我会用它。 如果有其他可用的解决方案..请让我知道.... – Manu 2010-05-14 09:47:30

+0

感谢您的所有努力 – Manu 2010-05-14 09:48:40

如果我理解你是对的,我们将讨论一个文本文件附件。 那是不幸的,因为如果是电子邮件的正文,你总是可以用“\ r \ n”,指的是http://www.faqs.org/rfcs/rfc822.html

但因为它是一个附件,你必须用系统的不同生活。如果我在你的鞋子,我会选择其中的一个选项:

a)只支持windows客户端通过使用“\ r \ n”作为行结束。 b)提供两个附件文件,一个使用linux格式,一个使用windows格式。

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

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

封装你的作家提供字符替换,就像这样:

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

}