我可以看到下面两个程序在性能上的巨大差异。
import java.io.*;
import java.util.Date;
class SkipProg2 {
public static void main (String args[]) {
System.out.println (" File Reading "+ args.length);
System.out.println (" 1st Arg "+ args[0]);
System.out.println (" 2nd Arg "+ args[1]);
try {
FileInputStream fis = new FileInputStream(args[0]);
System.err.println("Time before skip : " + new Date());
Long off = Long.parseLong(args[1]);
fis.skip (off);
System.err.println("Time After skip : " + new Date());
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr );
} // end try
catch (IOException e) {
System.err.println("Error: " + e);
}
} // end main
}和
import java.io.*;
import java.util.Date;
class SkipProg {
public static void main (String args[]) {
System.out.println (" File Reading "+ args.length);
System.out.println (" 1st Arg "+ args[0]);
System.out.println (" 2nd Arg "+ args[1]);
try {
FileInputStream fis = new FileInputStream(args[0]);
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr );
System.err.println("Time before skip : " + new Date());
Long off = Long.parseLong(args[1]);
br.skip (off);
System.err.println("Time After skip : " + new Date());
} // end try
catch (IOException e) {
System.err.println("Error: " + e);
}
} // end main
}一个用法是FileInputStream.skip (),另一个是BufferReader.skip ()。但是,如果偏移量较大,则会有很大的差异(对于Ex.在多线程应用中,相同代码的差异是巨大的(对于2 Gb的偏移量,大约有15-20分钟的延迟)。我不能用FileInputStream.skip ()替换BufferReader.skip (),因为一个以字节为单位接受偏移量,另一个以字符为单位接受偏移量。对于unicode文件,它是不可替代的。
第一个问题,我的假设是否正确?有什么建议?
提前谢谢。
发布于 2012-03-01 21:55:01
跳过字节可以在不读取字节的情况下跳过那么多字节。
跳过字符必须读取所有的字符/字节,才能找到第N个字符的位置。
我很惊讶阅读2 GB的文本需要15-20分钟。我本以为会更接近20秒。你们有什么类型的硬件?
如果你想在一个文本文件中随机访问,你需要维护一个从行号到字节位置的索引(这样花费的时间也是一样的)
https://stackoverflow.com/questions/9517367
复制相似问题