以下哪种文件读取方法效率最高?如何通过代码测试其效率?

在同样的情况下(注:文件小于2M)分别运行以下代码,哪一个性能最高,速度最好?( )
A、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);
}
}
}
B、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);
}
}
}
C、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);
}
}
}
A.A最快 B.B最快 C.C最快 D.都一样

参考下实现

[code="java"]
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 {
long begin = System.nanoTime();
FileInputStream fis = new FileInputStream(args[0]);
int cnt = 0;
int b;
while ((b = fis.read()) != -1) {
if (b == '\n')
cnt++;
}
fis.close();
long end = System.nanoTime();
System.out.println("本次读取文件耗时为:" + (end-begin) + "毫微秒(1/1000000秒)");
System.out.println(cnt);
} catch (IOException e) {
System.err.println(e);
}
}
}

[/code]

读取文件之前获取系统的时间,读取文件后又一次获取系统的时间,两个时间相减即可得到谁运行的快,效率高。

[code="java"]long timeBegin = System.currentTimeMillis();
......
long timeEnd = System.currentTimeMillis();
//
[/code]
两次时间相减,越短的效率越高。测试下,应该是有缓存的读取效率高

C.C最快

A 一次读一个字符效率太低。

B C 都是一次读一段缓存。
但是:
B:管理缓存是在BufferedInputStream类里做的。
C:使用private native int readBytes(byte b[], int off, int len)方法读,这是一个native方法,效率应该更高。

具体看FileInputStream和BufferedInputStream的源码吧。

文件比较大的时候,C最快。
当文件比较小的时候,A,B,C差不多。

测试完,读取文件2M!事实说明C最快!
[img]http://dl.iteye.com/upload/picture/pic/57131/080a722e-8cce-3d48-9cd6-be721c9088bd.png[/img]