进入旧版 | 服务项目 | 成功案例 | 联系方式 | 过客留言 | 友情链接
   
设为首页
加入收藏
联系我们
网站首页 | 新闻资讯 | 操作系统 | 办公软件 | 网络软件 | 工具软件 | 媒体动画 | 网页制作 | 网站开发 | 程序开发 | 平面设计
Photoshop视频教程 | Word入门 | Flash入门 | JScript | VBScript | ASP | PHP | ADO | 网页特效 | 3DS MAX6.0命令 | 系统进程
您当前的位置:GOODSGY电脑学习网 -> 网站开发 -> JSP -> 文章内容  
调整JavaTM 的I/O性能(四)(zt)

第二个程序比第一个大约快20%,代价是不得不写一些技巧性的底层代码。


StreamTokenizer是一个杂和的类,因为它从基于字符的流中读取(象BufferedReader)数据,但同时又以字节进 行操作,即尽管它们是字母,也要用两字节的值来处理所有的字符(大于0xff)。


序列化


序列化使用一个标准格式,将任意一个Java数据结构转换为字节流。例如,如下程序输出一个随机的整数数 组:


      import java.io.*;

      import java.util.*;



      public class serial1 {

          public static void main(String args[]) {

              ArrayList al = new ArrayList();

              Random rn = new Random();

              final int N = 100000;



              for (int i = 1; i <= N; i++)

                  al.add(new Integer(rn.nextInt()));



              try {

                  FileOutputStream fos =

                          new FileOutputStream("test.ser");

                  BufferedOutputStream bos =

                          new BufferedOutputStream(fos);

                  ObjectOutputStream oos =

                          new ObjectOutputStream(bos);

                  oos.writeObject(al);

                  oos.close();

              }

              catch (Throwable e) {

                  System.err.println(e);

              }

          }

      }



而下面的程序又将该数组重新读入:



      import java.io.*;

      import java.util.*;



      public class serial2 {

          public static void main(String args[]) {

              ArrayList al = null;



              try {

                  FileInputStream fis =

                          new FileInputStream("test.ser");

                  BufferedInputStream bis =

                          new BufferedInputStream(fis);

                  ObjectInputStream ois =

                          new ObjectInputStream(bis);

                  al = (ArrayList)ois.readObject();

                  ois.close();

              }

              catch (Throwable e) {

                  System.err.println(e);

              }

          }

      }

请注意我们使用了缓冲技术来加速I/O操作。


这里是否存在比序列化更快的方法来输出大容量的数据,然后又读取回来?除了极个别的例子外,可能没 有。例如,假定您需要以文本形式输出一个64位长的整数,而不是8字节的集合。作为文本形式的一个长整数 的最大长度大约是20个字符,也就是二进制表示的2.5倍。因此,看上去这种格式似乎不可能更快。然而,在 某些情况下,例如位图,一种特定的格式可能是一种改进的方法。然而,使用自己的方案会与序列化提供的 标准相冲突,因此,这样做不得不涉及一些权衡。


除了序列化(采用DataInputStream和DataOutputStream)实际的I/O和格式化开销外,还有其他代价,例如,当解 除序列化时需要创建新的对象。


请注意DataOutputStream的方法可能被用来开发半定制(semi-custom)的数据格式,例如:


      import java.io.*;

      import java.util.*;



      public class binary1 {

          public static void main(String args[]) {

              try {

                  FileOutputStream fos =

                          new FileOutputStream("outdata");

                  BufferedOutputStream bos =

                          new BufferedOutputStream(fos);

                  DataOutputStream dos =

                          new DataOutputStream(bos);

                  Random rn = new Random();

                  final int N = 10;

                  dos.writeInt(N);

                  for (int i = 1; i <= N; i++) {

                      int r = rn.nextInt();

                      System.out.println(r);

                      dos.writeInt(r);

                  }

                  dos.close();

              }

              catch (IOException e) {

                  System.err.println(e);

              }

          }

      }



和:



      import java.io.*;



      public class binary2 {

          public static void main(String args[]) {

              try {

                  FileInputStream fis =

                          new FileInputStream("outdata");

                  BufferedInputStream bis =

                          new BufferedInputStream(fis);

                  DataInputStream dis =

                          new DataInputStream(bis);

                  int N = dis.readInt();

                  for (int i = 1; i <= N; i++) {

                      int r = dis.readInt();

                      System.out.println(r);

                  }

                  dis.close();

              }

              catch (IOException e) {

                  System.err.println(e);

              }

          }

      }

这些程序向文件写入10个整数,然后读出。


获取文件信息


