使用进度回调将文件或InputStream上载到S3

使用进度回调将文件或InputStream上载到S3,第1张

使用进度回调将文件或InputStream上载到S3

我遇到了这个确切的问题,并编写了一个简单的InputStream包装器,该包装器输出了不错的进度条:

import java.io.IOException;import java.io.InputStream;import org.apache.commons.vfs.FileContent;import org.apache.commons.vfs.FileSystemException;public class ProgressInputStream extends InputStream {    private final long size;    private long progress, lastUpdate = 0;    private final InputStream inputStream;    private final String name;    private boolean closed = false;    public ProgressInputStream(String name, InputStream inputStream, long size) {        this.size = size;        this.inputStream = inputStream;        this.name = name;    }    public ProgressInputStream(String name, FileContent content)    throws FileSystemException {        this.size = content.getSize();        this.name = name;        this.inputStream = content.getInputStream();    }    @Override    public void close() throws IOException {        super.close();        if (closed) throw new IOException("already closed");        closed = true;    }    @Override    public int read() throws IOException {        int count = inputStream.read();        if (count > 0) progress += count;        lastUpdate = maybeUpdateDisplay(name, progress, lastUpdate, size);        return count;    }    @Override    public int read(byte[] b, int off, int len) throws IOException {        int count = inputStream.read(b, off, len);        if (count > 0) progress += count;        lastUpdate = maybeUpdateDisplay(name, progress, lastUpdate, size);        return count;    }    static long maybeUpdateDisplay(String name, long progress, long lastUpdate, long size) {        if (Config.isInUnitTests()) return lastUpdate;        if (size < B_IN_MB/10) return lastUpdate;        if (progress - lastUpdate > 1024 * 10) { lastUpdate = progress; int hashes = (int) (((double)progress / (double)size) * 40); if (hashes > 40) hashes = 40; String bar = StringUtils.repeat("#",         hashes); bar = StringUtils.rightPad(bar, 40); System.out.format("%s [%s] %.2fMB/%.2fMBr",         name, bar, progress / B_IN_MB, size / B_IN_MB); System.out.flush();        }        return lastUpdate;    }}

(这是从实时代码中复制粘贴的,因此您可能必须做一些修补才能使其在您自己的代码中起作用。)

然后,只需使用InputStream放置内容的方式(确保指定大小!),它将为您提供一个不错的进度条。如果您想要适当的回调,那也很容易做到。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5132715.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存