JAVA之NIO按行讀取大檔案__JAVA讀取大檔案

來源:互聯網
上載者:User

        做項目過程中遇到要解析100多M的TXT檔案,併入庫。用之前的FileInputStream、BufferedReader顯然不行了,雖然readLine這方法可以直接按行讀取,但是去讀一個140M左右,68W條資料的檔案時,不但耗時間長度而且會記憶體溢出,即你等不到讀完68W條資料時就記憶體溢出了。所以得用NIO下面的相關對象及方法。

       用到 位元組緩衝區(java.nio.ByteBuffer);用於讀取、寫入、映射和操作檔案的通道( java.nio.channels.FileChannel);設定文本字條集(java.nio.charset.Charset);支援對隨機存取檔案的讀取和寫入(java.io.RandomAccessFile)。

       具體思路是:設定兩個緩衝區,一大一小,大的緩衝區為每次讀取的量,小的緩衝區存放每行的資料(確保大小可存放文本中最長的那行)。讀取的時候判斷是不是分行符號13,是的話則返回一行資料,不是的話繼續讀取,直到讀完檔案。

       實現方法:

        FileChannel fc=raf.getChannel();

       //一次讀取檔案,讀取的位元組緩衝數
       ByteBuffer fbb=ByteBuffer.allocate(1024*5);
        fc.read(fbb);
        fbb.flip();

     //每行緩衝的位元組   根據你的實際需求    

      ByteBuffer bb=ByteBuffer.allocate(500);

  

              //判斷是否讀完檔案

public boolean hasNext() throws IOException {

        if(EOF)return false;
        if(fbb.position()==fbb.limit()){//判斷當前位置是否到了緩衝區的限制
            if(readByte()==0)  return false;
        }
        while(true){
            if(fbb.position()==fbb.limit()){
                if(readByte()==0)  break;
            }
            byte a=fbb.get();
            if(a==13){
                if(fbb.position()==fbb.limit()){
                    if(readByte()==0)  break;
                }
                return true;
            }else{
                if (bb.position() < bb.limit()) {
                    bb.put(a);
                }else {
                    if(readByte()==0)  break;
                }
            }
        }
        return true;
    }

private int readByte() throws IOException{
        //使緩衝區做好了重新讀取已包含的資料的準備:它使限制保持不變,並將位置設定為零。
        fbb.rewind();
        //使緩衝區做好了新序列通道讀取或相對 get 操作的準備:它將限制設定為當前位置,然後將該位置設定為零。
        fbb.clear();
        if(this.fc.read(fbb)==-1){
            EOF=true;
            return 0;
        }else{
            fbb.flip();
            return fbb.position();
        }
    }

    public byte[] next(){
        bb.flip();

        //此處很重要,返回byte數組方便,行被分割的情況下合并,否則如果正好達到緩衝區的限制時,一個中文漢字被拆了兩個位元組,就會顯示不正常
        byte tm[] = Arrays.copyOfRange(bb.array(), bb.position(), bb.limit());
        bb.clear();
        return tm;
    }



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.