对于java的IO流的理解很长时间来都是很乱,包括学习其他的语言对这一块知识也都算是一个盲点.更多的时候一提到读取保存数据就是使用数据库。这一次学习了IO流,自己又解决了一个很大的盲点。
IO流为我们提供了这样一种方案,就是把我们的数据保存到文件中,或者从文件中读取我们的数据。IO流为我们提供了一条通道程序,可以使用这条通道把源中的字节序列送到目的地.源可以是文件、网络、压缩包或者其他数据源。
### IO流分类
1.按流的方向分为输入流和输出流
2.按流的数据单位分为字节流和字符流
3.按功能分为字节流和处理流
### 节点流
节点流可以从一特定的数据源读写数据.
![](https://box.kancloud.cn/2016-03-23_56f1fee58b094.jpg)
![](https://box.kancloud.cn/2016-03-23_56f1fee5a1499.jpg)
### 处理流
处理流是”连接”在已存在的流(节点流或处理流)之上.为对数据的处理提供更强大的读写功能.
![](https://box.kancloud.cn/2016-03-23_56f1fee5cc7a0.jpg)
![](https://box.kancloud.cn/2016-03-23_56f1fee5e730f.jpg)
关于节点就和处理流.就好比给了我们一桶水,我们需要一条水管将水引出来,这条水管就是节点流.但是流出来的水我们一看是不太干净,所以我们需要一个净化器,这个净化器就是处理流。
### IO流的四大抽象类
InputStream:继承自InputStream的流都是用于向程序中输入数据。且数据的单位为字节(8bit)
outputSteam:与inputStream相似,用来输出数据。
Reader:继承自Reader的流都是用于向程序中输入数据,数据单位为字符(16 bit)
Write:与Reader相似,用于输出数据.
![](https://box.kancloud.cn/2016-03-23_56f1fee61b6c6.jpg)
### 缓冲流
上面的输入输出流一次只能读取一个字节或者字符.如果我有1024个字节要读取,那么我要进行1024次操作。可以想象如果文件十分庞大这样的操作肯定会先很大的问题。基于这种问题,引出了缓冲流的概念。缓冲流就好比在水管后又加了一个水盆。
### 数据流
当我们需要读取java的一些基本类型的时候,如果使用inputStream和OutputStream会不断的进行转换。比如我们读取一个long类型的值(long类型占8个字节)时,读取很多次。此时数据流就为我们提供了这样一种操作。那就是直接读取这数值。
### 对象流
对象流就是把一个Object直接转换成字节流写到硬盘上或者网络上.这种操作叫做序列化.
### 几个小例子
1.第一个例子,演示了FileInputStream和FileOutStream的使用,该例子实现的是将a.txt中的文本复制一份到b.txt中去。
read()方法一次只能读取一个字节。使用当返回值为-1时表示已经读到了文本的末尾。
使用输入输出流要注意异常的处理。此处处理了两个异常
~~~
public static void main(String[] args) {
int b=0;
FileInputStream in=null;
FileOutputStream out=null;
try
{
in=new FileInputStream("G:/a.txt");
out =new FileOutputStream("G:/b.txt");
while((b=in.read())!=-1)
{
out.write(b);
}
in.close();
out.close();
}
catch(FileNotFoundException e2)
{
System.out.println("没有发现文件");
System.exit(-1);
}
catch(IOException e1)
{
System.out.println("文件复制错误");
System.exit(-1);
}
System.out.println("文件以复制");
}
~~~
2.第二个例子展示了缓冲流的使用 使用缓冲流时readLine()方法一次可以读取一行数据.
此处有个强制类型转换.要注意,不然输出的会是ASCII码.
~~~
public static void main(String[] args) {
try
{
FileReader fis=new FileReader("G:/a.txt");
BufferedReader bis=new BufferedReader(fis);
int c=0;
System.out.println(bis.readLine());//读取一行字符串
for(int i=1;i<=3&&(c=bis.read())!=-1;i++)
{
System.out.print((char)c+"");//强制类型转换,不然输出的是ASCII码
}
System.out.println();
bis.close();
}
catch(IOException e)
{
e.printStackTrace();
}
}
~~~
### 总结
IO流的带给了我另一种保存数据的方式,以前保存数据,就只会想到数据库.而现在我们又多了一种新的方式.对于IO流重要的是要理解字节流和处理流这两个概念.字节流负责把数据从数据源提取出来(或者将数据保存到文档中),而处理流是要对数据进行处理,其中有缓冲流,数据流和对象流,针对不同的使用环境我们要甄别使用,处理流可以重叠使用.然后理解了四个抽象类以及他们的方法.掌握了这些对于IO流的理解就算是基本入门了。