public static void main(String[] args) throws Exception {
FileOutputStream fileOutputStream = new FileOutputStream("1.txt");
fileOutputStream.write("sdf".getBytes());
}
这样,就是把字符串 “sdf” 写到硬盘上了。
FileOutputStream 继承自 OutputStream,而后者是抽象类,代表的是向外输出的一种意图。
一个抽象类能指望它干什么实在事?
所以 FileOutputStream 也就是第一个干实事的类,工作机制也很简单,字符串转化为字节流,然后把字节流写入到硬盘上。
至于字符串和字节流的映射就是编码的事情了。
flush 方法继承自 OutputStream,FileOutputStream 的实现就是个空函数。
flush 的本意就是对提供了缓存的输出流,一个强制将缓存中数据 flush 的办法。
所以没有提供缓冲功能的 FileOutputStream 的 flush 方法自然是个空方法了。
听说是有个缓冲区,性能会更好,我又不是学底层的,他们说好就好呗。
一个比较争议的问题是,FileWriter 提不提供缓冲功能?
public static void main(String[] args) throws Exception {
Writer writer = new FileWriter("1.txt");
writer.write("sdf");
}
运行后发现,数据没有写到文件了,必须要调用下 flush 方法才行。
其实是有缓冲区
public class StreamEncoder extends java.io.Writer {
private static final int DEFAULT_BYTE_BUFFER_SIZE = 8192;
private volatile boolean isOpen;
private java.nio.charset.Charset cs;
private java.nio.charset.CharsetEncoder encoder;
private java.nio.ByteBuffer bb;
private final java.io.OutputStream out;
private java.nio.channels.WritableByteChannel ch;
private boolean haveLeftoverChar;
private char leftoverChar;
private java.nio.CharBuffer lcb;
就是通过这个类,ByteBuffer 和 CharBuffer 一应俱全,这个类哪冒出来的我也不知道,反正来自 Sun。
另外一个类 BufferWriter,也提供了缓存功能,
而在 nio 中,为所有类型提供了缓存功能。
这设计的还真是。。。。