JAVA NIO 大文件读取

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

public class TestNio {
	public static void main(String args[]) throws Exception {
		System.err.println("begin");
		long start = System.currentTimeMillis();
		int _5M = 1024*1024*5;
		File fin = new File("D:\\debug.log");  //文件大小200M
		File fout = new File("D:\\debug-bak.log");
		FileChannel fcin = new RandomAccessFile(fin, "r").getChannel();
		ByteBuffer rBuffer = ByteBuffer.allocate(_5M);
		FileChannel fcout = new RandomAccessFile(fout, "rws").getChannel();
		ByteBuffer wBuffer = ByteBuffer.allocateDirect(_5M);
		readFileByLine(_5M, fcin, rBuffer, fcout, wBuffer);
		System.err.print((System.currentTimeMillis() - start) /1000);
	}

	public static void readFileByLine(int bufSize, FileChannel fcin,
			ByteBuffer rBuffer, FileChannel fcout, ByteBuffer wBuffer) {
		String enterStr = "\n";
		try {
			byte[] bs = new byte[bufSize];
			StringBuilder strBuf = new StringBuilder("");
			String tempString = null;
			while (fcin.read(rBuffer) != -1) {
				int rSize = rBuffer.position();
				rBuffer.rewind();
				rBuffer.get(bs);
				rBuffer.clear();
				tempString = new String(bs, 0, rSize);
				int fromIndex = 0;
				int endIndex = 0;
				while ((endIndex = tempString.indexOf(enterStr, fromIndex)) != -1) {
					String line = tempString.substring(fromIndex, endIndex);
					line = strBuf.toString() + line;
					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) {
			e.printStackTrace();
		}
	}

	public static void writeFileByLine(FileChannel fcout, ByteBuffer wBuffer,
			String line) {
		try {
			fcout.write(wBuffer.wrap(line.getBytes()), fcout.size());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

你可能感兴趣的:(java,nio,大文件)