2014-11-06 52 views
3

複製文件,我嘗試了一些強制性的參數拷貝文件:inputEncodingoutputEncodingoutputLineSeparator的Java 6的readline

但是,當我運行下面的代碼,我與CRLF最終字符的文件沒有很好地複製,這最後CRLF焦炭disapear。

我認爲3行之後的readLine返回null,因爲4號線是空的...


我的目標是要找到的CopyFile函數,能夠嚴格複製這個以下兩個文件。
有沒有辦法複製這個最後的空行(最後一個換行符)?


在此先感謝您的幫助。


輸入文件
文件testInEndNL.txt(顯式字符)

A<CRLF> 
B<CRLF> 
C<CRLF> 

文件testOutEndEOF.txt(顯式字符)

A<CRLF> 
B<CRLF> 
C 


輸出文件
文件testOutEndNL.txt(顯式字符)KO

A<LF> 
B<LF> 
C 

文件testInEndEOF.txt(顯式字符)OK

A<LF> 
B<LF> 
C 


代碼

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.nio.charset.Charset; 


public class TestEncoding { 

    public static void main(String[] args) { 
     File src; 
     File dst; 
     Charset inputEncoding; 
     Charset outputEncoding; 
     String outputLineSeparator; 

     inputEncoding = Charset.defaultCharset(); 
     outputEncoding = Charset.forName("UTF-16"); 
     outputLineSeparator = "\n"; 

     src = new File("C:\\Users\\Dam\\Desktop\\testFiles\\testInEndNL.txt"); 
     dst = new File("C:\\Users\\Dam\\Desktop\\testFiles\\testOutEndNL.txt"); 
     copyFile(src, dst, inputEncoding, outputEncoding, outputLineSeparator); 

     src = new File("C:\\Users\\Dam\\Desktop\\testFiles\\testInEndEOF.txt"); 
     dst = new File("C:\\Users\\Dam\\Desktop\\testFiles\\testOutEndEOF.txt"); 
     copyFile(src, dst, inputEncoding, outputEncoding, outputLineSeparator); 

    } 

    private static void copyFile(File src, File dst, Charset inputEncoding, Charset outputEncoding, String outputLineSeparator) { 
     try { 
      String oldLineBreak = System.setProperty("line.separator", outputLineSeparator); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(src), inputEncoding)); 
      BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(dst), outputEncoding)); 
      String line = reader.readLine(); 
      if(line != null) writer.write(line); 
      while ((line = reader.readLine()) != null) { 
       writer.newLine(); 
       writer.write(line); 
      } 
      reader.close(); 
      writer.close(); 
      System.setProperty("line.separator", oldLineBreak); 
     } 
     catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

你真的指Java 6嗎?你甚至不能使用Java 7嗎? – fge 2014-11-06 20:39:38

+0

'System.setProperty'中的方法?祝你好運多線程 – zapl 2014-11-06 20:58:49

+0

不,因爲我的問題我必須留在JAVA 6 – Damien 2014-11-06 21:09:15

回答

1

簡短的回答是,你不能用.readLine()來做,因爲它會去掉行尾字符。

您將需要使用.read(),而不是逐字符讀取,並執行您自己的EOL處理。這將返回int,但可以將其轉換爲char

char c = (char)reader.read(); 

一個CR/LF會出來作爲兩個獨立的字符,所以你必須相應地留意是否和過程。如果你知道你的文件只有CR/LF或LF,那麼它會更容易一些,因爲每當你閱讀一個CR時,你就知道一個LF跟在後面。

您正在閱讀的字節數不會變化。您將默認以UTF-8的形式讀取它們,它將始終將CR和LF編碼爲單字節字符。在int的條款中,它們分別以13和10出現。

+0

哦,那麼差... 感謝您的回答 如果我用讀取,我怎麼能檢測到來自不同編碼的幾行結束(LF,CRLF,CR)? 讀取返回一個int,例如「CRLF」是2 int(字節)長,字節可能與一些奇怪的編碼不同... – Damien 2014-11-06 20:45:59

+0

@Damien我已經更新了相應的答案。 – 2014-11-06 20:55:26

+0

噢好吧,所以我們確信read只會得到一個字節(8位)?
我想要像readLine那樣做,我們只有LF,CRLF和CR? 另一個問題是inputEncoding可能會有所不同,因此編碼字節並不總是相同的。 Sory for brain toture:/ – Damien 2014-11-06 21:06:54