您的位置:首页 > 其它

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步骤:代码如下:

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异常处理

使用后,释放资源


 

  有很多不足,希望大家给点建议,我会加以改正.谢谢.

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: