Java IO读写大文件的几种方式及测试 (2012-04-21 22:58:06)
来源:互联网 发布:小米3微信无法连接网络 编辑:程序博客网 时间:2024/05/17 01:25
原文:http://blog.sina.com.cn/s/blog_6699fade01012bvo.html
读取文件大小:1.45G
第一种,OldIO:
Java代码
- public
static void oldIOReadFile() throwsIOException{ -
BufferedReader br = BufferedReader( newFileReader( "G://lily_947.txt")); -
PrintWriter pw = PrintWriter( "G://oldIO.tmp"); -
c new= char[100*1024*1024]; -
-
-
pw.print(c); -
} -
-
} -
} -
pw.close(); -
br.close(); - }
耗时70.79s
第二种,newIO:
Java代码
- public
static void newIOReadFile() throwsIOException{ -
FileChannel read = RandomAccessFile( "G://lily_947.txt","r").getChannel(); -
FileChannel writer = RandomAccessFile( "G://newIO.tmp","rw").getChannel(); -
ByteBuffer bb = ByteBuffer.allocate( -
-
bb.flip(); -
writer.write(bb); -
bb.clear(); -
} -
read.close(); -
writer.close(); -
-
}
耗时47.24s
第三种,RandomAccessFile:
Java代码
- public
static void randomReadFile() throwsIOException{ -
RandomAccessFile read = RandomAccessFile( "G://lily_947.txt","r"); -
RandomAccessFile writer = RandomAccessFile( "G://random.tmp","rw"); -
b new= byte[200*1024*1024]; -
-
writer.write(b); -
} -
writer.close(); -
read.close(); -
}
耗时46.65
第四种,MappedByteBuffer:
Java代码
- public
static void mappedBuffer() throwsIOException{ -
FileChannel read = FileInputStream( "G://lily_947.txt").getChannel(); -
FileChannel writer = RandomAccessFile( "G://buffer.tmp","rw").getChannel(); -
i 0;= -
size 30;= read.size()/ -
ByteBuffer bb,cc = -
-
bb = read.map(FileChannel.MapMode.READ_ONLY, i, size); -
cc = writer.map(FileChannel.MapMode.READ_WRITE, i, size); -
cc.put(bb); -
i+=size; -
bb.clear(); -
cc.clear(); -
} -
bb = read.map(FileChannel.MapMode.READ_ONLY, i, read.size()-i); -
cc.put(bb); -
bb.clear(); -
cc.clear(); -
read.close(); -
writer.close(); -
-
}
耗时:36
前三种读法对应的资源占用图如下:
相对于最后一种内存直接映射方式前面的测试其实无意义,基本秒杀。。。。。
对于很大的文件直接分块映射时内存会不够,这是因为MappedByteBuffer未被释放造成的,sun未提供直接回收MappedByteBuffer区域的方法,这个时候有两种方法解决,第一种比较愚笨的:
Java代码
-
System.gc(); -
System.runFinalization(); -
{ -
Thread.sleep( - }
catch (InterruptedException e) { -
-
e.printStackTrace(); - }
第二种网上找来的,利用反射调用clean方法:
Java代码
- public
static void unmap( finalMappedByteBuffer buffer) { -
(buffer null)== { -
-
} -
AccessController.doPrivileged( PrivilegedAction<Object>() { -
Object run() { -
{ -
Method getCleanerMethod = buffer.getClass().getMethod( new Class[ 0]); -
(getCleanerMethod null)!= { -
getCleanerMethod.setAccessible( -
Object cleaner = getCleanerMethod.invoke(buffer, Object[ 0]); -
Method cleanMethod = cleaner.getClass().getMethod( new Class[ 0]); -
(cleanMethod null)!= { -
cleanMethod.invoke(cleaner, Object[ 0]); -
} -
} -
} (Exception e) { -
e.printStackTrace(); -
} -
null; -
} -
-
}); -
}
转自http://aronlulu.iteye.com/blog/1018370
0 0
- Java IO读写大文件的几种方式及测试 (2012-04-21 22:58:06)
- Java IO读写大文件的几种方式及测试
- Java IO读写大文件的几种方式及测试
- Java IO读写大文件的几种方式及测试
- Java IO读写大文件的几种方式及测试
- Java IO读写大文件的几种方式及测试
- Java IO读写大文件的几种方式及测试
- java IO读写大文件的几种方式及测试
- Java IO读写大文件的几种方式及测试
- Java IO读写大文件的几种方式及测试
- Java IO读写大文件的几种方式及测试
- Java IO读写大文件的几种模式及测试
- Java读写文件的几种方式
- 【Java基础知识】IO流--字节流读写数据以及复制文件的几种方式
- 【Java基础知识】IO类--字符流读写数据以及复制文件的几种方式
- 关于SandBox机制及文件读写的几种方式
- java 文件同步读写的几种方式
- Python 读写文件的几种方式
- ios之数据库的拷贝
- 计算机核心期刊排名
- 设计一个复数类Complex,并计算复数的和、差
- leetcode:Binary Tree Zigzag Level Order Traversal
- MongoDB
- Java IO读写大文件的几种方式及测试 (2012-04-21 22:58:06)
- 日志14-12-8
- Redis
- gcc生成静态库和动态库
- Struts2 的工作流程
- Cassandra
- Eclipse格式化XML文件
- java实现图片与base64字符串之间的转换(不适用SUN公司的sun.misc.BASE64Encoder)
- 运用TF-IDF 提取特征词 k-means 挖掘微博的兴趣特征群体