使用 copyInputStreamToFile 在控制台上下载 Java ApacheIO 文件进度

标签 java apache file url download

我正在寻找一种使用方法

copyInputStreamToFile(InputStream source, File destination)

按文件大小在控制台中制作一个小进度条。有办法做到这一点吗?

最佳答案

简短的回答你不能,看看这个方法的源代码,我试图跟踪它的执行路径,它转到了 IOUtils 类中的这个方法:

 public static long copyLarge(final InputStream input, final OutputStream output, final byte[] buffer)
                throws IOException {
            long count = 0;
            int n = 0;
            while (EOF != (n = input.read(buffer))) {
                output.write(buffer, 0, n);
                count += n;
            }
            return count;
        }

所以,这个功能是 encapsulated通过 API。

长答案你可以自己实现下载方法,通过使用IOUtilsFileUtils库的相关部分,并添加在控制台中打印下载文件百分比的功能:

这是一个有效的启动示例:

package apache.utils.custom;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
public class Downloader {

    private static final int EOF = -1;
    private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;


    public static void copyInputStreamToFileNew(final InputStream source, final File destination, int fileSize) throws IOException {
        try {

            final FileOutputStream output = FileUtils.openOutputStream(destination);
            try {

                final byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
                long count = 0;
                int n = 0;
                while (EOF != (n = source.read(buffer))) {
                    output.write(buffer, 0, n);
                    count += n;
                    System.out.println("Completed " + count * 100/fileSize + "%");
                }

                output.close(); // don't swallow close Exception if copy completes normally
            } finally {
                IOUtils.closeQuietly(output);
            }

        } finally {
            IOUtils.closeQuietly(source);
        }
}

您应该向此方法提供预期的文件大小,您可以使用以下代码计算该大小:

        URL url = new URL(urlString);
        URLConnection urlConnection = url.openConnection();
        urlConnection.connect();
        int file_size = urlConnection.getContentLength();

当然,更好的想法是将整个功能封装在一个方法中。

希望对您有帮助。

关于使用 copyInputStreamToFile 在控制台上下载 Java ApacheIO 文件进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29864788/

相关文章:

java - 参数化 Java 类以获取任意多个接口(interface)

java - Android usb主机与定制板的串行通信

java - 与 Libgdx 的圆形和多边形碰撞

java - 程序类型已存在 : androidx. recyclerview.widget.AdapterHelper$Callback

php - 在 Windows 上使用可执行文件的可怕之处

httpd phpinfo.php 中的 PHP 版本与命令行版本不匹配

apache - .htaccess:无效命令 'Allow' ,可能拼写错误或由服务器配置中未包含的模块定义

c - 如何从文件中读取未知数量的 float ?

android - 单击文件时 android 的自定义文件类型关联

php - .xlsx 文件可以简化到什么程度