今天碰到了一個問題,從遊戲服務器下載下來的輸出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