网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
本月文章推荐
.软件最大的追求是什么?.
.Java 动态代理实现AOP.
.浅论设计.
.浅析数据源在JDBC中的应用.
.Java新手入门需要掌握的30个基本.
.Jakarta Struts学习之新手上路.
.Apache Cocoon and XSP.
.jBPM 在定义文件里面设置Action .
.使用技巧:对Java编程中的文件操.
.利用 Velocity 模板引擎制作网站.
.说文解字:解读Java中的“垃圾方.
.Shark api 应用:判断流程进行到.
.开发技术:KETTLE JAVA API 开发.
.当主线程崩溃而其它线程继续运行.
.Java的网络功能与编程 一(转)-.
.SpringMVCframework深入总体分析.
.Key 属性.
.Java语言中Timer类的简洁用法(二).
.一个实现长整型数相加减的小程序.
.Struts开发指南之安装与使用.

调整 Java I/O 性能

发表日期:2008-1-5



  这篇文章讨论和阐明了提供 JavaTM I/O 性能的多种技术。大多技术围绕调整磁盘文件 I/O,但是有些内容也同样适合网络 I/O 和窗口输出。第一部分技术讨论底层的I/O问题,然后讨论诸如压缩,格式化和串行化等高级I/O问题。然而这个讨论没有包含应用设计问题,例如搜索算法和数据结构,也没有讨论系统级的问题,例如文件高速缓冲。 当我们讨论Java I/O时,值得注重的是Java语言采取两种截然不同的磁盘文件结构。一个是基于字节流,另一个是字符序列。在Java语言中一个字符有两个字节表示,而不是像通常的语言如c语言那样是一个字节。因此,从一个文件读取字符时需要进行转换。这个不同在某些情况下是很重要的,就像下面的几个例子将要展示的那样。 低级 I/O I问题加速I/O的基本规则 缓冲 读写文本文件 格式化的代价 随机访问 高级I/O问题压缩 高速缓冲 分解 串行化 获取文件信息 更多信息 加速I/O的基本规则作为这个讨论的开始,这里有几个如何加速I/O的基本规则: 避免访问磁盘 避免访问底层的操作系统 避免方法调用 避免个别的处理字节和字符 很明显这些规则不能在所有的问题上避免,因为假如能够的话就没有实际的I/O被执行。考虑下面的计算文件中的新行符('\n')的三部分范例。 方法1: 读方法第一个方法简单的使用FileInputStream的read方法:  import java.io.*;    public class intro1 {    public static void main(String args[]) {      if (args.length != 1) {        System.err.println("missing filename");        System.exit(1);      }      try {        FileInputStream fis =            new FileInputStream(args[0]);        int cnt = 0;        int b;        while ((b = fis.read()) != -1) {          if (b == '\n')            cnt++;        }        fis.close();        System.out.println(cnt);      }      catch (IOException e) {        System.err.println(e);      }    }  }然而这个方法触发了大量的底层运行时系统调用--FileInputStream.read--返回文件的下一个字节的本机方法。 方法 2: 使用大缓冲区第二种方法使用大缓冲区避免了上面的问题:  import java.io.*;   public class intro2 {   public static void main(String args[]) {    if (args.length != 1) {      System.err.println("missing filename");      System.exit(1);    }    try {      FileInputStream fis =          new FileInputStream(args[0]);      BufferedInputStream bis =          new BufferedInputStream(fis);      int cnt = 0;      int b;      while ((b = bis.read()) != -1) {        if (b == '\n')          cnt++;        }      bis.close();      System.out.println(cnt);    }    catch (IOException e) {      System.err.println(e);    }  } }BufferedInputStream.read 从输入缓冲区获取下一个字节,仅仅只访问了一次底层系统。 方法 3: 直接缓冲第三种方法避免使用 BufferedInputStream 而直接缓冲,因此排除了 read 方法的调用:  import java.io.*;    public class intro3 {    public static void main(String args[]) {      if (args.length != 1) {        System.err.println("missing filename");        System.exit(1);      }      try {        FileInputStream fis =            new FileInputStream(args[0]);        byte buf[] = new byte[2048];        int cnt = 0;        int n;        while ((n = fis.read(buf)) != -1) {          for (int i = 0; i < n; i++) {            if (buf[i] == '\n')              cnt++;          }        }        fis.close();        System.out.println(cnt);      }      catch (IOException e) {        System.err.println(e);      }    }  }对于一个1 MB 的输入文件,以秒为单位的执行时间是:   intro1    6.9 intro2    0.9 intro3    0.4或者说在最慢的方法和最快的方法间是17比1的不同。 这个巨大的加速并不能证实你应该总是使用第三种方法,即自己做缓冲。这可能是一个错误的倾向非凡是在处理文件结束事件时没有仔细的实现。在可读性上它也没有其它方法好。但是记住时间花费在哪儿了以及在必要的时候如何矫正是很有用。 方法2 或许是对于大多应用的 "正确" 方法. 缓冲方法 2 和 3 使用了缓冲技术, 大块文件被从磁盘读取,然后每次访问一个字节或字符。缓冲是一个基本而重要的加速I/O 的技术,而且有几个类支持缓冲(BufferedInputStream 用于字节, BufferedReader 用于字符)。 一个明显得问题是: 缓冲区越大I/O越快吗?典型的Java缓冲区长1024 或者 2048 字节,一个更大的缓冲区有可能加速 I/O但是只能占很小的比重,大约5 到10%。 方法4: 整个文件缓冲的极端情况是事先决定整个文件的长度,然后读取整个文件:   import java.io.*;    public class readfile {    public static void main(String args[]) {      if (args.length != 1) {        System.err.println("missing filename");&nbs
上一篇:StrutsHOW-TO系列之数据库访问 人气:512
下一篇:调整JavaTM 的I/O性能(四)(zt) 人气:494
浏览全部Java的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