Java 在输入流之前获取文件大小
我想为FTP下载创建一个进度条。我下载文件的服务器隐藏了它的所有目录和文件。我想显示下载的进度。有什么办法可以得到文件大小吗?这是我目前的代码: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)
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(…)
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-那你就有问题了。