Java.io.File.length () возвращает 0 - PullRequest
10 голосов
/ 06 августа 2011

Я делаю апплет для передачи файлов 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

Спасибо

Ответы [ 5 ]

9 голосов
/ 06 августа 2011

Наличие переменной "outputStream" предполагает, что на данный момент, возможно, вы уже открыли файл для записи и в процессе его обрезали. Попробуйте вычислить размер до фактического открытия файла?

2 голосов
/ 17 апреля 2015

Длина в байтах файла, обозначенного этим абстрактным путем, или 0L, если файл не существует. Некоторые операционные системы могут возвращать 0L для путей, обозначающих зависящие от системы объекты, такие как устройства или каналы.

1 голос
/ 06 августа 2011

У вас, вероятно, недостаточно прав для доступа к файлу ...

  1. Попробуйте подписать свой апплет. (Даже самоподписанный сертификат подойдет.)
  2. Во время разработки вы можете изменить политику безопасности Java, чтобы разрешить доступ к локальным файлам: см. %JRE_HOME%/lib/security/java.policy, попробуйте добавить

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

  3. Попробуйте использовать новый API JNLP для доступа к локальным файлам (только в Java5 ...)

1 голос
/ 06 августа 2011

В этом коде нет причины, по которой я могу понять, почему он должен возвращать 0, если он не пустой, вы делаете что-нибудь еще с этим файлом?

Если файл открыт где-то еще, илипишет в него и вызывает длину до того, как вы очистили записывающее устройство (это может быть на Java или в другом месте), тогда он может вернуть 0. Если вы закроете и сбросите все записывающие устройства в этот файл перед проверкой его длины, и у вас может быть другой результат.

0 голосов
/ 27 февраля 2016

Вы должны использовать:

Файл файл = новый файл (uri.getPath ());

вместо

Файл файл = новый файл (uri.toString ());

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...