分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
抽象基类 | InputStream | OutputStream | Reader | Writer |
访问文件 | FileInputStream | FileOutputStream | FileReader |
|
访问数组 | ByteArrayInputStream |
| CharArrayReader |
|
访问管道 | PipedInputStream |
| PipedReader |
|
访问字符串 |
|
| StringReader |
|
缓冲流 | BufferedInputStream |
| BufferedReader |
|
转换流 |
|
| InputStreamReader | OutputStreamWriter |
对象流 | ObjectInputStream |
|
|
|
抽象基类 | FilterInputStream |
| FilterReader |
|
打印流 |
| PrintStream |
|
|
推回输入流 | PushbackInputStream |
| PushbackReader |
|
特殊流 | DataInputStream |
|
|
|
结论:1、上面下划线的代表节点流,必须和指定的物理节点关联,抽象基类无法创建实例。
2、如果输入输出的是文本内容,则应该用字符流,如果是二进制的则应该使用字节流
3、字节流用byte[] bbur=new byte[]然后调用字节流进行封装read(bbuf);字符流则用char[] c=new char[32]数组进行封装
4、字节流可以通过InputStreamReader或OutputStreamWriter进行转换成相应的字符流
5、注意上面字节流虽然读取的是byte但是实际用read方法读入的是int类型,然后调用write方法的时候把int又转换成byte读取,OutputStream的write()方法参数可以是字节或者int,但往往write会截取8个二进制位(0-255),多余的位就抛弃。read的时候把byte强制转型为int,write的时候相反,主要是因为字节流如果读取的是byte的话那么八个字节如果是1111 1111的话表示-1,因为-1代表字节读取完全,所以会出错,假如向上转型为int则-1表示为0000.....(24个0)11111111,表示的是255,即读取的数据只能是0-255,不存在-1冲突的问题。
6、同样在字符流里面的char能表示0-65535,而int的数据宽度同样包含char,选取一个在不在char范围而又在int的范围表示文件结束(选了-1),所以read用int类型,然后-1的问题也可以很好的解决。