服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

调整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);

        

扫描关注微信公众号