到目前为止,讨论仅涉及对单个文件的输入和输出。但是,还存在加速I/O性能的另一方面,这与查找文件属 性有关。例如,考虑一个打印文件长度的小程序:


      import java.io.*;



      public class length1 {

          public static void main(String args[]) {

              if (args.length != 1) {

                  System.err.println("missing filename");

                  System.exit(1);

              }

              File f = new File(args[0]);

              long len = f.length();

              System.out.println(len);

          }

      }

Java运行时系统自身是无法知道文件长度的,因而必须询问底层操作系统以获得相关信息。对于其他文件信 息也是如此,例如文件是否是一个目录,最后修改时间等等。在java.io包中的File类提供了一套查询这些信 息的方法。这样的查询通常在需要很长的时间,因此应该尽量少用。


查询文件信息的一个较长的例子是从文件系统的根目录开始进行递归遍历,以输出系统中所有的文件及其路 径,该例子看上去象这样:


      import java.io.*;



      public class roots {

          public static void visit(File f) {

              System.out.println(f);

          }



          public static void walk(File f) {

              visit(f);

              if (f.isDirectory()) {

                  String list[] = f.list();

                  for (int i = 0; i < list.length; i++)

                      walk(new File(f, list[i]));

              }

          }



          public static void main(String args[]) {

              File list[] = File.listRoots();

              for (int i = 0; i < list.length; i++) {

                  if (list[i].exists())

                      walk(list[i]);

                  else

                      System.err.println("not accessible: "

                                  + list[i]);

              }

          }

      }

这个例子使用了File类的方法,例如isDirectory和exists,来遍历目录结构。每个文件依照其类型(普通文件 或目录)仅被查询一次。


更多的信息


站点:


Javatm I/O Performance Tuning


举例说明了提高I/O性能的一些方法。部分技术与在上面所提到的比较相似,其他的则涉及到底层处理问题。


Don Knuth的著作, The Art of Computer Programming, 第3卷,讨论了外部排序和搜索算法,例如对B-树的使用。

在百度中搜索:调整JavaTM 的I/O性能(四)(zt)
在Google中搜索:调整JavaTM 的I/O性能(四)(zt)
在Yahoo中搜索:调整JavaTM 的I/O性能(四)(zt)

收藏到网摘:新浪VIVI 365key 我摘 POCO网摘 博采中心 YouNote 和讯网摘 天天收藏
[] [返回上一页] [打 印] [收 藏]

 相关文章    最新文章
· [组图] 巧用PS调整工具打造梦幻世界
· Photoshop视频教程:5.2.1 色彩调整
· [图文] 教你如何调整vista系统雅黑字体DPI..
· [图文] 调整Vista系统安全策略 让UAC更友善..
· [组图] 轻松调整DVDRip压缩电影的字幕大小..
· [组图] Photoshop图层面板调整图层图标怪问..
· [组图] Photoshop十秒钟调整曝光不足照片
· [组图] 巧用Photoshop色阶调整得到书法效果..
· [组图] Photoshop通道互换法调整照片色调
· [组图] Photoshop调整色彩饱和度欠佳的图片..
 
· 提升JSP页面响应速度的七大秘籍绝招
· 开发一个调试JSP的Eclipse插件
· JSP报表打印的一种简单解决方案
· JSP/Servlet的重定向技术综述
· java的md5加密类(zt)
· 一个用来访问http服务器的东西。功能类似..
· 菜鸟调试手记一(sql server 中文问题)
· Java性能优化技巧集锦(2)
· 用java压缩文件示例(没有中文问题)
· 使用XML/HTC/DHTML模拟标准Windows菜单

∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论…]
站内搜索

精彩图文
  网站导航  
操作系统 办公软件 网络软件
Vista Windows2003 WindowsXP Windows2000/NT Windows9X/ME Linux 其他 Word Excel Powerpoint Outlook 金山系列 其他 网页浏览 上传下载 联络聊天 邮件工具 服务器软件 网络辅助
工具软件 媒体动画 网页制作
系统工具 媒体工具 压缩工具 图文处理 文件管理 其他 3DMAX Authorware Director Maya 视频处理 其他 Flash Dreamweaver FireWorks FrontPage LiveMotion Golive HTML/CSS 其它
网站开发 平面设计 程序设计
ASP JSP PHP CGI JavaScript VBScript XML/SOAP Web服务器 Photoshop PhotoImpact CorelDraw Illustrator Freehand 设计欣赏 其他 VB VC .NET C/C++ DELPHI JAVA

冀ICP备05019428号
Copyright © 2004-2008 电脑学习网 Inc.All rights reserved.
TEL:13832340607
QQ:39873155
E_Mail:goodsgy(#)hotmail.com   (把(#)替换成@)
MSN:goodsgy(#)hotmail.com   (把(#)替换成@)