为什么FileOutputStream在文件的开头添加了null和传输结束字符?

时间:2013-04-13 18:33:46

标签: java file-io

为什么要关注代码

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

}

在文件的开头生成带有“null”和eot字符的文件,然后是“test”?我预计它会生成只有“test”的文件,没有额外的东西。

1 个答案:

答案 0 :(得分:3)

来自DataOutputStream.writeUTF()的Javadoc:

  

首先,将两个字节写入输出流,就好像通过   writeShort方法给出要遵循的字节数。这个值是   实际写出的字节数,而不是长度   串。在长度之后,输出字符串的每个字符,   按顺序,使用修改后的UTF-8编码作为字符。   [...]

所以它不是2个字符,而只是2个字节。

DataOutputStream的目的是:

  

数据输出流允许应用程序编写原始Java数据   以便携方式输出流的类型。然后,应用程序可以使用数据输入流来重新读取数据。

另请注意,建议使用NIO2 API和自动资源管理。并且不要用String包装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);
}