На счёт инициализации буфера, врядли можно на глаз определить по времени, 4Кб должно лихо выделятся на нормальной тачке как мне кадежется... А вот если размер буфера маловат, то тут да, на файлике 5 Мб можно на глаз это всё прочувствовать. А вообще странно что для этих целей используется Java I/O, когда начиная с 1.4 есть такой пакет как NIO. Я уверен что как раз в этом случае выигрыш будет значительнее. На счёт ThreadLocal тоже всё неоднозначно, хотя в самом простом варианте конечно прокатит и однозначно рекомендован. Для серьёзного приложения, где акцент идёт на многопоточность и рациональное использование ресурсов памяти, надо писать имплементацию Poolа. И к тому же в идеале размер буффера надо динамически менять, исходя из размера файла.
Для Сотоны