2013-04-13 74 views
1

下面的代碼爲什麼爲什麼FileOutputStream在文件開始處添加空字符和結束字符?

import java.io.DataOutputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 

public class Test { 
    public static void main(String[] args) throws IOException { 
     DataOutputStream out = new DataOutputStream(new FileOutputStream("plik.txt")); 
     String test = new String("test"); 
     out.writeUTF(test); 
     out.close(); 
    } 

} 

產生與「空」和EOT字符在文件的開始,其次是「測試」文件?我預計它會生成只有「測試」的文件,而沒有額外的東西。

+0

事實並非如此。 DataOutputStream.writeUTF()會。看到Javadoc。 – EJP

回答

3

從DataOutputStream.writeUTF()的的Javadoc:

首先,兩個字節被寫入到輸出流中如果由 與writeShort方法給予字節跟隨的數目。這個值是 實際寫出的字節數,而不是 字符串的長度。在長度之後,字符串的每個字符按順序輸出, ,對字符使用修改的UTF-8編碼。 [...]

所以它不是2個字符,只是2個字節。

DataOutputStream類的目的是:

數據輸出流允許應用程序寫基本Java數據類型 到輸出流中的可移植的方式。應用程序然後可以使用數據輸入流來讀取數據。

另請注意,這是建議使用NIO2 API和自動資源管理。並且不要用字符串包裝String。在寫入文件系統時還要爲您的流使用緩衝區。

try (DataOutputStream out = new DataOutputStream(new BufferedOutputStream(Files.newOutputStream(Paths.get("plik.txt")))){ 
     String test = "test"; 
     out.writeUTF(test); 
} 

如果你只想寫一些文字文件以UTF-8,使用下面的代碼:

try (PrintWriter pw = new PrintWriter(Files.newBufferedWriter(Paths.get("plik.txt"), Charset.forName("UTF-8"))){ 
     String test = "test"; 
     pw.print(test); 
} 
+0

「自動」應該是「自動」(我不能編輯這篇文章,因爲這將改變少於6個字符) – Bulwersator

+0

@Bulwersator謝謝,修復它! – Puce

+0

第二個版本不工作 - 「方法writeUTF(字符串)是未定義的類型BufferedWriter」 – Bulwersator

相關問題