流是java中传送数据的通道,或者说是一种运行状态。
流根据流向,分为输入输出流
流根据处理单元,分为字节流和字符流:
上述两两组合有四种方式,其中输入输出对应的参照物是程序,输入就是将文件输入到程序里(程序在读),输出就是程序把数据输出到文件上(程序在写)。以下是我从网上找的流的继承关系图(够用就行),字节流由stream结尾,字符流由reader,writer结尾。
抽象类,上面的继承图很好的表示各种常用流的继承关系,其中InputStream和OutputStream与Writer,Reader是抽象类,还有就是字体颜色较为暗淡的FIlterOutputStream和FilterInputStream类也是其余则是实体类。
字节流:
先来将一下字节流,字节流是以字节为读取单位来进行读和写操作的。字节分为以下两种:
普通文件字节流(FileOutputStream和FileInputStream)
以下两段代码做一下简单介绍:
这是一个复制的功能,是以is.read()一次读一个字节的方式
InputStream is = new FileInputStream(srcString);
OutputStream os = new FileOutputStream(destString);
int by = 0;
while ((by = is.read()) != -1) {
os.write(by);
}
os.close();
is.close();
同样的赋值,但使用的是一次读一个字节数组的方式
InputStream is = new FileInputStream(srcString);
OutputStream os = new FileOutputStream(destString);
byte[] bys = new byte[1024];
int len = 0;
while ((len = is.read(bys)) != -1) {
os.write(bys, 0, len);
}
os.close();
is.close();
高效字节流(此字节流带有缓冲区BufferedOutputStream和BufferedInputStream)
高效字节流除了构造对象不同外,用法与普通字节流相同,毕竟他说我底层使用的依然是基本的流。
字符流:
字符流肯定是以读取字符为读写方式的,他是以字符作为单位来进行读写的,字符流只能用来读写文本,不能读写其他数据。为什么呢?因为字符流 = 字节流 + 编码表,即使同为文本,编码表不同,也会也会发生乱码现象。
普通字符流
由于Writer和Reader的子类转换流InputStreamReader和OutputStreamWriter的名称过长,所以会使用他们的子类FileReader和FileWriter。
一次读取一个字符:(构造对象和关闭资源就自己看api吧)
一次一个字符
int ch = 0;
while ((ch = fr.read()) != -1) {
fw.write(ch);
}
一次读取一个字符数组:
// 一次一个字符数组
char[] chs = new char[1024];
int len = 0;
while ((len = fr.read(chs)) != -1) {
fw.write(chs, 0, len);
fw.flush();
}
同理,类似于高效字节流,字符也有字符缓冲流:
同样的复制,同样的一次读一个字符和一次读一个字符数组。但但字符缓冲流还有第三种:
一次读一个字符串,并用newLine()和flush()来换行和刷新
// 读写数据
String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}