按照流的方向:
- 输入流:InputStream,Reader
- 输出流:outputStream,Writer
按照数据类型:
- 字节流(byte) , InputStream,outputStream
- 字符流(char) Reader,Writer
按照实现功能
- 节点流:从特定的地方读写数据。如FileReader.
- 处理流:是对已存在的流的封装实现数据读写。构造方法需要其他的流对象做参数。又叫流的链接,BufferedReader. 。
节点流:
- 文 件 :FileInputStream,FileOutputStrean,FileReader, FileWriter
- 数 组 :ByteArrayInputStream ,ByteArrayOutputStream, CharArrayReader, CharArrayWriter
- 字符串:StringReader, StringWriter
- 管 道 :PipedInputStream ,PipedOutputStream, PipedReader,PipedWrite
常用处理流(关闭处理流使用关闭里面的节点流)
- 缓冲流:BufferedInputStrean,BufferedOutputStream,BufferedReader,BufferedWriter--- 增加缓冲功能,避免频繁读写硬盘。
- 转换流:InputStreamReader,OutputStreamWriter-字节流和字符流转换。
- 数据(特殊)流 DataInputStream,DataOutputStream -将基础数据类型读写到文件
- 序列流:SequenceInputStream,SequenceOutputStream
- 序列化:ObjectInputStream,ObjectInOutputStream
流的关闭顺序:
- 先打开的后关闭,后打开的先关闭
- 看依赖关系,先关依赖者,后关被依赖者。
- 可以只关闭处理流,不用关闭节点流。处理流关闭的时候,调用其处理的节点流的关闭方法。
注意:
- 如果将节点流关闭以后再关闭处理流,会抛出IO异常。
- 如果关闭了处理流,在关闭与之相关的节点流,也可能出现IO异常。(hadoop编程文件流操作中遇到了。)
继续总结:
4个流:InputStream,outputStream, Reader ,Writer
节点流:File,ByteArray,CharArray,String,Piped
处理流:Buffered,Reader,Data,Sequence,Object
总结:通常继承自Filter开头的流是处理流。
File类创建获取文件信息。
绝对路径是固定的从盘符开始,相对路径相对于某个位置,指当前项目下,在dos下
- File(String pathname):根据路径得到File
- createNewFile():创建文件
- mkdir():创建文件夹
- delete():删除文件或文件夹
- isDirectory():判断是否是目录
- isFile():判断是否是文件
- exists():判断是否存在
- getName():获取名称
- list():获取指定目录下的所有文件或的名称数组
- listFiles():获取指定目录下的所有文件或者文件夹的File数组
- list(FilenameFilter filter)
缓冲思想:字节流一次读写一个,数组比字节块,提供了字节缓冲区流
BufferedInputStream:
- 内置了一个缓冲区(数组)
- 读取一个字节
- 一次读取8192个, 存在缓冲区, 返回给程序一个
- 使用完读取
BufferedOutputStream:
- 内置了一个缓冲区(数组)
- 写出字节,先写到缓冲区
- 缓冲区写满, 数据一次性写到文件
总结 File文件不用关闭流,stream必须关闭流。
flush()方法: 刷新缓冲区,刷新后可以再次写出
close()方法:关闭流释放资源的的,关闭流之前刷新缓冲区。
字符流(Reader和Writer):
- 直接读写字符的IO流
- 读取时字节转为字符. 写出时字符转为字节.
字符流场景
- 拷贝文本文件不推荐. 因为读取时字节转为字符, 写出时字符转回字节.
- 读写一段文本,
- 按照字符的大小读取,无中文
- 将字符串写出,不转换为字节数组
字符流缺点:
- 不能拷贝非纯文本文件
- 读取时字节转为字符找不到对应,就会用?代替,写出乱码
流在指计算中流动的缓冲区。
从外部设备流向中央处理器的数据流成为“输入流”,反之成为“输出流”。
字节和字符区别
- 字节流读到字节就返回;字符流读到字节查编码表转化为字符返回。
- 字节流处理所有类型数据,字符流处理字符数据。
- FileInputStream的available():下一次读取的剩余字节数。
- BufferedInputStream(InputStream in,int size):指定缓冲区大小
- InputStream的skip(long n):忽略输入流中的n个字节
不同的流:
- Piped(管道流):实现管道,线程中使用
- Sequence(序列流),:把多个流合并为一个,如:传入流集合。
- Object(序列化流):字节序列化为对象,对象反序列化字节
- Reader(转换字符流):构造函数传入流对象。如InputStreamReader构造函数传入InputStream
FileOutputStream的构造方法传入文件路径,其内部使用了File对象打开文件。
总结:
- Object虽然可以序列化,但是它是处理流,需要节点流做构造函数参数