当前位置: 首页 > 面试题库 >

复制InputStream,如果大小超出限制,则中止操作

任昊阳
2023-03-14
问题内容

我试图将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的大小。所以我将InputStream复制到ByteArrayOutputStream然后获取size()。但是问题是InputStream可能没有markSupported(),因此InputStream无法在复制文件操作中重用。

撇开上面的说法不是问题…

如果您已将字节复制到ByteArrayOutputStream,则可以ByteArrayInputStream从返回的字节数组中创建一个baos.toByteArray()。因此,您无需标记/重置原始流。

但是,这是实现此方法的非常难看的方法。尤其重要,因为无论如何您都在读取和缓冲 整个 输入流。



 类似资料:
  • 我正在开发一个Java程序,该程序将从Sybase数据库获取数据,并使用UCanAccess将其导入Microsoft Access数据库。但是,我目前遇到了一个问题,收到了错误“java.lang.OutOfMemoryError:超出了GC开销限制”。 为了将这种情况放到上下文中,我正在尝试将大约130万条记录导入Access数据库。在导入了大约800000条记录之后,在运行时大约十分钟,以及

  • 问题内容: 我有两个文件,它们合并在一起的长度小于600字节(.6kb),如下所示。 那么我的app.bundle.js太大了(987kb),又如何管理它的大小又如何呢? src文件index.js src文件print.js webpack.config.js package.json 警告信息: 资产大小限制警告:以下资产超过了建议的大小限制(244 KiB)。这可能会影响网络性能。资产:ap

  • 问题内容: 我有时编写Python程序,这些程序很难确定执行前将使用多少内存。因此,有时我会调用一个Python程序,该程序试图分配大量RAM,从而导致内核大量交换并降低其他正在运行的进程的性能。 因此,我希望限制Python堆可以增长多少内存。达到限制后,程序可能会崩溃。最好的方法是什么? 如果重要的话,很多代码都用Cython编写,因此应该考虑在那里分配的内存。我还没有嫁给一个纯粹的Pytho

  • 问题内容: 我需要将数据(varbinary(max))从一个表迁移到另一个表。执行更新以执行此操作时,出现以下错误 这是我用来从表DocumentPublication复制到DocumentVersion的更新 有无演员 通过逐行执行更新,我隔离了给出错误的行。奇怪的是,该字段中的数据仅为3950字节,而其他具有更少或更多(例如2000字节或20MB)的行则可以正常工作。 然后,我用另一个名称重

  • 问题内容: 我试图通过这样将数据从一个活动传递到另一个活动: 这是包含用户数据的列表,包括Base64编码的照片,此列表中字符串大小的总和约为500Kb 打电话到黑屏挂了几分钟,然后出现ANR错误。完全不调用子活动。 如果我不向mUsers中添加大字符串(没有Base64编码的照片),则可以正常工作。 请帮忙。 问题答案: 如果两种活动都是您的,请使用体面的数据模型。Android不鼓励设计精良的

  • 我试图在我的博客上使用AMP,将图像转换为AMP图像会导致图像脱离div并破坏整个显示。 未激活AMP时,图像如下所示: 当放大器被激活时,它们看起来是这样的 我只是执行了一个preg_replace,用amp-img替换img标签。 如果没有AMP,图像会停留在父DIV内,但如果激活AMP,则图像会完全脱离DIV。如果我尝试将父DIV设置为宽度的10%以查看发生了什么,我会看到父DIV占据了宽度