字符流Reader
int read()读取一个字符并以整数的形式返回0-65535,如果返回-1则已到输入流末尾
int read(char[] cbuf)读取一系列字符并存储到 一个数组中,返回实际读取的字符数,如果读到输入流末尾则返回-1;
void close()关闭输入流并释放内存资源
int read(char[] cbuf,int off,int len)读取len个字符并存到一个数组中,从off位置开始,返回实际读取的字符数,如果读取到输入流末尾则返回-1;
long skip(long n)跳过n个字符不读,返回实际跳过的字节数。
字符流 writer
void write(int c)将字符(int 数组的低8位)压入到字符流中
void write(char[] cbuf,int off,int len)将字符数组中的指定部分内容压入到字符流中,从off开始共len个字符。
void write(String str)将字符串中的内容压入到字符流中。
void close()关闭流并释放所占用的资源
void write(String str, int off, int len) 将字符串中的指定部分内容压入到字符流中,从下标off开始 共len个字符
void flush()刷新缓冲区,将缓冲区中的数据全部送出到目标地,然后清空缓冲区
void write(char[] cbuf) 将字符数组中的所有数据压入到字符流中
一般来说:一次读写一个字符效率太低,可以引入char[]数组提高执行效率
小结
在学些BIO时记忆父类的方法,区分子类的实现不同
InputStream中的方法 read(byte[]):int; Reader中方法read(char[]):int 如果到达流末尾则-1
OutputStream中的方法 write(byte[],0,len):void;Writer中的方法 write(char[],0,len)/write(String)
一般在使用中,如果读取数据使用字节流,则写出数据采用的也是字节流;不建议混用,除非引入 桥接流
文件流
FileInputStream("file-name") FileInputStream(File) FileNotFoundException
FileReader("file-name") FileReader(File) FileNotFoundException
FileOutputStream("file-name") FileOutputStream("file-name",true) 默认文件覆盖,如果 参数true表示追加
FileWriter("file-name") FileWriter("file-name",true)
一般不使用单字节或者单字符的操作方法,使用数组
注意:try(){}是推荐写法,否则应该使用try{}finally{}结构保证流的关闭
针对二进制文件不建议使用字符流,建议使用字节流进行操作,否则有可能拷贝文件出现问题:
如果针对文本文件则建议使用字符流,因为编码使用比较方便
节点流
File文 件 FileReader、FileWriter FileInputStream、FileOutputStream
内存数 组 CharArrayReader、 CharArrayWriter ByteArrayInputStreamByteArrayOutputStream
内存字 串 StringReader、 StringWriter
管道 PipedReader、 PipedWriter PipedInputStream、 PipedOutputStream
文件节点流
FileInputStream和FileOutputStream是文件字节流,是一种节点流
文件字节输入流的构造方法:
FileInputStream("文件名称"),如果文件不存在则FileNotFoundException
FileInputStream(File)
文件字节输出流的构造方法
FileOutputStream(“文件名称”) 如果文件不存在则新建文件,如果文件存在则覆盖文件内容
FileOutputStream(String name文件名称, boolean append是否采用追加方式)
FileReader和FileWriter类似
FileInputStream和FileOutputStream两个类属于结点流,第一个类的源端和第二个类的目的端都是磁 盘文件,它们的构造方法允许通过文件的路径名来构造相应的流。
内存数组节点
如果文本则使用char[],如果二进制则使用byte[]
CharArrayReader(char[] buf)其中char[]就是数据的来源,也就是说Reader就是从char[]中读取数 据
CharArrayRead(char[] buf, int offset, int length)
CharArrayWriter用于实现向一个字符数组中写入数据,这个数组可以自动调整大小
ByteArrayInputStream、ByteArrayOutputStream和CharArrayReader以及CharArrayWriter类似,支 持操作的内容不同而已,操作byte[]与char[]
内存字串流
StringReader用于从一个字串String中读取数据
StringWriter用于给一个StringBuffer中写入数据,实现一个可边长的字串
读写文件使用节点流FileInputStream/FileOutputStream和FileReader/FileWriter,如果操作文本 文件,建议使用FileReader/FileWriter,如果操作二进制文件建议使用 FileInputStream/FileOutputStream
需要建立缓冲区(建立临时文件的方式效率低),可以考虑使用内存节点,例如 CharArrayReader/CharArrayWriter、StringReader/StringWriter和 ByteArrayInputStream/ByteArrayOutputStream
如果需要一个二进制缓冲区可以使用ByteArrayInputStream/ByteArrayOutputStream,如果需要 一个字符缓存可以使用CharArrayReader/CharArrayWriter、StringReader/StringWriter
如果数据量不是特别大使用CharArrayReader/CharArrayWriter更为方便,如果数据量大而且可能 需要直接操作缓冲区则使用StringReader/StringWriter
StringWriter中提供了方法getBuffer():StringBuffer
过滤流类型
过滤流就是在节点流的基础上附加功能
缓存 BufferedReader、BufferedWriter BufferedInputStream、 BufferedOutputStream
过滤处理 FilterReader、FilterWriter FilterInputStream、 FilterOutputStream
桥接处理 InputStreamReader、 OutputStreamWriter
对象序列化 处理 ObjectInputStream、 ObjectOutputStream
数据转换 DataInputStream、 DataOutputStream
行数统计 LineNumberReader LineNumberInputStream
回滚处理 PushbackReader PushbackInputStream
打印功能 PrintWriter PrintStream
过滤流
就是decorate模式中的抽象装饰角色
FilterInputStream/FilterOutputStream和FilterReader/FilterWriter
所谓的过滤流实际上就是类似上面的加密处理,在输入之后(后置处理,被装饰对象先执行)或者输出 之前(前置处理,先处理然后被装饰对象执行)进行一下额外的处理,最终实际操作是调用被装饰对象 的方法完成工作,依靠这种装饰模式实现在节点流的基础上附加额外功能.当然也允许多个过滤流嵌套从 而达到功能累加的目的
FilterInputStream实际上就是一个装饰抽象角色