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

标签 java jersey inputstream dropwizard

我创建了一个扩展 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/

相关文章:

c++ - 为什么只有当我在 Windows 控制台程序中按 Ctrl+Z 时,输入有时才会终止?

Java:每n秒计算来自InputStreamReader的连续打印数字的总和?

java - 关闭 Swing 模式弹出窗口

java - 注释值不是允许的类型 rrror : illegal initializer for int

java - cacerts - JDK 或 JRE

rest - 如何在 spring boot 中使用 "web request by spring mvc"和 "rest by jersey"

java - 在jsp中操作列表元素符号

java - 如何在每个端点调用上验证 token ,但使用在 Tomcat 上运行的 javax.ws.rs 除外?

java - 如何使用 Jersey Client 将 HTTP 400 响应解析为 Java 类?

Java非阻塞读取