Вы, вероятно, найдете ProgressMonitorInputStream самым простым, но если этого недостаточно, посмотрите на его исходный код, чтобы получить именно то, что вы хотите.
InputStream in = new BufferedInputStream(
new ProgressMonitorInputStream(
parentComponent,
"Reading " + fileName,
new FileInputStream(fileName)
)
);
Чтобы использовать другой метод передачи, замените соответствующий поток для FileInputStream.