File.length () возвращает 0 - PullRequest
       54

File.length () возвращает 0

2 голосов
/ 18 июня 2019

Я пытаюсь получить длину (в байтах) некоторых файлов. Проблема в том, что я получаю ноль для их длины, в то время как они не имеют нулевой длины (я проверил!)

Более того, любой метод файла, который я использую для этих файлов, работает просто отлично. так что это просто проблема с длиной.

почему это происходит?

спасибо.

    //add all files names in the directory into array
    String[] files = new File(sourcedir).list();
    filesNamesList.addAll(Arrays.asList(files));
    filesNamesList.removeIf(name -> ((new File(sourcedir + PATH_BACK_SLASH + name))
            .isDirectory()));

    for (String f:files){
        File e =  new File(f);
        System.out.println((e).length());

    }
}

Ответы [ 4 ]

0 голосов
/ 18 июня 2019

Используемый метод list() выводит список файлов имен , а не их абсолютных путей .

Итак, ваш код перечисляет все имена файлов в sourcedir (не их полные пути), а затем ищет те же имена файлов в текущем каталоге, из которого вы запускаете программу. Вот почему length() возвращает 0 для всех этих файлов ( согласно документам , он возвращает 0, если файл не существует.)

Если вместо этого вам нужен список всех абсолютных путей , то вы можете сделать это кратко, используя потоки, например:

List<String> files = Arrays.stream(new File("C:\\users\\michael\\desktop").listFiles())
        .map(f -> f.getAbsolutePath())
        .collect(Collectors.toList());

Однако, если все эти файлы будут когда-либо только из одного каталога, используйте new File(sourcedir, name) в цикле for (это лучшая альтернатива, чем new File(sourcedir + PATH_BACK_SLASH + name), который вы используете в другом месте.)

0 голосов
/ 18 июня 2019

Возможно, ваши пути к файлам неверны.

Java File.length () Javadoc утверждает, что length() может вернуть 0L, если файл не найден.

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

Поэтому, если вы уверены, что в ваших файлах есть содержимое, то, скорее всего, вы не найдете их правильно. Дважды проверьте пути к файлам и попробуйте снова.

Кроме того, javadoc рекомендует использовать Files.readAttributes () , если вам нужна более подробная информация об ошибках; Я повторяю их мнение здесь.

0 голосов
/ 18 июня 2019

Стоит проверить абсолютный путь к файлу, используя File.getAbsolutePath () , чтобы убедиться, что функция задана с правильным путем к файлу или нет.

0 голосов
/ 18 июня 2019

Проблема в том, что в этих файлах нет содержимого.Таким образом, вы получаете 0 в качестве вывода

...