关于Java读写速度的考证(2)

3. FileInputStream,FileOutputSteam

这是一个最基本的读写文件的方式,这种读写一般是读取一个字节,或者定义长度的字节个数,如果为了节约时间的话,建议用缓冲区读写,这样速度会快一点。

参考代码如下:

InputStream in=new FileInputStream(new File(args[0]));
OutputStream out=new FileOutputStream(new File(args[1]));
int count;
byte[] b=new byte[1024*1024];
while((count=in.read(b))!=-1)
{
if(count!=b.length)
{
byte[] t=new byte[count];
for(int i=0;i<count;++i)
t[i]=b[i];
out.write(t);
}
else out.write(b);
}
in.close();
out.flush();
out.close();

参数和第一个选择一样。

4. 内存直接映射

这是一个内存直接映射读取的方式,如果文件大小合适,其他读取方式相对于他来说就是浮云啊,等一下我把各个大小的比对时间放上,大家应该可以看出来。但是这有一个限制,就是如果文件太大的话,映射内存会出现问题,要么就是内存不够,或者就是读取很慢,我觉得应该是文件太大,映射内存会出现不够的现象,然后内存会启动换入换出之类的,会浪费时间。但是基本的文件读写,他还是秒杀的。

参考代码如下:

FileChannel read = new RandomAccessFile(args[0],"r").getChannel();
FileChannel writer = new RandomAccessFile(args[1],"rw").getChannel();
long i = 0;
long size = read.size()/30;
//System.out.println(read.size());
ByteBuffer bb,cc = null;
while(i<read.size()&&(read.size()-i)>size)
{
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 = writer.map(FileChannel.MapMode.READ_WRITE, i, read.size()-i);
cc.put(bb);
bb.clear();
cc.clear();
read.close();
writer.close();

参数同上。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/1fea3e70d013ca51f5ed5c49405a7145.html