🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
对于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流的理解就算是基本入门了。