2013-06-01 27 views
2

如果文件大小> 8k,爲什麼LAST字節讀= 0?Java BufferedInputStream行爲

private static final int GAP_SIZE = 8 * 1024; 

public static void main(String[] args) throws Exception{ 
    File tmp = File.createTempFile("gap", ".txt"); 
    FileOutputStream out = new FileOutputStream(tmp); 
    out.write(1); 
    out.write(new byte[GAP_SIZE]); 
    out.write(2); 
    out.close(); 
    BufferedInputStream in = new BufferedInputStream(new FileInputStream(tmp)); 
    int first = in.read(); 
    in.skip(GAP_SIZE); 
    int last = in.read(); 
    System.out.println(first); 
    System.out.println(last); 
} 
+2

字節的實際數目跳過不能保證。你必須檢查它。似乎它不想跳過本地文件系統塊大小。 – Perception

回答

2

InputStream API表示由於各種原因,skip方法可能會跳過一些較小的字節數。試試這個

... 
long n = in.skip(GAP_SIZE); 
System.out.println(n); 
... 

它打印8191,而不是預期的8192這是對的BufferedInputStream實現細節,如果你刪除它(它在這個具體的例子並不improove性能反正),你會得到預期的結果相關

... 
InputStream in = new FileInputStream(tmp); 
... 

輸出

1 
2 
+0

我很困惑......如果原因是FileInputStream中的skip方法,爲什麼移除BufferedInputStream解決了這個問題? – marcolopes

+0

實際的原因是BufferedInputStream的實現細節,FileInputStream是好的 –

+0

好吧,你是對的,但我仍然感到困惑,因爲FileInputStream Skip說:「跳過方法可能由於各種原因最終跳過一些較小字節數「。 – marcolopes

1

由於Perception說,你需要檢查退回skip。如果我添加一個檢查並補償它解決了這個問題:

long skipped = in.skip(GAP_SIZE); 
System.out.println("GAP: " + GAP_SIZE + " skipped: " + skipped) ; 
if(skipped < GAP_SIZE) 
{ 
    skipped = in.skip(GAP_SIZE-skipped); 
} 

正如skip節所述的FileInputStream

跳躍方法,可由於種種原因,最終跳過一些較小的字節數,可能爲0

相關問題