Я попытался скопировать InputStream в файл и прервать копию, если размер InputStream превышает 1 МБ. В Java7, я написал код, как показано ниже:Копировать InputStream, прервать операцию, если размер превышает предел
public void copy(InputStream input, Path target) {
OutputStream out = Files.newOutputStream(target,
StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE);
boolean isExceed = false;
try {
long nread = 0L;
byte[] buf = new byte[BUFFER_SIZE];
int n;
while ((n = input.read(buf)) > 0) {
out.write(buf, 0, n);
nread += n;
if (nread > 1024 * 1024) {// Exceed 1 MB
isExceed = true;
break;
}
}
} catch (IOException ex) {
throw ex;
} finally {
out.close();
if (isExceed) {// Abort the copy
Files.deleteIfExists(target);
throw new IllegalArgumentException();
}
}}
- Первый вопрос: есть ли лучшее решение для этого?
- Второй вопрос: другое решение - перед операцией копирования я вычисляю размер этого InputStream. Поэтому я копирую InputStream на
ByteArrayOutputStream
, затем получаюsize()
. Но проблема заключается в том, что InputStream может неmarkSupported()
, поэтому InputStream не может быть повторно использован в операции копирования файлов.
Я бы сделал тест перед записью, а не после него. Вы не можете вычислить размер 'InputStream'. Это может быть бесконечно. Понятие не имеет смысла. Воспроизведение трюков с помощью 'mark()' и 'reset()' может работать только при загрузке всего потока, чего именно вы пытаетесь избежать. – EJP