设为首页 加入收藏

TOP

Java 内存映射文件MappedByteBuffer
2015-11-10 13:45:47 来源: 作者: 【 】 浏览:6
Tags:Java 内存 映射 文件 MappedByteBuffer

MappedByteBuffer是java nio引入的文件内存映射方案,读写性能极高。在NIO中主要用到普通的输入流,带缓冲的输入流,RandomAccessFile和MappedByteBuffer。


现在我们来看看这四种流的效率,废话少说直接上代码。


我们采用CRC32来循环冗余校验。CRC32在java.util.zip包中。


1.普通的输入流。


public static long checksumInputStream(Path filename) throws IOException
? {
? ? try (InputStream in = Files.newInputStream(filename))
? ? {
? ? ? ? CRC32 crc = new CRC32();
?
? ? ? ? int c;
? ? ? ? while ((c = in.read()) != -1)
? ? ? ? ? crc.update(c);
? ? ? ? return crc.getValue();
? ? }
? }


2.带缓冲的输入流


public static long checksumBufferedInputStream(Path filename) throws IOException
{
? try (InputStream in = new BufferedInputStream(Files.newInputStream(filename)))
? {
? ? ? CRC32 crc = new CRC32();
?
? ? ? int c;
? ? ? while ((c = in.read()) != -1)
? ? ? ? crc.update(c);
? ? ? return crc.getValue();
? }
}


3.RandomAccessFile


public static long checksumRandomAccessFile(Path filename) throws IOException
? {
? ? try (RandomAccessFile file = new RandomAccessFile(filename.toFile(), "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();
? ? }
? }


4.MappedByteBuffer


public static long checksumMappedFile(Path filename) throws IOException
{
? try (FileChannel channel = FileChannel.open(filename))
? {
? ? ? 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 name = "txt.txt";
? ? ? ? Path filename = Paths.get(name);
? ? ? ? long start, crcValue, end;
?
? ? ? ? System.out.println("Input Stream:");
? ? ? ? start = System.currentTimeMillis();
?
? ? ? ? crcValue = checksumInputStream(filename);
? ? ? ? end = System.currentTimeMillis();
? ? ? ? System.out.println(Long.toHexString(crcValue));
? ? ? ? System.out.println((end - start) + " milliseconds");
?
? ? ? ? System.out.println("Buffered Input Stream:");
? ? ? ? start = System.currentTimeMillis();
? ? ? ? crcValue = checksumBufferedInputStream(filename);
? ? ? ? end = System.currentTimeMillis();
? ? ? ? System.out.println(Long.toHexString(crcValue));
? ? ? ? System.out.println((end - start) + " milliseconds");
?
? ? ? ? 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("Mapped File:");
? ? ? ? start = System.currentTimeMillis();
? ? ? ? crcValue = checksumMappedFile(filename);
? ? ? ? end = System.currentTimeMillis();
? ? ? ? System.out.println(Long.toHexString(crcValue));
? ? ? ? System.out.println((end - start) + " milliseconds");
? ? }


为了保证每种流相互之间对结果没有影响,我们可以分别把main方法中其他流的代码注释掉。


最后可以看到MappedByteBuffer效率最高,所消耗的时间最少。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇二叉树三种遍历的递归和迭代解法 下一篇C++线程创建传递的参数发生改变

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: