gpt4 book ai didi

java - 我是否在 Java 中正确关闭了输入流?

转载 作者:行者123 更新时间:2023-12-01 16:47:54 24 4
gpt4 key购买 nike

我创建了一个扩展 InputStream 的类,以便我可以记录正在读取的字节数,并在超过我定义的最大限制时抛出异常。

这是我的类(class):

    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.");
}
}
}

这来自:Copy InputStream, abort operation if size exceeds limit ,我正在实现一个 Jersey API,如果用户上传的文件太大,该 API 就会失败。

这是我的资源类:

    @POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Path("/test")
public Response load(
@Context HttpServletRequest request,
@FormDataParam(FILE_FIELD) FormDataBodyPart file)
{
if (request.getContentLength() > MAX_FILE_SIZE_IN_BYTES)
{
// fail fast handle failure
}

try (InputStream stream = new LimitedSizeInputStream(
file.getValueAs(InputStream.class), MAX_FILE_SIZE_IN_BYTES))
{
// some logic
}
catch (IOException e)
{
// handle failure
}
}

我将 LimitedSizeInputStream 包装在我的 try 资源中,因此我认为该流应该正确关闭。我只是有点困惑是否正确处理了关闭,或者技术上我是否通过 LimitedSizeInputStream 和 file.getValueAs(InputStream.class) 打开两个输入流,而只有一个正在关闭?

最佳答案

try-with-resources 仅关闭声明的资源。所以只会关闭metadataStream

您应该在 LimitedSizeInputStream 中实现 close 方法来关闭原始流。

@Override
public void close() throws IOException {
original.close();
}

关于java - 我是否在 Java 中正确关闭了输入流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61742561/

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