packagecom.chillax.imp;
importjava.io.File;
importjava.io.IOException;
importjava.io.RandomAccessFile;
importjava.nio.ByteBuffer;
importjava.nio.channels.FileChannel;
importjava.util.ArrayList;
importjava.util.Date;
importjava.util.List;
/**
* NIO读取百万级别文件
* @author Chillax
*
*/
publicclassNIO {
publicstaticvoidmain(String args[])throwsException {
intbufSize =1000000;//一次读取的字节长度
File fin = newFile("D:\\test\\20160622_627975.txt");//读取的文件
File fout = newFile("D:\\test\\20160622_627975_1.txt");//写出的文件
Date startDate = newDate();
FileChannel fcin = newRandomAccessFile(fin,"r").getChannel();
ByteBuffer rBuffer = ByteBuffer.allocate(bufSize);
FileChannel fcout = newRandomAccessFile(fout,"rws").getChannel();
ByteBuffer wBuffer = ByteBuffer.allocateDirect(bufSize);
readFileByLine(bufSize, fcin, rBuffer, fcout, wBuffer);
Date endDate = newDate();
System.out.print(startDate+"|"+endDate);//测试执行时间
if(fcin.isOpen()){
fcin.close();
}
if(fcout.isOpen()){
fcout.close();
}
}
publicstaticvoidreadFileByLine(intbufSize, FileChannel fcin,
ByteBuffer rBuffer, FileChannel fcout, ByteBuffer wBuffer) {
String enter = "\n";
List dataList = newArrayList();//存储读取的每行数据
byte[] lineByte =newbyte[0];
String encode = "GBK";
// String encode = "UTF-8";
try{
//temp:由于是按固定字节读取,在一次读取中,第一行和最后一行经常是不完整的行,因此定义此变量来存储上次的最后一行和这次的第一行的内容,
//并将之连接成完成