1、输入流和输出流
我们在提到File类的时候,就说过Java对于输入和输出操作是以 “流” 的形式来体现的,另外,所谓的输入和输出是针对内存来讲的,根据数据的传输方向,往内存中读,叫输入流;从内存中往外写,叫输出流。
上面这张图应该很形象了,接下来要说的是:
- 所有输入流都是InputStream类或Reader类的子类
- 类名以InputStream结尾的类都是InputStream类的子类
- 类名以Reader结尾的类都是Reader类的子类
- 所有输出流都是OutputStream类或Writer类的子类
- 类名以OutputStream结尾的类都是OutputStream类的子类
- 类名以Writer结尾的类都是Writer类的子类
可以从java.io包里的类来感受一下这个概念:
2、字节流和字符流
同样作为输入或者输出的流类,为什么会有形如InputStream和Reader两种类呢?因为它们在数据流的编码格式上有进一步的划分:
- InputStream / OutputStream 子类都是字节流
- 读写二进制文件,主要处理音频、图片、歌曲等
- 处理单元为1个字节 1byte
- Reader / Writer 子类都是字符流
- 处理字符或字符串
- 处理单元为2个字节 2byte
- 字符流将读取到的字符数据,去指定的编码表中获取对应文字
(题外话:我们说脱离编码谈字符是没有意义的,同一个汉字不同编码下可能所占字节数完全不同,实际上Java的char本质上是UTF-16编码,若某个抽象字符在UTF-16下占4个字节,实际上还是无法放入char的)
字节流中常用类
- 字节输入流 FileInputStream
- 字节输出流 FileOutputStream
字符流中常用类
- 字符输入流 FileReader
- 字符输出流 FileWriter
另,为了方便操作,字节流可以转换为字符流,以更高效地处理字符数据:
- InputStreamReader(InputStream in)
- InputStreamReader(InputStream in, String charsetName)
- OutputStreamWriter(OutputStream out)
- OutputStreamWriter(OutputStream out, String charsetName)
读入字节,并根据指定的编码方式,将之转换为字符流。编码方式可以由名称指定,或平台可接受的缺省编码方式。