两个复制文件方法的比较和疑问

[复制链接]
查看11 | 回复9 | 2005-5-8 01:02:18 | 显示全部楼层 |阅读模式
第一种:
FileInputStream fis=new FileInputStream("源文件名&quot

;
BufferedInputStream bis=new BufferedInputStream(fis);
FileOutputStream fos=new FileOutputStream("目标文件名&quot

;
BufferedOutputStream bos=new BufferedOutputStream(fos);
int c;
while((c=bis.read())!=-1)bos.write(c);
System.out.println("ok&quot

;
这个方法我试过可以正确复制所有的二进制文件,但是只要复制文本文件,他就只能复制其中的一段文本过去。请问为什么?
第二种:
FileInputStream fis=new FileInputStream("test.java&quot

;
DataInputStream dis=new DataInputStream(fis);
FileOutputStream fos=new FileOutputStream("a.java&quot

;
BufferedOutputStream bos=new BufferedOutputStream(fos);
byte[] data=new byte[9500];
int abc=dis.read(data);
fos.write(data);
这种方法可以复制文本文件了,但是文件的长度和data数组的长度有关,就是说,就算我要复制的文件只有1k,但是我的数组长度定义为9500了,复制后的文件长度还是9.5k。请问有没有方法解决?
另外:如果像我这样做的话就要事先知道要复制的文件是二进制还是文本文件了。请问如何事先得知文件的属性?或有没有更好的复制方法?
回复

使用道具 举报

千问 | 2005-5-8 01:02:18 | 显示全部楼层
顶帖
回复

使用道具 举报

千问 | 2005-5-8 01:02:18 | 显示全部楼层
等高手
回复

使用道具 举报

千问 | 2005-5-8 01:02:18 | 显示全部楼层
高手快来
回复

使用道具 举报

千问 | 2005-5-8 01:02:18 | 显示全部楼层
第一种:
因为你没有flush,加上bos.flush( ) 或 bos.close( ) 即可。
第二种:
byte[] data=new byte[9500]; 生成长度为9500的数组,初始值为0,全部写到文件当然要占用9.5K了。
回复

使用道具 举报

千问 | 2005-5-8 01:02:18 | 显示全部楼层
第一种方法里面,为什么复制二进制文件又不需要bos.close()呢?
那么第二种方法里面,怎么改可以使只写数组里面有东西的进去?
回复

使用道具 举报

千问 | 2005-5-8 01:02:18 | 显示全部楼层
??
回复

使用道具 举报

千问 | 2005-5-8 01:02:18 | 显示全部楼层
!!
回复

使用道具 举报

千问 | 2005-5-8 01:02:18 | 显示全部楼层
可以做一个实验看看,对于二进制文件而言,只是保存部分内容,源文件和目标文件大小是不一样的。这是因为BufferedOutputStream有自动flush的功能,当buffer不能容纳更多的内容时就会自动调用flush方法。如果你的文本文件足够大的话,目标文件应该是有内容的。
第二个问题:
int abc=dis.read(data);
fos.write(data,0,abc);
即可。
回复

使用道具 举报

千问 | 2005-5-8 01:02:18 | 显示全部楼层
你仔细查一查read()的文档,就会发现用法了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行