FileInputStream/FileOutputStream的应用

http://www.cnblogs.com/jjtech/archive/2011/04/17/2019210.html

FileInputStream/FileOutputStream的应用

这是一对继承于InputStream和OutputStream的类,用于本地文件读写(二进制格式读写并且是顺序读写,读和写要分别创建出不同的文件流对象);

本地文件读写编程的基本过程为:

① 生成文件流对象(对文件读操作时应该为FileInputStream类,而文件写应该为FileOutputStream类);

② 调用FileInputStream或FileOutputStream类中的功能函数如read()、write(int b)等)读写文件内容;

③ 关闭文件(close())。

实例:流文件读写

流文件的单元是字节,所以它不但可以读写文本文件,也可以读写图片、声音、影像文件,这种特点非常有用,因为我们可以把这种文件变成流,然后在网络上传输。

问题是有了通用的流文件以后,为什么还要专门的字符流呢?这是因为文本可以用不同的方式存储,可以是普通的文本(UTF-8编码方式),ASCII文本和Unicode文本,字符流对象可以进行必要的转换,从而读出正确的文本。

有人认为流文件不能读写文本文件,这其实是个误会,因为文本文件本质上也是由字节组成的,当然是流文件的一种。作为读写文件的全体,这是没问题的,但是,如果要处理每次读入的内容,就最好使用字符流。

所以在文本文件处理时,使用字符流是个最常用的方法。

样例:

import java.io.*; public class FileStreamDemo { public static void main(String[] args) throws IOException { //创建两个文件,face.gif是已经存在文件,newFace.gif是新创建的文件 File inFile = new File("face.gif"); File outFile = new File("newFace.gif"); //创建流文件读入与写出类 FileInputStream inStream = new FileInputStream(inFile); FileOutputStream outStream = new FileOutputStream(outFile); //通过available方法取得流的最大字符数 byte[] inOutb = new byte[inStream.available()]; inStream.read(inOutb); //读入流,保存在byte数组 outStream.write(inOutb); //写出流,保存在文件newFace.gif中 inStream.close(); outStream.close(); } }

实例:读写任意大文件应用

因为byte数组最大存储值不超过64M,所以当一个文件大于60M 的时候,需要分开几个流操作。我们把上面的程序作一个修改,就可以写入任意大小的文件。这个程序应用了FileInputStream类的方法如下:

read(byte[] b,int off,int len)

把特定位置的流内容读入数组,已经读入byte[]数组的内容,会在流文件中删除。

程序运行的结果会产生一个新文件。

样例

import java.io.*; public class FileStreamDemo2 { public static void main(String[] args) throws IOException { //创建两个文件 File inFile = new File("tcty36.rm"); File outFile = new File("newtcty36.rm"); //最大的流为60Mb,当文件的容量大于60Mb的时候便分开流 final int MAX_BYTE = 60000000; long streamTotal = 0; //接受流的容量 int streamNum = 0; //流需要分开的数量 int leave = 0; //文件剩下的字符数 byte[] inOutb; //byte数组接受文件的数据 //创建流文件读入与写出类 FileInputStream inStream = new FileInputStream(inFile); FileOutputStream outStream = new FileOutputStream(outFile); //通过available方法取得流的最大字符数 streamTotal = inStream.available(); //取得流文件需要分开的数量 streamNum = (int)Math.floor(streamTotal/MAX_BYTE); //分开文件之后,剩余的数量 leave = (int)streamTotal % MAX_BYTE; //文件的容量大于60Mb时进入循环 if (streamNum > 0) { for(int i = 0; i < streamNum; ++i){ inOutb = new byte[MAX_BYTE]; //读入流,保存在byte数组 inStream.read(inOutb, 0, MAX_BYTE); outStream.write(inOutb); //写出流 outStream.flush(); //更新写出的结果 } } //写出剩下的流数据 inOutb = new byte[leave]; inStream.read(inOutb, 0, leave); outStream.write(inOutb); outStream.flush(); inStream.close(); outStream.close(); } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值