代码分享:import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class NIOCopyFile {
/**
* @param args
* @throws Exception
*/
public static void main(String args[]) throws Exception {
// 缓存区大小
int bufSize = 100;
ByteBuffer rBuffer = ByteBuffer.allocate(bufSize);
ByteBuffer wBuffer = ByteBuffer.allocateDirect(bufSize);
// 输入文件
File fileIn = new File("d:\\what21.txt");
FileChannel fcin = new RandomAccessFile(fileIn, "r").getChannel();
// 输出文件
File fileOut = new File("d:\\what21.2.txt");
FileChannel fcout = new RandomAccessFile(fileOut, "rws").getChannel();
// 按行读取处理
readFileByLine(bufSize, fcin, rBuffer, fcout, wBuffer);
}
/**
* @param bufSize
* @param inChannel
* @param rBuffer
* @param outChannel
* @param wBuffer
*/
public static void readFileByLine(int bufSize, FileChannel inChannel,
ByteBuffer rBuffer, FileChannel outChannel, ByteBuffer wBuffer) {
String enterStr = "\r\n";
try {
byte[] bs = new byte[bufSize];
int size = 0;
StringBuffer strBuf = new StringBuffer();
while (inChannel.read(rBuffer) != -1) {
int rSize = rBuffer.position();
rBuffer.rewind();
rBuffer.get(bs);
rBuffer.clear();
String 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 = new String(strBuf.toString() + line);
writeFileByLine(outChannel, 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();
}
}
/**
* @param outChannel
* @param wBuffer
* @param line
*/
public static void writeFileByLine(FileChannel outChannel, ByteBuffer wBuffer,
String line) {
try {
outChannel.write(wBuffer.wrap(line.getBytes()), outChannel.size());
} catch (IOException e) {
e.printStackTrace();
}
}
}