gpt4 book ai didi

java - 复制 InputStream,如果大小超过限制则中止操作

转载 作者:太空狗 更新时间:2023-10-29 22:44:18 26 4
gpt4 key购买 nike

我尝试将 InputStream 复制到文件,如果 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 包装器,它在读取字节时计算字节数:

public class LimitedSizeInputStream extends InputStream {

private final InputStream original;
private final long maxSize;
private long total;

public LimitedSizeInputStream(InputStream original, long maxSize) {
this.original = original;
this.maxSize = maxSize;
}

@Override
public int read() throws IOException {
int i = original.read();
if (i>=0) incrementCounter(1);
return i;
}

@Override
public int read(byte b[]) throws IOException {
return read(b, 0, b.length);
}

@Override
public int read(byte b[], int off, int len) throws IOException {
int i = original.read(b, off, len);
if (i>=0) incrementCounter(i);
return i;
}

private void incrementCounter(int size) throws IOException {
total += size;
if (total>maxSize) throw new IOException("InputStream exceeded maximum size in bytes.");
}

}

我喜欢这种方法,因为它是透明的,可以对所有输入流重复使用,并且可以很好地与其他库配合使用。例如使用 Apache Commons 复制最大 4KB 的文件:

InputStream in = new LimitedSizeInputStream(new FileInputStream("from.txt"), 4096);
OutputStream out = new FileOutputStream("to.txt");
IOUtils.copy(in, out);

PS:上面的实现与BoundedInputStream的主要区别是 BoundedInputStream 在超过限制时不会抛出异常(它只是关闭流)

关于java - 复制 InputStream,如果大小超过限制则中止操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15445504/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com