Java.io.File.length()返回0

时间:2011-08-05 20:58:44

标签: java file

我正在为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

由于

6 个答案:

答案 0 :(得分:9)

变量“outputStream”的存在表明,此时,您可能已经打开了要写入的文件,并且在此过程中,您已将其截断。尝试在实际打开文件之前计算大小?

答案 1 :(得分:2)

此抽象路径名表示的文件的长度(以字节为单位),如果文件不存在,则为0L某些操作系统可能会返回0L表示系统相关实体(如设备或管道)的路径名。

答案 2 :(得分:1)

在那段代码中没有理由我可以看到为什么它应该返回0如果它不是空的,你在那个文件的其他地方做什么吗?

如果您在其他地方打开文件,或者在刷新编写器(可能是Java或其他地方)之前写入文件并调用长度,那么它可能会返回0.如果您关闭并清除所有文件在检查其长度之前编写该文件,您可能会得到不同的结果。

答案 3 :(得分:1)

您可能根本没有足够的权限来访问该文件......

  1. 尝试签名您的小程序。 (即使是自签名证书也可以。)
  2. 开发时,您可以修改Java安全策略以允许访问本地文件:请参阅%JRE_HOME%/lib/security/java.policy,尝试添加

    permission java.io.FilePermission "<<ALL FILES>>", "read,write";

  3. 尝试使用新的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;
    }