Понекропостчу.
Вместо ловли еоф-эксепшона и цикла фор(;;) можно сравнить position и length стрима в качестве условия while.
А по вопросу - вы там ловите один единственный конкретный эксепшон (ну или стопку конкретных эксепшонов) и только в нём закрываете ридер, при этом вызывая кучу всяких readInt32 и создавая попутно кучу других объектов реализация которых может так же хромать и возможно кидать эксепшоны.
По хорошему обернуть надо в 2 юзинга, как советовали выше. Если очень хочется ловить эксепшоны - ридер закрывать надо в finally, как тоже советовали выше, а чтобы все таки с проблемой разобраться начните с ловли и логирования остальных эксепшонов, а не только проблем с правами и кривыми путями.