流
流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。
流的种类
字符流
= 字节流
+ 解码
还有其他流
字符流 Reader/Writer
如果读写的都是 字符数据,这时候我们就使用字符流char数组。 以16位的Unicode码表示的字符为基本单位。
FileReader/FileWriter
:文件字符流,用于文写操作默认是使用的是 gbk 编码本文件的读
BufferedReader/BufferedWriter
:加缓冲区的字符流,用于提高效率(内部其实就是维护了一个 8192 个长度的字符数组)
字节流 InputStream/OutputStream
读取到数据 不需要经过编码或者解码的情况情况下这时候使用字节流byte数组。比如:图片数据。
FileInputStream/FileOutputStream
:文件字节流,用于文件的读写操作
BufferedInputStream/BufferedFileOutputStream
:加缓冲区的字节流,用于提高效率(内部其实也是维护了一个 8kb 的字节数组而已)
其他常用流
转换流 InputStreamReader/OutputStreamWriter
包装流ObjectInputStream/ObjectOutputStream
等
字符流与字节流之间的转换
通过byte[]和String来关联。
- 字节变字符流(指定解码方法,否则按虚拟机默认的,可能乱码)
String str = new String(byte[] bytes, String charsetName);
也可以使用转换流InputStreamReader ,它是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。 - 字符变字节流
byte[] data = str.getBytes("UTF-8");```
字节的解码,与字符的编码要一致