`
黑色牧马
  • 浏览: 9936 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

文件的读写

阅读更多
FileInputStream与FileOutputStream的应用。
这是一对继承于InputStream与OutputStream的类。用于本地文件读写(二进制格式读写并且是顺序读写,读和写要分别创建出不同的文件流对象)
本地文件编程的基本过程:
1、生成文件流对象(对文件读操作应该是FileInputStream,对文件写操作应该是FileOutputStream)。
2、调用FileInputStream或FileOutputStream类中的功能函数如:read(),write(int i)等,读写内容。
3、关闭文件(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();

}

}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics