读书人

资料输入输出流的使用

发布时间: 2012-10-26 10:30:59 作者: rapoo

文件输入输出流的使用

?

?对文件输入输出流的基本使用,我们结合一个简单的例子来说明。

比如,对文件的复制。

? ?

? ? ? 最基本的代码如下:

?

?

public boolean filecopy(String start,String end) throws IOException{

?

? ? ? ? ? ? ? ?//start 是文件原始地址,end 是文件复制的目标地址

?

//创建文件输入流对象

java.io.FileInputStream fis=new java.io.FileInputStream(start);

//创建文件输出流对象

java.io.FileOutputStream fos=new java.io.FileOutputStream(end);

?

? ? ? ? ? ?//得到流中的字节,并且,将其输出到指定文件

?

?

int t=0;

while((t=(fis.read()))!=-1){

?

fos.write(t);

?

}

?

// 强制输出

fos.flush();

//关闭输入流

fis.close();

//关闭输出流

fos.close();

?

return false;

?

?

}

?

?

throws IOException ?就是对异常的处理。也可以使用try catch.(如果,不进行异常处理,程序就会报错)

?

文件输入输出流的对象,都是存在于内存中的。我们复制一个文件时,就是,先将,文件从硬盘(外存),输入到内存,然后,从内存输出到目标地址。

?

?java.io 包下,有一个FileInputStream,和FileInputStream类,继承自 java.io.InputStream ? ,java.io.OutputIstream ?类。

?

FileInputStream?从文件系统中某个文件中获得输入字节。?FileInputStream有三个构造方法,此时,我们选取了 使用一个文件的路径来创建输入流对象 fis,同理,来创建了输出流对象,fos.

?

fis调用read()方法来读取文件的字节。read()方法会有一个返回值,可以通过返回值来判断是否读取结束。当,读取结束时,read()会返回 -1.

?

若字节全部读取结束,再写入输出,可能因为文件较大,会出现内存内存不足的情况,为了解决这个问题,选择了这个方法:读取一个字节后,立刻写入输出。直到,fis.read()=-1,此时表示文件读取结束,此时,写入输出,也会结束了。

?

fos.flush();?flush() 是强制输出,因为内存处理数据的速度大于外存速度,可能出现内存已经处理结束,而外存没有,数据会堵塞在 输出流中,为了防止这一问题,强制把数据输出。

?close(),则是关闭流,并释放系统资源。

?

这段程序的执行效率是非常低的。因为外存和内存速度差距是很大的。这时,我们可以考虑 缓存。缓存的存在就是为了平衡内外存的速度。 因此,代码优化如下:

?

?

/*

* 对文件内容进行复制

? ? ?* ?String start,原始文件的地址

? ? ?* ?String end ,目标文件的地址

*/

?

?

public boolean bufferedcopy(String start,String end) throws IOException{

?

??

?

//创建文件输入流对象

File sta=new File(start);

InputStream ins=new FileInputStream(sta);

?

//构造输入缓冲流

BufferedInputStream bis=new BufferedInputStream(ins);

//构造输出缓冲流

File en=new File(end);

OutputStream out=new FileOutputStream(en);

?

BufferedOutputStream bos=new BufferedOutputStream(out);

?

?

?

? ? ? ? ? ?//得到流中的字节,并且,将其输出到指定文件

?

int i=0;

?

while((i=(bis.read()))!=-1){

?

bos.write(i);

?

}

?

// 强制输出

out.flush();

//关闭输入流

ins.close();

//关闭输出流

out.close();

?

return true;

?

?

}

?

笔者,测试了这两段代码的效率。复制一部1.2G 的电影,第一段代码,使用将近4个小时还没完!而第二段代码,则快了很多,使用了10分钟左右。

?

?

?

?

1 楼 uuid198909 2011-07-27 代码格式啊,lz 2 楼 Jonathan樊 2011-07-29 uuid198909 写道代码格式啊,lz
格式不对么?求指教~~刚学java 不久

读书人网 >编程

热点推荐