Но мой вопрос здесь заключается в том, что метод save может генерировать IOException, и я хотел бы отловить это и повторно выдать его как часть этого метода getInputStream.
Вы можете 'сделать это, потому что исключение может быть вызвано в фоновом потоке, выполняющем save()
через много времени после возврата getInputStream()
.
Если save()
может вызвать исключение по какой-то причине, отличной от IOException
, из егоPipedOutputStream
, и вы хотите передать некоторую информацию об этой ошибке потоку, который читает из PipedInputStream
, отправка Callable
в ExecutorService
, вероятно, является правильным подходом.Примером этого случая может быть то, что save()
запрашивает базу данных и записывает результаты в поток;Если запрос не выполнен, вы хотите записать SQLException
в потоке, который читает этот поток. Поток чтения может прочитать PipedInputStream
, а затем проверить Future
, полученный при отправке задачи.на ExecutorService
, чтобы увидеть, завершилось ли оно ненормально.
Но если вам не нужна информация из исключения, выданного save()
, и вы просто хотите выбросить исключение в поток, читающий из соответствующегоPipedInputStream
, просто дайте фоновому потоку умереть.Это вызовет «сломанную трубу» IOException
в главном потоке, когда он попытается прочитать из PipedInputStream
.