LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: sinpool

怎样生成一个有大小的文件?

[复制链接]
发表于 2005-3-8 09:46:23 | 显示全部楼层
Post by sinpool
您所指的Buffer 是指的BufferedInputStream还是什么? :ask

您当时生成1G空文件所用的时间大约有多长呀?

是write(byte[])
这个byte的大小。其实原理很简单,让系统IO集中来操作。因为系统IO调用是一个timecost的操作。
你自己可以测试一下,这个byte开到1M,10M,128M,256M,512M的效果。windows默认的copy操作buffe好象是128M。我开到512M,速度是windows的copy操作的2~3倍
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-8 19:45:49 | 显示全部楼层
在我的机器上。

  1.        RandomAccessFile raf = new RandomAccessFile(file,"rw");
  2.        long size =50*1024*1024;
  3.        raf.setLength(size);
复制代码

这种方式,需要4、5秒。
因为我以后要使用seek方法随机写入数据,
所以我试了RandomAccessFile类。
如果容量为6、7百M时间可是更慢了,
而且使用seek使文件指针移动到7百M的文件尾所需时间,
和设置7百M的空文件的时间一样长。
IO效率为什么这么低呀?

  1.        File file = new File("D:/c.txt");
  2.        FileOutputStream fos = new FileOutputStream(file);
  3.        BufferedOutputStream bos = new BufferedOutputStream(fos);
  4.        int size =50*1024*1024;
  5.        byte[] b = new byte[size];
  6.        bos.write(b);
  7.        bos.flush();
  8.        bos.close();
  9.        fos.close();
复制代码

这种方法需要20多秒,
性能更差了。
而且,把size 设置成50M以上,
在运行时就报错,
“Exception in thread "main" java.lang.OutOfMemoryError”
内存溢出了。(我机器的内存是196M)

而其他的下载软件在我的机器上怎么实现的生成有大容量的空文件呢?
而且速度还挺快的。

请各位支着。
回复 支持 反对

使用道具 举报

发表于 2005-3-8 22:29:59 | 显示全部楼层
你要设置-Xmx512m来扩大你jvm使用虚拟机heap的大小
还有,不要用RandomFileAccess来存取文件,速度很慢的。可以的话,尽量把内容放到内存里面来操作。其他语言也是这么做的,减少write,read的次数。建议你用内存映射文件来做(1.4以后的)。具体的我也没空说了。自己查查资料吧
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表