java实现超大文件的读写

来源:互联网 发布:杭州大数据培训 编辑:程序博客网 时间:2024/05/05 03:32

一、对于几百M或上G的大文件可使用java nio进行读写 , 根据个人的需求 可能需要将一个超大文件读写形成很多较小的文件进行分析,这也不是什么难事,在读完一个缓冲区后 更换写入的对象即可,本文就不做详细介绍了,有需要的可以联系本人。

直接上程序吧

package cn.gzu.readfile; import java.io.File;  import java.io.IOException;  import java.io.RandomAccessFile;  import java.nio.ByteBuffer;  import java.nio.channels.FileChannel; public class ReadWriteNio { public static void main(String args[]) throws Exception{ int bufSize = 100; File fin = new File("E:\\jiahui\\2014-09-01.dat"); File fout = new File("E:\\jiahui\\res.txt"); System.out.print("开始读取并重写文件,请等待...");FileChannel fcin = new RandomAccessFile(fin, "r").getChannel(); ByteBuffer rBuffer = ByteBuffer.allocate(bufSize); FileChannel fcout = new RandomAccessFile(fout, "rws").getChannel(); ByteBuffer wBuffer = ByteBuffer.allocateDirect(bufSize); readFileByLine(bufSize, fcin, rBuffer, fcout, wBuffer); System.out.print("读写完成!"); }  /*读文件同时写文件*/public static void readFileByLine(int bufSize, FileChannel fcin, ByteBuffer rBuffer, FileChannel fcout, ByteBuffer wBuffer){ String enterStr = "\n"; try{ byte[] bs = new byte[bufSize]; int size = 0; StringBuffer strBuf = new StringBuffer(""); while((size = fcin.read(rBuffer)) != -1){ //while(fcin.read(rBuffer) != -1){ if(size > 1*1024){break;} int rSize = rBuffer.position();  rBuffer.rewind();  rBuffer.get(bs);  rBuffer.clear();  String tempString = new String(bs, 0, rSize,"UTF-8"); // System.out.println(size+": "+tempString);   int fromIndex = 0;  int endIndex = 0;  while((endIndex = tempString.indexOf(enterStr, fromIndex)) != -1){   String line = tempString.substring(fromIndex, endIndex);   line = new String(strBuf.toString() + line + "\n");   System.out.println(size+": "+line);   //System.out.print("</over/>");   //write to anthone file   writeFileByLine(fcout, wBuffer, line);   strBuf.delete(0, strBuf.length());   fromIndex = endIndex + 1;  }  if(rSize > tempString.length()){  strBuf.append(tempString.substring(fromIndex, tempString.length()));  }else{  strBuf.append(tempString.substring(fromIndex, rSize));  } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }  /*写文件*/public static void writeFileByLine(FileChannel fcout, ByteBuffer wBuffer, String line){ try { //write on file head //fcout.write(wBuffer.wrap(line.getBytes())); //wirte append file on foot fcout.write(wBuffer.wrap(line.getBytes()), fcout.size()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 


 

0 0