2011-07-11 34 views
0

我想在循環中讀取大文件的部分。我不得不只讀整個文件,但沒有奏效,我得到一個例外,該文件太大。我將我的代碼更改爲下面的列表。下面的代碼只能在第一個塊中讀取。我需要改變以轉移到下一個塊。Java NIO/MappedByteBuffer和映射,以塊爲單位讀取文件的一部分

final FileInputStream fis = new FileInputStream(f); 
    final FileChannel fc = fis.getChannel(); 
    final long sizeRead = fc.size() < defaultReadBufferSize ? fc.size() : defaultReadBufferSize; 
    final MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, sizeRead);   
    while (bb.hasRemaining()) {       
     final CharBuffer cb = decoder.decode(bb); 
     this.search(f, cb); 
     System.out.println("============>" + cb.length()); 
     System.out.println("============>" + bb.hasRemaining());    
    }   
    fc.close(); 
+2

您有大約44個問題沒有被接受的答案。也許你可以試着提出可能會有合理答案的問題或跟蹤答案,以便他們能夠被接受。 –

+0

你能否給我一個沒有被接受的答案的例子問題?我的所有問題都有答案。 –

+0

如果你回顧你的問題http://stackoverflow.com/users/10522/berlin-brown以黃色標記的問題有一個被接受的答案,白色的問題不會。第3-12頁有沒有被接受的答案的問題。 –

回答

3

您遇到的問題是無法以此方式訪問字符編碼的數據。即你需要知道角色之間的界限在哪裏。

訪問文件和字符解碼的成本很可能比讀取它的成本要高很多,所以我會使用一個BufferedReader,它會更加簡單。

例如說你想從第1000個字節讀取。你可以這樣做,但是你不知道第1000字節是否是多字節字符的一部分。

如果你可以假定所有字符都是字節,整個問題就簡單多了,你不需要CharBuffer,你可以直接訪問ByteBuffer,這會更快。

+0

基本上,如果我想使用filechannel.map,我將如何讀取一個文件而不一次讀取整個文件?這個API支持嗎? –

+0

是的,但是,除非您能確定字符的起始位置,否則您無法安全地將字節解碼爲字符。 –