我尝试将InputStream复制到File,并且如果InputStream的大小大于1MB,则中止复制。在Java7中,我的代码如下:
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()
来耍花招只有在下载整个流时才能起作用,而这正是你试图避免的。 - user207421