Copiar InputStream, interromper a operação se o tamanho exceder o limite
Eu tentei copiar um InputStream para um arquivo e abortar a cópia se o tamanho de InputStream for maior que 1 MB. Em Java7, escrevi o código como abaixo:
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();
}
}}
Primeira pergunta: existe alguma solução melhor para isso?Segunda pergunta: minha outra solução - Antes da operação de cópia, eu calculo o tamanho deste InputStream. Então eu copio o InputStream paraByteArrayOutputStream
então peguesize()
. Mas o problema é que o InputStream pode nãomarkSupported()
, portanto, o InputStream não pode ser reutilizado em uma operação de arquivo de cópia.