gpt4 book ai didi

android - 跟踪复制文件的进度

转载 作者:太空宇宙 更新时间:2023-11-03 13:25:22 25 4
gpt4 key购买 nike

我正在尝试跟踪压缩进度。 ATM 我是这样做的:

public static void compressGzipTest(final OutputStream os, final File source) throws CompressorException,
IOException
{
final CountingInputStream cis = new CountingInputStream(new FileInputStream(source));
final GzipCompressorOutputStream gzipOut = (GzipCompressorOutputStream) new CompressorStreamFactory()
.createCompressorOutputStream(CompressorStreamFactory.GZIP,os);

new Thread() {
public void run()
{
try
{
long fileSize = source.length();

while (fileSize > cis.getBytesRead())
{
Thread.sleep(1000);
System.out.println(cis.getBytesRead() / (fileSize / 100.0));
}
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
}.start();

IOUtils.copy(cis,gzipOut);
}

这工作正常,但我需要线程,它提供有关进度的反馈,而不是在此方法中实现,而是在调用它时(以便在 Android 设备上创建类似进度条的东西)。所以这更像是一个架构问题。关于如何解决这个问题的任何想法?

最佳答案

我同时通过添加一个接口(interface)作为参数来覆盖 IOUtils.copy() 来解决它:

public static long copy(final InputStream input, final OutputStream output, int buffersize,
ProgressListener listener) throws IOException
{
final byte[] buffer = new byte[buffersize];
int n = 0;
long count = 0;
while (-1 != (n = input.read(buffer)))
{
output.write(buffer,0,n);
count += n;
listener.onProgress(n);
}
return count;
}

然后被这样的东西调用

copy(input, output, 4096, new ProgressListener() {

long totalCounter = 0;

DecimalFormat f = new DecimalFormat("#0.00");

@Override
public void onProgress(long bytesRead)
{
totalCounter += bytesRead;
System.out.println(f.format(totalCounter / (fileSize / 100.0)));
}
});

我现在面临的唯一挑战是限制控制台上的输出,不是针对每个字节[4096],而是针对每两兆字节。我试过这样的事情:

while (-1 != (n = input.read(buffer)))
{
output.write(buffer,0,n);
count += n;
while(n % 2097152 == 0)
{
listener.onProgress(n);
}
}
return count;

但这根本没有给我任何输出

关于android - 跟踪复制文件的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21239223/

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