<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    I want to fly higher
    programming Explorer
    posts - 114,comments - 263,trackbacks - 0
        今天同事碰到了一個問題,從游戲服務器下載下來的輸出log有一個多G大。用記事本打不開,EditPlus也打不開,都提示文件太大。用word也打不開,提示文件大于512M。打不開怎么查找錯誤啊。于是他問我解決辦法。我想了想,決定寫一個簡單的程序讀取這個log,把這個log切分成一些小的可以用Editplus打開的文本。正好前段時間看了一些NIO的東西,所以決定用NIO來寫。沒想到,10幾行代碼就搞定了。下面附上源代碼:
         ReadLargeTextWithNIO.java
     1package com.nio.entrace;
     2
     3import java.io.FileInputStream;
     4import java.io.FileOutputStream;
     5import java.io.IOException;
     6import java.nio.ByteBuffer;
     7import java.nio.channels.FileChannel;
     8
     9/**
    10 * 
    11 * 用NIO讀取大文本(1G以上)
    12 * 
    13 * @author landon
    14 *
    15 */

    16public class ReadLargeTextWithNIO 
    17{
    18 public static void main(Stringargs) throws IOException
    19 {
    20  FileInputStream fin = new FileInputStream("d:\\temp\\outlineA1.log");
    21  FileChannel fcin = fin.getChannel();
    22  
    23  ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024 * 50);
    24  
    25  while(true)
    26  {
    27   buffer.clear();
    28   
    29   int flag = fcin.read(buffer);
    30   
    31   if(flag == -1)
    32   {
    33    break;
    34   }

    35   
    36   buffer.flip();
    37   
    38   FileOutputStream fout = new FileOutputStream("d:\\temp\\" + Math.random() + ".log");
    39   FileChannel fcout = fout.getChannel();
    40   
    41   fcout.write(buffer);
    42  }

    43 }

    44}

    45
    46


        下面簡單說幾個注意的地方:
         a.因為要把超大文本切分成小的部分,所以分配buffer的時候盡量大一些,這里我分配的大小是50M,不過如果太大了,可能會報內存溢出。
         b.說一下clear和flip的方法,直接上源碼:

     1public final Buffer clear()
     2    {
     3        position = 0;
     4        limit = capacity;
     5        mark = -1;
     6        return this;
     7    }

     8
     9 public final Buffer flip()
    10    {
    11        limit = position;
    12        position = 0;
    13        mark = -1;
    14        return this;
    15    }


        一看便知二者的區別。

        c.跳出循環也即讀完的判斷是read返回的flag是-1

        利用NIO確實方便,以后繼續研究->NIO網絡編程
    posted on 2010-12-20 22:09 landon 閱讀(5178) 評論(4)  編輯  收藏 所屬分類: Program

    FeedBack:
    # re: NIO入門之輕松讀取大文件
    2010-12-21 14:37 | @joe
    不用nio也可以。nio和bio的區別不再這。而在主動和被動模式。  回復  更多評論
      
    # re: NIO入門之輕松讀取大文件
    2010-12-21 21:08 | landonlv
    嗯,大牛,學習了。@joe
      回復  更多評論
      
    # re: NIO入門之輕松讀取大文件
    2011-07-28 09:31 | greatghoul
    為什么不把代碼放在代碼塊中,方便閱讀,你這樣格式都破壞掉了。  回復  更多評論
      
    # re: NIO入門之輕松讀取大文件
    2011-07-29 23:05 | landonlv
    嗯,直接粘貼的。在ide中是格式的,貼過來就不行了@greatghoul
      回復  更多評論
      
    主站蜘蛛池模板: 成全在线观看免费观看大全 | 国产成人免费手机在线观看视频 | 亚洲精品无码mⅴ在线观看| 最近中文字幕大全免费视频| 亚洲Aⅴ无码专区在线观看q| 久久狠狠躁免费观看| 亚洲黄色网站视频| 4399好看日本在线电影免费| 亚洲精品亚洲人成在线播放| 最近最新MV在线观看免费高清| 亚洲成a人片在线观看精品| 成年女人午夜毛片免费看| 亚洲精品色播一区二区 | 国产亚洲A∨片在线观看| 国产好大好硬好爽免费不卡| 久久久久久亚洲精品中文字幕| 69国产精品视频免费| 77777午夜亚洲| 免费a级毛片视频| a毛看片免费观看视频| 亚洲影院在线观看| 成年女人免费视频播放体验区| 国产成人高清亚洲一区91| 亚洲免费人成在线视频观看| 91青青国产在线观看免费| 亚洲欧美第一成人网站7777| 亚洲成av人片一区二区三区 | 亚洲人成色在线观看| 亚洲国产a级视频| 久久精品乱子伦免费| 亚洲一级特黄特黄的大片| 免费在线观看黄网| 久久午夜夜伦鲁鲁片无码免费| 亚洲乱码卡一卡二卡三| 亚洲女同成人AⅤ人片在线观看| 日本在线免费播放| 香蕉视频亚洲一级| 亚洲欧洲日韩国产综合在线二区| 最近中文字幕无吗免费高清| 国产区在线免费观看| 色天使亚洲综合在线观看|