字符(Character)流与字节(Byte)流
先说说区分:
字节流按字节读写,字符流按字符读写。字节流属于全能流,可以读取任意形式的二进制流。字符流只能读取字符文本此类。
比较好区分的方法:
以Stream结尾的相关流类都是字节流,以reader、writer结尾的都是字符流。字符流使用缓冲区作为中介帮助读写流文件。好处显而易见,多了一个缓冲区。不够好的地方就是不显示flush、close的话可能导致本次操作白给。
fileOutputStream.write(new String("hello dabai").getBytes());
如上字节流即便不手动close 内容也能写入。
fileWriter.write("hello dabai");
上述字符流如果不手动flush的话那就白给了。
一般情况下,可以认为字节流更好,因为用的比较多,使用场景也更常见。
流的分类:
InputStream是所有字节输入流的祖先,OutputStream是所有字节输出流的祖先,都是抽象类,都实现了closeable接口,其中OutputStream还实现了Flushable接口。
Reader是所有读入字符串输入流的祖先,Writer是所有写出字符串输出流的祖先,两类中都有char类型的数组作为缓冲,Reader实现了 Readable, Closeable 两接口,Writer实现了Appendable, Closeable, Flushable接口。同时这两个抽象类属性都包含一个属性
protected Object lock;
该属性在构造函数中指向当前类this,在Writer中write方法使用synchronized加了锁
在Reader中则是提供了一个抽象方法交给子类实现
InputStream、OutputStream都用于处理二进制数据,即处理字节。但实际上处理字符的情况也不少,所以有了字符流,它是按照jvm的encode来处理的,进行字符集的转化。二者可以通过InputStreamReader和OutputStreamWriter关联,这两个类分别继承自Reader、Writer。构造函数都需要一个字节流对象,InputStreamReader类中包含一个属性StreamDecoder,OutputStreamWriter类中包含一个属性StreamEncoder,这类属性也是实际完成read、write、close以及flush的对象。这类属性同样属于Reader、Writer的子类,但是他们对Stream进行对应的字符编码并进行字符形式的输入输出。