package demo9;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.io.FileUtils;
/**
* MappedByteBuffer 与 普通的文件读取方式内存占用对比测试
* @author mengfeiyang
*
*/
public class MappedMemTest {
@SuppressWarnings("resource")
public static void main(String args[]) throws FileNotFoundException, IOException {
File file = new File("E:\\img\\escClick-2016041810.log");//文件大小为60M
//List<String> ll = FileUtils.readLines(file);
//for(String l : ll)out(l); //此种方式内存占用200M起
long fileLength = file.length();
final int BUFFER_SIZE=60;
//此种方式内存占用将稳定在20M
MappedByteBuffer inputBuffer = new RandomAccessFile(file,"r").getChannel().map(FileChannel.MapMode.READ_ONLY, 0, fileLength);
byte[] dst = null;
List<Byte> dst2 = null;
int offset = 0;
int s = 0;
do{
dst = new byte[BUFFER_SIZE];
dst2 = new ArrayList<Byte>();
for(int a=0;a<BUFFER_SIZE;a++){
dst[a] = inputBuffer.get(offset);
offset ++;
}
String d1 = new String(dst,"UTF-8");
if(!d1.endsWith("1460944800}")){
for(int b = 0;b<2048;b++){
byte by = inputBuffer.get(offset);
dst2.add(by);
offset++;
if(by == '\n'){
s++;
String d2 = new String(list2Array(dst2),"UTF-8");
System.out.println(s+" "+d1+" --> "+d2);
break;
}
}
}
}while(offset<fileLength);
}
public static byte[] list2Array(List<Byte> blist){
byte[] barr = new byte[blist.size()];
for(int i=0;i<blist.size();i++){
barr[i] = blist.get(i);
}
return barr;
}
}