看如下代码:

@Test
public void testFileWriter() throws IOException {
FileWriter writer = new FileWriter("test.file");
}

运行如上代码会发生什么?

看起来这个代码是只new了一个FileWriter对象,实际上当这个对象被new出来后,test.file文件内容就已经被清空了,也就是创建对象后没有做任何write, flush以及close等行为。

只是简单的new 了一下,就已经把文件现有内容清空了。这里不单是FileWriter,所有文件相关的output stream都是如此,FileWriter本质上也是创建了一个FileOutputStream。

而FileOutputStream的行为是:

public FileOutputStream(String name) throws FileNotFoundException {
this(name != null ? new File(name) : null, false);
}

也就是默认append是false,最终Java中的所有output stream都会进入c的方法:

/**
* Opens a file, with the specified name, for overwriting or appending.
* @param name name of file to be opened
* @param append whether the file is to be opened in append mode
*/
private native void open0(String name, boolean append)
throws FileNotFoundException;

然后回归到操作系统的的io流,当操作系统以非append的方式去打开一个文件的时候,会冲掉这个文件本身的内容,所以映射到java这个层面,就是创建了一个对象,文件内容没了。


扫码手机观看或分享: