Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/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.io.File.length()返回0_Java_File - Fatal编程技术网

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

Java.io.File.length()返回0,java,file,Java,File,我正在做一个ftp文件传输的小程序,我需要知道本地文件的大小(下载简历)。问题是File.length()返回0 该文件存在(使用file.exists()进行检查),并且超过0个字节(至少在Windows中) 我不知道在哪里可以找到更详细的信息,以了解length()返回0的原因 下面是部分代码和结果 long fileOffset = 0; if(localfile.exists()){ fileOffset = localfile.length(); System.out

我正在做一个ftp文件传输的小程序,我需要知道本地文件的大小(下载简历)。问题是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

谢谢

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

在该代码中,我看不出为什么它应该返回0(如果它不是空的),您是否在其他地方使用该文件


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

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

  • 尝试对小程序进行签名。(即使是自签名证书也可以。)
  • 在开发时,您可以修改Java安全策略以允许访问本地文件:请参阅
    %JRE\u HOME%/lib/security/Java.policy
    ,尝试添加

    permission java.io.FilePermission“”“读、写”

  • 尝试使用新的JNLPAPI访问本地文件(尽管只有Java5…)


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

    您应该使用:

    File File=新文件(uri.getPath())

    而不是


    File File=新文件(uri.toString())

    有时操作系统在准确返回文件大小方面会出现问题,即使文件非常稳定。我采用了双重方法,在文件失败时使用File和NIO

    if(discoveredFileLength==0){
    最终路径discoveredFilePath=Path.get(discoveredFile.getAbsolutePath());
    FileChannel discoveredFileChannel=null;
    试一试{
    discoveredFileChannel=FileChannel.open(discoveredFilePath);
    discoveredFileLength=discoveredFileChannel.size();
    }
    捕获(IOE2异常){
    }
    }
    
    if(discoveredFileLength)如果您将文件重命名为不带空格的文件会怎么样?人们只是因为这个原因否决了我!否决的不是我,但我看不出文件名中的空格会如何改变结果?如果文件因为权限而无法访问,那么它会抛出SecurityException:如果是这种情况,那么()方法首先会失败。这就是问题所在,因为我是从上载类重写这个类的,所以我仍然使用它来初始化流:BufferedOutputStream fileStream=new BufferedOutputStream(new FileOutputStream(localfile.getAbsoluteFile());我已经更改了它,现在正在使用RandomAccessFile。谢谢帮助!:)
         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;
        }