我正在为ftp文件传输做一个applet,我需要知道本地文件的大小(下载简历)。问题是File.length()返回0。
该文件存在(使用File.exists()检查),并且具有超过0个字节(至少在Windows中)。
我不知道还有什么可以找出为什么length()返回0。
以下是代码和结果的一部分。
long fileOffset = 0;
if(localfile.exists()){
fileOffset = localfile.length();
System.out.println("The file " + localfile.getAbsolutePath() + " has " + localfile.length() +" in size");
System.out.println("Resume at: " + fileOffset);
outputStream.skip(fileOffset);
ftp.setRestartOffset(fileOffset);
count = fileOffset;
}
控制台中的结果是:
The file D:\test\About Downloads.pdf has 0 in size
Resume at: 0
由于
答案 0 :(得分:9)
变量“outputStream”的存在表明,此时,您可能已经打开了要写入的文件,并且在此过程中,您已将其截断。尝试在实际打开文件之前计算大小?
答案 1 :(得分:2)
此抽象路径名表示的文件的长度(以字节为单位),如果文件不存在,则为0L
。 某些操作系统可能会返回0L
表示系统相关实体(如设备或管道)的路径名。
答案 2 :(得分:1)
在那段代码中没有理由我可以看到为什么它应该返回0如果它不是空的,你在那个文件的其他地方做什么吗?
如果您在其他地方打开文件,或者在刷新编写器(可能是Java或其他地方)之前写入文件并调用长度,那么它可能会返回0.如果您关闭并清除所有文件在检查其长度之前编写该文件,您可能会得到不同的结果。
答案 3 :(得分:1)
您可能根本没有足够的权限来访问该文件......
开发时,您可以修改Java安全策略以允许访问本地文件:请参阅%JRE_HOME%/lib/security/java.policy
,尝试添加
permission java.io.FilePermission "<<ALL FILES>>", "read,write";
尝试使用新的JNLP API访问本地文件(仅限Java5 ...)
答案 4 :(得分:0)
你应该使用:
文件文件=新文件(uri.getPath());
而不是
文件文件=新文件(uri.toString());
答案 5 :(得分:0)
有时即使准确地返回文件大小也存在OS问题。如果文件失败,我采用了使用File和NIO的两种方法
long discoveredFileLength = discoveredFile.length();
if (discoveredFileLength == 0) {
final Path discoveredFilePath = Paths.get(discoveredFile.getAbsolutePath());
FileChannel discoveredFileChannel = null;
try {
discoveredFileChannel = FileChannel.open(discoveredFilePath);
discoveredFileLength = discoveredFileChannel.size();
}
catch (IOException e2) {
}
}
if (discoveredFileLength <= 0) {
logErrors(discoveredFile.getName() + " " + discoveredFileLength + " COULD NOT BE PROCESSED (length <= 0)");
_reporter.increaseFilesFailed();
return;
}