Struts DiskFile.getInputStream() возвращает ByteArrayInputStream и FileArrayInputStream при изменении размера файла

Я пытался проанализировать недавно обнаруженную проблему в моем приложении и понял, что мой inputStream.reset() метод не удается, потому что я пытался оперировать FileInputStream,

Похоже, мой вызов метода для Apache's DiskFile.getInputStram() возвращается ByteArrayInputStream экземпляр (пометка поддерживается) или FileInputStream (отметка НЕ ​​поддерживается) экземпляр на основе определенного порога размера файла.

Код, который я должен получить, это:

FormFile file = multipartForm.getFiles().get(0); // It's always one file
InputStream is = file.getInputStream();

// Read the stream and did job
// Now I want to reset it.
// bad coding from my side because I didn't check markSupported

is.reset();

// Got IO error immediately after this. But anything below 256KB is ok

Я уверен, что это упомянуто / объяснено где-то в документации Oracle JDK или на сайте apache. но не могу вспомнить какие-либо ссылки. Кто-нибудь знает, имеет ли это поведение смысл?

1 ответ

Я не знаком с API Struts, но мне кажется, что когда возвращаемый тип InputStream а не определенный подкласс, тогда у вас нет никаких гарантий относительно фактического типа возвращаемого потока.

С звонка reset() действует только при наличии предыдущего mark(readlimit) вызов, лечение неуточненного InputStream тип в общем-то прост:

InputStream inputStream = …
int readlimit = …

if(!inputStream.markSupported()) {
    inputStream = new BufferedInputStream(inputStream, readlimit);
}

inputStream.mark(readlimit);
// read some date, not more than readlimit
inputStream.reset();
Другие вопросы по тегам