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();