流是java世界中对外在事物流动规律的一个描述,那么必然和数据相关联。
字符流:Reader Writer
字节流:OutputStream InputStrean
Reader的基本方法
int read():返回一个int型数据。为什么要返回一个int型数据呢,因为&0xff 所以要返回一个int型数据,和以后的-1编码相区别
int read(buf):把读取到的字符存储在一个临时缓冲区中,返回读取的个数。所以呢我们要定义两个变量,一个是len 一个是buf
比如这样 :
import java.io.*; class IOTest { public static void main(String[] args)throws IOException { FileReader fr=new FileReader("abc.txt"); int ch=fr.read(); System.out.println(ch); int len=0; char[]buf=new char[1024]; len=fr.read(buf); System.out.println(new String(buf,0,len)); } }
我觉得java本身对读取这个动作,有个角标的动作,(我抓取了一大票的数据比如1024个字符(2k),然后有一个计算器,一个数组的索引),一个count--,一个Index++,一个数据要来检测什么时候要给数组read,一个用来获取数据
当然系统的笼统的理解就是源(InputStream Reader)对自己干过什么事情是有记忆的。它能做的只有读了,所以它呢 有个记忆功能。这样我们就可以合理的避开底层的实现。
Writer的基本方法
void Write(int c)把指定字符写入到流中 注意的是目的地--流(缓冲区) 因为我们要有一个动作,就是对应编码表(查表)所以我们要存到缓冲区 所以要把数据存到你想去的地方的时候,我们就要flush().
void Write(char[] buf) 把对应的字符数组 写入到流中
void Write(String str)把对应的字符串写入到流中
InputStream 同上类似只不过char变成了byte
OutputSream 也是类似 只不过没有写入字符串的方法 如果你想把“串串香’‘写到目的地(不用写入(缓冲区,流)因为不要查表 )记得getBytes
如何确定应该什么时候用什么流呢?首先我们要明确源和目的
1.源
首先源:Input Reader
其次是不是纯文本文件? yes Reader
读取的设备是哪个?内存,硬盘还是键盘
2.目的
目的:OutputStream Writer
其次是不是纯文本文件?
写入的设备是哪个?内存 硬盘 还是控制台
若果是键盘和控制台的话就要涉及 转换流 InputStreamReader OutputStreamWriter
那么我接下来就介绍几个常用的流对象
FileReader InputStreamReader(转换流 涉及指定编码集 一定要用到) FileInputStream System.in
包装 BufferReader BufferedInputStream
FileWriter OutputStreamWriter FileOutStream System.out
包装:BufferedWriter BufferedOutputStream
原文:http://www.cnblogs.com/theones2015/p/5100921.html