2012-03-12 57 views

回答

5

我會使用RandomAccessFile

public static byte[] readFileSegment(File file, long index, int count) { 
    RandomAccessFile raf = new RandomAccessFile(file, "r"); 
    byte[] buffer = new byte[count]; 
    try { 
     raf.seek(index); 
     raf.readFully(buffer, 0, count); 
     return buffer; 
    } finally { 
     raf.close(); 
    } 
} 

有其他方法與內存映射文件,NIO等等 - 但是這應該很簡單。

+0

你所缺乏的第二個參數:RandomAccessFile的RAF =新RandomAccessFile的(文件,「r」); – 2017-02-03 04:12:07

+0

你也應該支持多頭而不是整數。這是我的版本:http://tinybrain.de/1006742 – 2017-02-03 04:13:53

+0

@StefanReich:修正了兩者,謝謝。 (儘管我保留了'count'的第三個參數,而不是提供'long'端點。) – 2017-02-03 06:56:58

1

您可以使用RandomAccessFile或帶有跳過的FileInputStream。

我最喜歡的是使用內存映射文件,因爲它僅加載到內存中,你用什麼,幾乎不使用堆(不管你用多少)

0

當然 - 執行大致相同的步驟,你會要將整個文件讀到一個字節數組中,除了丟棄所需文件的一部分而不是將它們添加到數組中。

這提出了一個非常相關的問題,你將如何檢測你想要的部分的邊界。如果它是特定的哨兵字節(例如11111111),那麼這很簡單。如果你想要一些固定的偏移量就更容易了,只需要丟棄第一個字節,然後存儲以下字節,即m字節。

如果你正在檢測某種字節序列,那麼事情會變得更加複雜一些,因爲你必須維護到目前爲止匹配的部分的局部變量,然後如果它不匹配則丟棄如果整個序列結果匹配,則將整個序列或全部添加到輸出。

儘管如此,這個概念很簡單 - 從文件中讀取字節,就像在加載所有文件時一樣,但實際上只是將它們放在輸出數組中,如果它們是您想。

0

這其實在我需要得到一個文件最大的開頭部分一定字節大小的方式爲我工作:

try 
{ 
    int myDesiredCapacity = 100000; // 100KB 
    FileInputStream is = new FileInputStream(otherFile); 

    FileChannel fileChannel = is.getChannel(); 
    ByteBuffer byteBuffer = ByteBuffer.allocate(myDesiredCapacity); 

    byte[] bytes; 

    int byteCount = fileChannel.read(bb); 
    if(byteCount >= 0) 
    { 
     bb.flip(); 
     bytes = bb.array(); 
     FileOutputStream fileOutputStream = new FileOutputStream(targetFile); 
     fileOutputStream.write(bytes); 
     fileOutputStream.close(); 
     bb.clear(); 
    } 
} 

catch(IOException e) 
{ 
    e.printStackTrace(); 
} 
相關問題