什么是流
Java对于数据的输入输出是以“流”的方式进行的,J2SE提供了各种各样的流,用以获取不同种类的数据。Java.io包中定义了多个流类型来实现输入输出功能,关于IO中的类,具体我们可以查看API文档。API文档在线地址:http://docs.oracle.com/javase/1.5.0/docs/api/index.html
流的基本类型
J2SE定义的所有流类型,位于java.io包内,分别继承了以下四种抽象流类型。
输入流分类(深色为处理流浅色为节点流)
什么是输入?什么是输出?
读数据站在文件的角度是输出,但是站在程序的角度是输入。而我们在编程的时候是站在程序的角度进行考虑,所以读数据为输入流InputStream or Reader.(读数据是读到缓冲区中)
将数据输入到内存中。
什么是节点流
节点流可以从一个特定的数据源(节点)读写数据(如:文件、内存)
IO实现文件读取代码示例
需求:读取一个.java文件
节点流(输入流):FileInputStream
public class FileInputStream{
public static void main(String[] args){
int b = 0;
FileInputStream in = null;
try {
in=new FileInputStream("f:/360云盘同步/FileInputStream.java");
} catch (FileNotFoundException e) {
System.out.println("找不到指定文件");
System.exit(-1);
}
try {
long num = 0;
while((b=in.read())!=-1){
System.out.print((char)b);
num++;
}
in.close();
System.out.println();
System.out.println("共读取了 "+num+" 个字节");
} catch (IOException e1) {
System.out.println("文件读取错误");
System.exit(-1);
}
}
缓冲流
概念:缓冲流要套在相应的节点流上,对数据提供了缓冲功能,提高了读取数据的效率,同时增加了一些新的方法
好处:BufferedReader提供了readline方法用于读取一行数据,newline用于写入一个行分隔符。对于输出的缓冲流,,写出的数据会先在内存中缓存,然后使用flush将数据写出。
注意:缓冲流是套在节点流上的,体现在代码中的形式:
BufferedWriter bw = new BufferedWriter(new FileWriter("d:\\share\\java\\dat2.txt")); //BufferedWriter套在FileWriter上面
BufferedReader br = new BufferedReader(new FileReader("d:\\share\\java\\dat2.txt")); //BufferedReader套在FileReader上面
转换流
以InputStreamReader举例,我们都知道InputStream为字节流,向里读数据。Reader为字符流,也是向里读数据。但是读数据的方式一个是字节读入,一个是字符读入。字符读入数据当然比字节快的多。为将将字节流转换为字符流,引入转换流,这这成为转换流 (TransformIO)
最常见的就是键盘输入事件:
BufferedReaderbr=new BufferedReader(new InputStreamReader(System.in));
Stringtype=br.readLine();
System.in实际上是InputStream字节流
小结:流的种类很多,除了以上列举的节点流、转换流、缓冲流还有ObjectIO、PringIO等等,但是无论流以什么样的形式变换,都是为了我们更好、更方便的读取数据。