Java的IO模式中使用了Decorator模式,其中filterInputStream是基础类,在这之上进行装饰。
文本输入输出:
InputStreamReader
PrintWriter
四个java io读取的比较:
Input Stream:
7b1eae17
24027 milliseconds
Buffered Input Stream:
7b1eae17
85 milliseconds
Random Access File:
7b1eae17
29943 milliseconds
Mapped File:
7b1eae17
60 milliseconds
以下为所用的代码片段:
import java.io.*;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.zip.CRC32;
/**
* Created by wyzhangdongsheng1 on 2014/10/17.
*/
public class NIOTest {
public static long checksumInputStream(String filename) throws IOException {
InputStream in = new FileInputStream(filename);
CRC32 crc = new CRC32();
int c;
while ((c = in.read()) != -1)
crc.update(c);
return crc.getValue();
}
public static long chesumBufferedInputStream(String filename) throws IOException {
InputStream in = new BufferedInputStream(new FileInputStream(filename));
CRC32 crc = new CRC32();
int c;
while ((c = in.read()) != -1)
crc.update(c);
return crc.getValue();
}
public static long checksumRandomAccessFile(String filename) throws IOException {
RandomAccessFile file = new RandomAccessFile(filename, "r");
long length = file.length();
CRC32 crc = new CRC32();
for(long p = 0; p < length; p++){
file.seek(p);
int c = file.readByte();
crc.update(c);
}
return crc.getValue();
}
public static long checksumMappedFile(String filename) throws IOException {
FileInputStream in = new FileInputStream(filename);
FileChannel channel = in.getChannel();
CRC32 crc = new CRC32();
int length = (int) channel.size();
MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0 , length);
for(int p = 0; p < length; p++){
int c = buffer.get(p);
crc.update(c);
}
return crc.getValue();
}
public static void main(String[] args) throws IOException {
String filename = "E:\\Book\\UnCate\\[福布斯经典投资故事:华尔街十大金融巨子的投资方略].Forbes.Greatest.Investing.Stories.2002.CHS.Scan-UNKNOWN.(美国)理查德·费伦.pdf";
System.out.println("Input Stream:");
long start = System.currentTimeMillis();
long crcValue = checksumInputStream(filename);
long end = System.currentTimeMillis();
System.out.println(Long.toHexString(crcValue));
System.out.println((end - start) + " milliseconds");
System.out.println();
System.out.println("Buffered Input Stream:");
start = System.currentTimeMillis();
crcValue = chesumBufferedInputStream(filename);
end = System.currentTimeMillis();
System.out.println(Long.toHexString(crcValue));
System.out.println((end - start) + " milliseconds");
System.out.println();
System.out.println("Random Access File:");
start = System.currentTimeMillis();
crcValue = checksumRandomAccessFile(filename);
end = System.currentTimeMillis();
System.out.println(Long.toHexString(crcValue));
System.out.println((end - start) + " milliseconds");
System.out.println();
System.out.println("Mapped File:");
start = System.currentTimeMillis();
crcValue = checksumMappedFile(filename);
end = System.currentTimeMillis();
System.out.println(Long.toHexString(crcValue));
System.out.println((end - start) + " milliseconds");
}
}