第二个程序比第一个大约快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);
闽公网安备 35060202000074号