IO流(字节流)
2015-10-23 02:24
155 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
IO流的概述:
IO流用来处理设备之间的数据传输
Java对数据的操作是通过流的方式
Java用于操作流的类都在IO包中
流按流向分为两种:输入流,输出流。
流按操作类型分为两种:
字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的
字符流 : 字符流只能操作纯字符数据,比较方便。
IO流的(字节流操作文件)6步骤:代码如下:
简单的六步骤基本已经学完IO流,接下来我们只需在次基础上来扩展即可.
注意事项
1.创建io流要导入包,要抛异常
2.在inputstream创建的时,如果是相对路径的话,要先创建一个文件.
3.关流
read()方法读取的是一个字节,为什么返回是int,而不是byte
因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111
那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111会在其前面补上24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类型.
在字节流中,如果要拷贝一个音频文件,如果要用字节流拷贝,效率会很慢,因为每次读取的时候是一个字节,该文件有多少个字节他就会读取多少个字节,然后在输出该文件的总字节才能完成拷贝过程.所以在这里,我们可以给他定义一个小数组来使他的效率变高.
小数组定义如下:
当我们自定义小数组的时候,其实就是给读取文件的时候加了一个倍数.定义多大他每次就读取多大,这样的效率会很高,因为走的是缓冲区,而缓冲区是内存中的,所以内存的运算速度要比硬盘快.所以定义小数组会加快效率.
BufferedInputStream
BufferedInputStream内置了一个缓冲区(数组)
从BufferedInputStream中读取一个字节时
BufferedInputStream会一次性从文件中读取8192个, 存在缓冲区中, 返回给程序一个
程序再次读取时, 就不用找文件了, 直接从缓冲区中获取
直到缓冲区中所有的都被使用过, 才重新从文件中读取8192个
[b]BufferedInputStream代码如下:[/b]
如果问定义小数组和buffered那个好点,个人认为如果不按效率来说 定义小数组较快,因为输入和输出都共用一个小数组.而小数组也可定义问8192个字节数,而[b]buffered输入是一个缓冲区.输出也有一个缓冲区.所以效率要币小数组慢一点点.但是用[b]bufferedOutputStream
必须要关流,如不不关,会保证文件不够完整,因为close在关流之前会刷新一次缓冲区,将没有填满的缓冲区剩余的字节刷出来.如果不关,数据会存放在缓冲区里,不保证文件的完整度.[/b][/b]
最后注意的是使用前导入IO包中的类
使用时,进行IO异常处理
使用后,释放资源
有很多不足,希望大家给点建议,我会加以改正.谢谢.
IO流的概述:
IO流用来处理设备之间的数据传输
Java对数据的操作是通过流的方式
Java用于操作流的类都在IO包中
流按流向分为两种:输入流,输出流。
流按操作类型分为两种:
字节流 : 字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式存储的
字符流 : 字符流只能操作纯字符数据,比较方便。
IO流的(字节流操作文件)6步骤:代码如下:
FileInputStream fs = new FileInputStream("xxx.txt"); FileOutputStream fls = new FileOutputStream("yyy.txt"); int len; // 定义一个变量来记录每一次读取的字节 while ((len = fs.read()) != -1) {// -1是结束标记当读到-1的时候说明文件中的字节已读取完毕 fls.write(len); // 写到yyy.txt中 } fs.close(); // 关流释放资源 fls.close();
简单的六步骤基本已经学完IO流,接下来我们只需在次基础上来扩展即可.
注意事项
1.创建io流要导入包,要抛异常
2.在inputstream创建的时,如果是相对路径的话,要先创建一个文件.
3.关流
read()方法读取的是一个字节,为什么返回是int,而不是byte
因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111
那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111会在其前面补上24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类型.
在字节流中,如果要拷贝一个音频文件,如果要用字节流拷贝,效率会很慢,因为每次读取的时候是一个字节,该文件有多少个字节他就会读取多少个字节,然后在输出该文件的总字节才能完成拷贝过程.所以在这里,我们可以给他定义一个小数组来使他的效率变高.
小数组定义如下:
FileInputStream fs = new FileInputStream("kk.txt"); FileOutputStream fss = new FileOutputStream("ii.txt"); byte[] arr = new byte[1024]; //定义字节数组为1024个字节 int len; while((len = fs.read(arr))!= -1){ //每次读取的时候都是一次读取该文件的1024个字节 fss.write(arr,0,len); } fs.close(); fss.close();
当我们自定义小数组的时候,其实就是给读取文件的时候加了一个倍数.定义多大他每次就读取多大,这样的效率会很高,因为走的是缓冲区,而缓冲区是内存中的,所以内存的运算速度要比硬盘快.所以定义小数组会加快效率.
BufferedInputStream
BufferedInputStream内置了一个缓冲区(数组)
从BufferedInputStream中读取一个字节时
BufferedInputStream会一次性从文件中读取8192个, 存在缓冲区中, 返回给程序一个
程序再次读取时, 就不用找文件了, 直接从缓冲区中获取
直到缓冲区中所有的都被使用过, 才重新从文件中读取8192个
[b]BufferedInputStream代码如下:[/b]
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(getFile())); //创建带有缓冲区的输入流并关联 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(getFile().getName())); int a; while((a = bis.read())!= -1){ bos.write(a); } bis.close(); bos.close();
如果问定义小数组和buffered那个好点,个人认为如果不按效率来说 定义小数组较快,因为输入和输出都共用一个小数组.而小数组也可定义问8192个字节数,而[b]buffered输入是一个缓冲区.输出也有一个缓冲区.所以效率要币小数组慢一点点.但是用[b]bufferedOutputStream
必须要关流,如不不关,会保证文件不够完整,因为close在关流之前会刷新一次缓冲区,将没有填满的缓冲区剩余的字节刷出来.如果不关,数据会存放在缓冲区里,不保证文件的完整度.[/b][/b]
最后注意的是使用前导入IO包中的类
使用时,进行IO异常处理
使用后,释放资源
有很多不足,希望大家给点建议,我会加以改正.谢谢.
相关文章推荐
- C#中的is和as操作符区别
- Linux 文件与目录管理
- [干货分享]一篇可能会让你爱上MVVM与ReactiveCocoa的文章
- Maximal Square - LeetCode
- linux文件属性
- [干货分享]一篇可能会让你爱上MVVM与ReactiveCocoa的文章
- 特性三、控制器视图生命周期函数
- HDU 4460 Friend Chains -多源最短路裸题
- SpagoBI Ehcarts整合
- spring unit test start error
- linux系统启动过程
- ubuntu 14.04 设置静态ip
- yum命令
- Gvim配置
- 第四次作业——个人作业——必应词典软件案例分析
- samba服务器搭建
- WEB前端学习 Day 2(边框)
- Laravel 5 系统架构:服务提供者、服务容器、Contracts、Facades
- C#中out和ref之间的区别
- java 接口回调经典案例--网络请求回调