一、按字节流读取
抽象类inputStream和outputStream两个以及他们的子类
Fileinputstream Fileoutputstream int read() 以及write(int)、write(byte[]) 拷贝会用到
ByteArrayInputStream ByteArrayOutputStream
BufferedInputStream BufferedOutputStream
都类似
二、按字符流读取
1、Reader和Writer是字符流操作的主要类,他们俩是抽象类,其子类是InputStreamReader和InputStreamWriter,再下一级的子类是FileReader和FileWriter。除了抽象类不能实例化,其他的都是可以的。
上面这些都是主要的用于字符流操作的类。
1、其中主要用的是InputstreamReader和fileReader 主要方法有
int read() 到达末尾返回-1 非末位返回ASCII码
int read(char[] zifu) 将字符读入字符数组 到达末尾返回-1
int read(char[] zifu ,int off,int length) 将某个字符开始的位置读取n个字符到字符数组中。
write(int n) 以ASCII码方式读入 对应流的方式输入
write(char[]) 以字符流的方式读入
write(string) 以字符串读入 比如与bufferedreader对应。
2、还有bufferedreader用的也较多。主要是可以一行行读取 读出来的也直接是string
string readline() 到达末尾就是null
3、注意点,按字符输出,在win里是会把每个字符都输出的,比如换行、回车、空格的,一般在win里换行其实是回车(\r ASCII码是13)+换行(就是说在下一行起始位置 \n ASC码是10)两者共同组成,而在linux里其实就是/n 就行。所以要输出所有字符,可以用if(char(read.read())!= “\r” 且不等于“\n”就行啦!
4、注意点2,IO里比较多的异常用到try-catch-finally 注意 多种异常可以集中采用IOException就行 否则太多了。重要!! 声明reader/writer等对象,最好在try外部!!!因为有作用域的问题,否则在finally报错!一定在外部声明。
5、实践证明 Filewriter 不能使用UTF-8编码方式也不能指定,所以写入最好有fileoutputstream来写 或者用 outputstreamwriter(可以通过fileoutputstream来设定charset)来写 比较好用。
三、File类的接口
创建功能:createNewFile(),mkdir(),mkdirs()
删除功能:delete()
重命名功能:renameTo()
判断功能:isFile(),isDirectory(),exists()等
获取功能:getName(),getPath(),list()等
文件过滤器的作用:list(FilenameFilter filter),返回满足指定条件的文件列表
四、转换流的作用
inputStreamReader outputstreamWriter字节流到字符流转化
FileReader xxx = new FileReader(new inputStreamReader( new fileinputstram(file))
bufferedWriter = new BufferedWriter(new outputstreamWriter(new fileoutputstream(file), charset)
五、缓冲
A:缓冲思想
* 字节流一次读写一个数组的速度明显比一次读写一个字节的速度快很多,
* 这是加入了数组这样的缓冲区效果,java本身在设计的时候,
* 也考虑到了这样的设计思想,所以提供了字节缓冲区流
* B.BufferedInputStream
* BufferedInputStream内置了一个缓冲区(数组)
* 从BufferedInputStream中读取一个字节时
* BufferedInputStream会一次性从文件中读取8192个, 存在缓冲区中, 返回给程序一个
* 程序再次读取时, 就不用找文件了, 直接从缓冲区中获取
* 直到缓冲区中所有的都被使用过, 才重新从文件中读取8192个
* C.BufferedOutputStream
* BufferedOutputStream也内置了一个缓冲区(数组)
* 程序向流中写出字节时, 不会直接写到文件, 先写到缓冲区中
* 直到缓冲区写满, BufferedOutputStream才会把缓冲区中的数据一次性写到文件里
面试题:小数组的读写和带Buffered的读取哪个更快?
* 定义小数组如果是8192个字节大小和Buffered比较的话
* 定义小数组会略胜一筹,因为读和写操作的是同一个数组
* 而Buffered操作的是两个数组
http://www.cnblogs.com/biehongli/p/6074713.html