b站 Java教程 https://www.bilibili.com/video/BV18J411W7cE?p=288
1 字节缓冲流
- BufferedOutputStream:缓冲输出流,通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用。
- BufferedInputStream:为另一个输入流添加了功能,即缓冲输入并支持mark和reset方法的功能。创建BufferedInputStream将创建一个内部缓冲区数组。当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节。mark操作会记住输入流中的一个点,并且reset操作会导致从最近的mark操作读取的所有字节在从包含的输入流中取出新字节之前重新读取。
-
import java.io.*; public class FileOutputStreamDemo { public static void main(String[] args) throws IOException { //写数据 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("idea_test\\fos.txt")); bos.write("hello\r\n".getBytes()); bos.write("world\r\n".getBytes()); bos.close(); //读数据 BufferedInputStream bis = new BufferedInputStream(new FileInputStream("idea_test\\fos.txt")); // int by; // while((by = bis.read())!= -1){ // System.out.print((char)by); // } int len; byte[] bys = new byte[1024]; while((len = bis.read(bys)) != -1){ System.out.print(new String(bys,0,len)); } bis.close(); } }
2 字符流
- 为什么会出现字符流:
- 一个汉字存储,如果是GBK编码,占用2个字节;如果是UTF-8编码,占用三个字节
- 编码表
- 字符流抽象基类
- Reader:字符输入流的抽象类
- Writer:字符输出流的抽象类
- 与编码解码相关的字符流类
- InputStreamReader:是从字节流到字符流的桥梁,它读取字节,并使用指定的charset将其解码为字符。它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
- OutputStreamWriter:是从字符流到字节流的桥梁,使用指定的charset将写入的字符编码为字节。它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集
3 字符流读写数据的方式
- 写数据
- 流在关闭之前会先刷新
- 读数据
- InputStreamReader 的子类 FileReader,是读取字符文件的便捷类
- OutputStreamWriter的子类FileWriter,是写字符文件的便捷类
- 但是如果涉及到编码解码问题,还是得用转换流、
4 字符缓冲流
- BufferedReader(Reader in):从字符输入流读取文本,缓冲字符,以提供字符、数组和行的高效读取;可以指定缓冲区大小,或者可以用默认大小。默认值足够大,可用于大多数用途
- BufferedWriter(Writer out):将文本写入字符输出流,缓冲字符,以提供单个字符、数组和字符串的高效写入;可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途
- 特有功能
- readLine()读到的内容不包括换行符
- 字符缓冲流复制文件