2013-01-11 42 views
3

對於大型字符串(大約60MB左右),FileWriter會將額外的null附加到我的文件末尾。對於小字符串,此代碼按預期工作。FileWriter在文件結尾處寫入額外的空值

爲了清楚起見,dat和filePath是字符串。

FileWriter fstream = new FileWriter(filePath); 
fstream.write(dat); 
fstream.close(); 

File f = new File(filePath);   
System.out.println("Data: " + dat.length() + ", File: " + f.length()); 

總之,在什麼情況下,兩個印刷值應該不同?

這裏是我的示例輸出:

Data: 63833144, File: 63833728 

我在文件末尾出於某種原因有584多null秒。我覺得這個字符串可能已經被分配了,但是這些不應該被打印到文件中,對嗎?更糟的是,如果我明確地給它的長度:

fstream.write(dat, 0, dat.length()); 

行爲是一樣的。巧合的是,如果我說(dat.length() - 584),它做我想要的,但只在這個特定的情況。

任何想法?

JDK版本:1.7.0_02

編輯:添加的文件類型變量(包括字符串)

+2

'dat'是一個'String',是嗎?你的'String'是否包含任何特殊字符?你知道你正在比較字符串中字符串的長度和文件長度(以字節爲單位)嗎?不一定是一樣的。 –

+0

@TomaszNurkiewicz我知道沒有Unicode編碼會在編碼字符串的末尾添加584個無關的空值。 – millimoose

+0

'dat'是一個char []'數組嗎? –

回答

1

文件長度取決於編碼。該測試

System.out.println(dat.getBytes().length); 

將顯示在編碼之後字節長度,因爲String.getBytes將使用相同的編碼(默認)爲new FileWriter(file)

+0

是的,結果顯示字符串中的584個字符是多字節字符,並且說明了大小的差異。他在輸出中的實際錯誤是因爲它們被讀取的方式將所有多字節字符推送到單個字節中,在結尾留下額外的\ 0。 –

1

我建議你從不使用FileWriter的,因爲它是用你的平臺上的默認編碼字符串轉換爲字節流。

相反,你應該這樣做:

Writer writer = 
    new OutputStreamWriter( 
    new FileOutputStream(fileName), 
    // Always specify encoding compatible with your string 
    "UTF-8" 
); 

try 
{ 
    writer.write(dat); 
    writer.flush(); 
} 
finally 
{ 
    writer.close(); 
} 

此外,字符串長度,生成的字節流長度不必匹配。它們只會匹配ASCII文本字符串。

+0

有關編碼的一般建議,但它不能解釋OP正在看到的行爲。 – millimoose

+0

@millimoose。很難繼續提供OP提供的有限數量的信息。 'dat'是'String'還是'char []'?是'dat' ASCII還是非ASCII?等 –

+0

我嘗試過使用那種作家,相同的結果。 –

2

什麼是「dat」?如果「dat」是一個StringBuffer,你需要小心。如果StringBuffer的長度大於它的內容,那麼空值將被追加到最後。你可以嘗試使用dat.toString()。我相信空字符將在轉換中被修剪。

+1

你有這種行爲的任何引用(如錯誤報告)嗎?因爲在這種情況下'StringBuffer'(或'StringBuilder')的行爲應該和其他的'CharSequence'一樣。 – parsifal

+0

檢查Javadoc的setLength()方法。它提供了一些關於StringBuffer在幕後如何表現長度和空值的指示。 http://docs.oracle.com/javase/6/docs/api/java/lang/StringBuffer.html#setLength(int) – mightyrick

+0

它是一個字符串,但我注意到.getBytes()。該字符串的長度比.length()長584,因此與上面輸出的值相匹配。我不知道在60MB文件中究竟發生了什麼584次。 –

0

這樣跑了63833144一長串的測試,只有「在其A和輸出是: 數據:63833144,文件:63833144

所以我敢肯定,這個問題是一個編碼的問題。

(我會後本作評論,但因爲我沒有50代表我不是能:/)

+0

我同意這可能是一種編碼問題,我想我只是不確定如何解決它。嘗試按照下面的建議做一個UTF-8編寫器,並且具有相同的問題。 –

+0

@ChadMourning Hm這並不能解釋問題,但它可以工作,但是 PrintStream print = new PrintStream(new FileOutputStream(「test.txt」)); print .print(s); – maxammann

相關問題