2010-05-14 83 views
46

我在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

回答

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

6

的方法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

2

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

2

如果我理解你是對的,我們將討論一個文本文件附件。 那是不幸的,因爲如果是電子郵件的正文,你總是可以用「\ r \ n」,指的是http://www.faqs.org/rfcs/rfc822.html

但因爲它是一個附件,你必須用系統的不同生活。如果我在你的鞋子,我會選擇其中的一個選項:

a)只支持windows客戶端通過使用「\ r \ n」作爲行結束。 b)提供兩個附件文件,一個使用linux格式,一個使用windows格式。

c)我不知道附件是要被人或機器讀取,但如果是人,我會考慮附加一個HTML文件而不是純文本。更便攜,更漂亮:)

3

不知道誰看你的文件,但如果你在寫字板而不是記事本中打開它,換行符將顯示正確。如果您使用的是特殊文件擴展名,請將其與寫字板關聯,然後完成。或者使用任何其他更高級的文本編輯器。

0

封裝你的作家提供字符替換,就像這樣:

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

}