最近一直在看java的IO流机制,但是还没能深入到可以去理解他们源码的能力,只能把自己所学习到的摘记下来,后面在逐渐补充吧。
1.缓冲流
BufferedReader(字符输入流缓冲区)
BufferedWriter(字符输出流缓冲区)
我们经常不小心对输入流和输出流搞反了,教大家一个方法,凡事有read()方法的就是从别人那拿东西过来(比如从网上、磁盘的文件上)。凡事有write()方法的就是把自己的东西送给别人(比如写文件到磁盘)
—缓冲流的作用
提高对数据的读写效率。还有只要使用了缓冲区,就要记得每次读完刷新数据-flash()。其实关闭了缓冲区,就是关闭了缓冲区的流对象。
BufferedWriter有个newLine()方法,写入一个行分隔符,就是换行符。
BUfferedReader有个readLine()方法,就是读取一行文本,不包含任何行终止符。
* 自己实现readLine()方法
public String myReaderLine() throws IOException{
StringBuilder sb = new StringBuilder();
int ch = 0;
while(-1!=(ch=r.read())){
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
else
sb.append((char)ch);
}
if(sb.length()!=0)
return sb.toString();
return null;
}
其实BufferedReader中的readLine()方法:
遇到 \r 继续往下读
遇到\n 返回所读到的数据
如果整个读完了,且不满一行就返回整个数据
2.字节流
怎么说呢?按照我的理解,字节流比字符流大,字节流什么都可以读,而字符流只能读字符数据。听毕老师一句话:凡事输出的都是写,凡事输入的都是读。out–write input–read
InputStream类有个方法available()返回输入流的大小,在new数组存储数据的时候,就可以避免内存溢出了。
exmple:我们经常从网上下载一张图片到本地磁盘上。
拿到的是输入流InputStream,然后就开始read()方法读取,在来一个输出流OutputStream,开始write()写到本地文件中。
但是如果我们确定下载一个txt文件的话,我们就可以将输入流InputStream包装成字符输入流缓冲区,这样可以提高效率。
BufferedReader br = new BufferedReader(new InputStreamReader(inputstream));
3.转化流
转化流是用来干什么的?字节流有时需要转换为字符流,这个转化流就是桥梁。然后通常涉及到字符编码转化时,需要用到转化流。
还有字符流是不能转换为字节流的,这也是为什么我说字节流大的原因。
// 键盘录入最常见写法
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 控制台输出最常见的写法
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream( System.out)));
4.流操作的基本规律
毕老师流操作的基本规律:
最痛苦的就是流对象有很多,却不知道要用哪个。
1.明确源和目的
源:输入流 InputStream Reader
目的:输出流 OutputStream Writer
2.操作的数据是否是纯文本
是:字符流
否:字节流
3.当体系明确后,在明确要使用哪个具体的对象。通过设备来进行区分。
源设备:内存、硬盘、键盘
目的设备:内存、硬盘、控制台