Как я могу получить размер файла или каталога с помощью нового NIO в java 7?
Получить размер файла/каталога с помощью Java 7 new IO
Ответ 1
Используйте Files.size(Path)
, чтобы получить размер файла.
Для размера каталога (что означает размер всех файлов, содержащихся в нем), по-прежнему вам необходимо перезаписать вручную, насколько мне известно.
Ответ 2
MutableLong size = new MutableLong();
Files.walkFileTree(directoryPath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
size.add(attrs.size());
}
}
Это вычислит размер всех файлов в каталоге. Однако обратите внимание, что все файлы в каталоге должны быть обычными файлами, так как API задает метод размера BasicFileAttributes:
"Размер файлов, которые не являются обычными файлами, специфичен для реализации и поэтому не указан".
Если вы спотыкаетесь на нерегулируемый файл, вам придется либо не включать его, либо возвращать неизвестный размер. Вы можете проверить правильность файла с помощью
BasicFileAttributes.isRegularFile()
Ответ 3
Вот пример, готовый к запуску, который также будет содержать каталоги пропусков и журналов, которые он не может ввести. Он использует java.util.concurrent.atomic.AtomicLong
для накопления состояния.
public static void main(String[] args) throws IOException {
Path path = Paths.get("c:/");
long size = getSize(path);
System.out.println("size=" + size);
}
static long getSize(Path startPath) throws IOException {
final AtomicLong size = new AtomicLong(0);
Files.walkFileTree(startPath, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file,
BasicFileAttributes attrs) throws IOException {
size.addAndGet(attrs.size());
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc)
throws IOException {
// Skip folders that can't be traversed
System.out.println("skipped: " + file + "e=" + exc);
return FileVisitResult.CONTINUE;
}
});
return size.get();
}