今天学的是IO流
对流的理解就是:水通过水管传到水龙头。水代表着数据,比如字节或者字符,然后是先进先出的一个方式。
输入流的概念:从源数据源流入程序的过程,可以理解成从源数据源读取数据到程序的过程
输出流的概念:从程序流出源数据源的过程,可以理解成把数据从程序写入目的地的过程
数据源一般指提供数据的原始媒介,一般常见有文件、数据库、云端、其他硬件等能提供数据的媒介。
按照流向可以区分输入流和输出流
输出流是OuttputStream和Writer作为基类
按照处理单元可以区分字节流和字符流
字节流:输入流是InputStream基类,输出流是OutputStream基类
字符流:输入流Reader基类,输出流Writer基类
按照功能可以区分节点流和转换流
OutputStream 是所有字节输出流的抽象父类,提供了
write() 写入一个字节
write(byte[] buf) 写入一定量的字节到输出流
FileInputStream 文件字节输入流,专门用于从文件中读取字节到程序内存中。
FileOutputStream 文件字节输出流,专门用于从内存中写入字节到文件中
注意:
[1]字符串写入文件时一定会存在编码问题
[2]使用utf8编码写入文件时,如果不含中文时,win系统会对文件的编码造成误判。
[3] 通过字节流写入文件时,向管道写入一个字节,该字节立即写入文件中。
总结
InputStream/OutputStream 用于字节的读写。主要用于读取二进制文件(图片、音频、视频),也可以读取文件性文件。
Reader 是字符输入流的抽象父类,提供了
read 一次读取一个字符
read(char[] cbuf) 一次读取多个字符到字符缓冲区cbuf,返回长度表示读取的字符个数。
Writer 是字符输出流的抽象父类,提供了
write
write(char[] cbuf)
write(string)
FileReader 文件字符输入流,专门用于读取默认字符编码文本性文件。
FileWriter 文件字符输出流,专门用于写入默认字符编码的文本性文件。为了提高效率,FileWriter内部存在一个字节缓冲区,用于对待写入的字符进行统一编码到字节缓冲区,一定要在关闭流之前,调用flush方法刷新缓冲区。
InputStreamReader 继承于Reader,是字节流通向字符流的桥梁,可以把字节流按照指定编码 解码 成字符流。
OutputStreamWriter 继承于Writer,是字符流通向字节流的桥梁,可以把字符流按照指定的编码 编码 成字节流。
注意:
[1]win平台默认的utf8编码的文本性文件带有BOM,java转换流写入的utf8文件不带BOM。所以用java读取手动创建的utf8文件会出现一点乱码(?hello中国,?是bom导致的)
[2] 一句话:用字符集编码,一定用字符集解码!!
BufferedReader 继承于Reader,提供了
read
read(char[] cbuf)
readLine() 用于读取一行文本,实现对文本的高效读取。
BufferedReader 初始化时需要一个reader,本质上BufferedReader在reader的基础上增加readLine()的功能。
BufferedWriter继承于Writer,提供了
write
write(char[] cbuf)
write(string)
newline() 写入一个行分隔符。