java - 在 InputStream 之前获取 FileSize

标签 java android ftp download progress-bar

我想为 FTP 下载创建一个进度条。我下载文件的服务器隐藏了所有目录和文件。我想显示下载进度。有什么办法可以获得文件大小吗?这是我当前的代码:

   FTPclient = new FTPClient();
               FTPclient.setListHiddenFiles(true);
               FTPclient.connect(hostPart);
               FTPclient.login(userName, passWord);
               FTPclient.setFileType(FTP.BINARY_FILE_TYPE);

                InputStream instream = FTPclient.retrieveFileStream(pathExcludingHostIncludingFirstSlash);


            int l;
            byte[] tmp = new byte[2048];
            int updateCounter = 0;
            int bytesDownloaded = 0;
            while ((l = instream.read(tmp)) != -1) {
                fos.write(tmp, 0, l);
                bytesDownloaded+=2048;
                updateCounter++;
                if(updateCounter==3){
                    kilobytesDownloaded=(bytesDownloaded / 1024);
                    publishProgress((String[])null);
                    updateCounter=0;
                }

最佳答案

无法在所有 FTP 服务中可靠地执行此操作。

FTP 协议(protocol)不提供获取文件大小的方法,因此您需要求助于请求目录列表并取消选择您返回的(特定于服务器的)文本。此外,不保证会启用目录列表,或者您将有权列出目录。

话虽如此,一些 FTP 库可以配置为尝试获取文件大小。例如,通过 Apache FTPClient 库,您可以(尝试)使用 listFiles(String)方法并查看结果 FTPFile对象。

编辑

@Kevin Brock 提到了 FTP SIZE 命令的可能性。

  • 此命令于 2007 年在 RFC 3659 中首次定义。许多已部署的 FTP 服务器软件比这要早得多。
  • SIZE 是可选命令;即,即使符合 RFC 3659 标准的服务器也不需要支持它。
  • 即使服务器支持 SIZE,当前的 Apache FTPClient API 也不包含获取文件大小的方法(除了通过 listFiles)。当然,这在未来可能会改变。
  • ftp4j FTPClient类显然确实实现了 SIZE 并通过其 fileSize(...) 方法使其可用。

关于java - 在 InputStream 之前获取 FileSize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3463934/

相关文章:

使用 SLF4J+Logback 的 OSGi 应用程序上的 java.lang.LinkageError

Android Studio 找不到 Activity

java - 是否存在通过 JavaScript 通过 Java 进行 FTP 上传的方式?

java - Netbeans:如何自动将独立 Java 应用程序的 JAR 文件传输到远程位置

java - 如何使用 commons-net 创建可靠的 FTP 连接

java - 无法解析与前缀 'diffgr' 关联的命名空间。在 Castor 中

java - 通过 Google App Engine servlet 上传 ZIP,并将内容保存到 Cloud Storage (Java)

java - 在 Java 中导入 Final 类

java - 如何在 Android 上查询 ContentProvider 的值不为 null?

android - 获取 "No results"消息自定义适配器 ListView Android