Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在输入流之前获取文件大小_Java_Android_Ftp_Download_Progress Bar - Fatal编程技术网

Java 在输入流之前获取文件大小

Java 在输入流之前获取文件大小,java,android,ftp,download,progress-bar,Java,Android,Ftp,Download,Progress Bar,我想为FTP下载创建一个进度条。我下载文件的服务器隐藏了它的所有目录和文件。我想显示下载的进度。有什么办法可以得到文件大小吗?这是我目前的代码: FTPclient = new FTPClient(); FTPclient.setListHiddenFiles(true); FTPclient.connect(hostPart); FTPclient.login(userName, passWord)

我想为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协议不提供获取文件大小的方法,因此您需要求助于请求目录列表并取消获取的(特定于服务器的)文本。此外,不能保证将启用目录列表,或者您将有权列出目录

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

编辑

@Kevin Brock提到FTP大小命令是一种可能性

  • 这是2007年RFC3659中首次定义的命令。许多已部署的FTP服务器软件比这要旧得多
  • 大小是一个可选命令;i、 e.即使是符合RFC 3659的服务器也不需要支持它
  • 即使服务器支持大小,当前的ApacheFTPClientAPI也不包括获取文件大小的方法(除了通过
    listFiles
    )。当然,这在未来可能会改变
  • ftp4j类显然实现了大小,并通过其
    fileSize(…)
    方法使其可用

我也没有找到一个简单的命令来执行此操作。我的解决方案是调用skip命令,该命令将返回跳过的字节数。求和,直到skip返回0。有一种可能是skip返回0的原因不是文件结尾,但在字段中它似乎工作得很好

下面是一些示例代码:

InputStream checkStream = m_ftpClient.retrieveFileStream(name);

long fileLength = 0;
long transferredLength = 0;
do
{
    transferredLength = checkStream.skip(MAX_BYTES);
    fileLength += transferredLength;
}while(transferredLength > 0);

您的代码假定每次读取将是2048字节。这是不能保证的,除非您保证您的文件是2048字节的倍数,否则最终读取几乎肯定不会是这样。我建议使用
bytesDownloaded+=l
。FTP协议确实有“SIZE”命令(),该命令应该提供此功能。你是说这不是普遍实现的,还是说Java客户端不允许你访问它?什么时候我必须将文件路径传递给listFiles?我想所有的文件都被隐藏了。@Aymon-那你就有问题了。