java读取文件效率问题

最近在项目中有一个用smb读取共享文件的应用,在部署过程中发现一个奇怪现象,在公司测试时其用时还马马虎虎,虽是有点慢,但还不至于让人无法忍受.但一部署都客户现场,则超级慢.严重影响系统的使用.没办法只能对其进行整改:


    1.首先,将所有的for循环检查一遍,能移出去的尽量移出去,并进行不同方法的封装


    2.将原有方法中抛出的异常全部捕捉起来,并将所有该关闭的连接全部在finally里面关闭


    3.对线程设置timeout,以防止死锁


    最后是对程序进行手术,阅读代码才发现原来代码中下载文件用的是:以字节为单位读取文件内容,一次读一个字节这种方式 就是这个原因造成系统运行超慢:


           int tempbyte;   
           while ((tempbyte = ()) != -1) {   
               (tempbyte);   
            }


 将其稍微改动一下,一次性读入多个字节:


           byte[] tempbytes = new byte[1024];   
           int byteread = 0;  


           // 读入多个字节到字节数组中,byteread为一次读入的字节数   
           while ((byteread = (tempbytes)) != -1) {   
               (tempbytes, 0, byteread);


            }


 重启运行,原来要近一个小时的下载工作,竟然只用了不到5秒钟,就搞定.


 


 总结:


     内存存取时间单位是纳秒级(10E-9),磁盘存取时间单位是毫秒级(10E-3),同样操作一次的开销,内存比磁盘快了百万倍。因此要尽量用缓存流进行读写文件,以减少对磁盘的读取次数.


     经只读测试,BufferedReader耗用的时间是RandomAccessFile的10倍以上,FileInputStream耗用的时间是RandomAccessFile的1-2倍,测试读的文件是35M左右,如果文件再大差距更明显.这里后面两个用的是字节byte[] b1=new byte[8*1024],而前面也用的是字符char[] data=new char[8*1024]


     注意:如果RandomAccessFile用readLine(),则效果会差很多,耗时会比用字节的慢100多倍.


     看来IO读取文件,这里面水还挺深的,有时间明天再整理一下.



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值