2013-06-01 4 views
2

Почему LAST Byte read = 0, если размер файла> 8k?Поведение 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

API InputStream API говорит, что метод пропусков может по разным причинам пропускать меньшее количество байтов. Попробуйте

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

печатает 8191 вместо ожидаемых 8192. Это связано с BufferedInputStream детали реализации, если вы удалите его (не improove производительность в данном конкретном случае, в любом случае), вы получите ожидаемый результат

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

выход

1 
2 
+0

Я в замешательстве ... если причиной является метод пропуска в FileInputStream, почему удаление BufferedInputStream решает проблему? – marcolopes

+0

Фактическая причина в деталях реализации BufferedInputStream, FileInputStream в порядке –

+0

хорошо, вы правы, но я все еще запутался, поскольку FileInputStream Skip говорит: «Метод пропуска может по разным причинам заканчиваться пропусканием некоторых меньших количество байтов ". – marcolopes

1

Как было воспринято, вам необходимо проверить возврат 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