NIO之輕鬆讀取大文件

今天碰到了一個問題,從遊戲服務器下載下來的輸出log有一個多G大。用記事本打不開,EditPlus也打不開,都提示文件太大。用word也打不開,提示文件大於512M。打不開怎麼查找錯誤啊。因而他問我解決辦法。我想了想,決定寫一個簡單的程序讀取這個log,把這個log切分紅一些小的能夠用Editplus打開的文本。正好前段時間看了一些NIO的東西,因此決定用NIO來寫。沒想到,10幾行代碼就搞定了。下面附上源代碼:
ReadLargeTextWithNIO.java

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
 *
 * 用NIO讀取大文本(1G以上)
 *
 * @author landon
 *
 */
public class ReadLargeTextWithNIO
{
 public static void main(String...args) throws IOException
 {
  FileInputStream fin = new FileInputStream("d:\\temp\\outlineA1.log");
  FileChannel fcin = fin.getChannel();
  
  ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024 * 50);
  
  while(true)
  {
   buffer.clear();
   
   int flag = fcin.read(buffer);
   
   if(flag == -1)
   {
    break;
   }
   
   buffer.flip();
   
   FileOutputStream fout = new FileOutputStream("d:\\temp\\" + Math.random() + ".log");
   FileChannel fcout = fout.getChannel();
   
   fcout.write(buffer);
  }
 }
}

下面簡單說幾個注意的地方:
a.由於要把超大文本切分紅小的部分,因此分配buffer的時候儘可能大一些,這裏我分配的大小是50M,不過若是太大了,可能會報內存溢出。
b.說一下clear和flip的方法,直接上源碼:
public final Buffer clear()
{
position = 0;
limit = capacity;
mark = -1;
return this;
}

public final Buffer flip()
{
limit = position;
position = 0;
mark = -1;
return this;
}
一看便知兩者的區別。
c.跳出循環也即讀完的判斷是read返回的flag是-1
相關文章
相關標籤/搜索