Шаг 87.
Язык программирования Java.
Класс File. Продолжение

На этом шаге мы рассмотрим функции для работы с атрибутами объектов, а также создание и удаление объектов

В таблице 1 и в таблице 2 приведены основные функции для создания, удаления папок и файлов, а также функции для получения их атрибутов.

Таблица 1. Функции для получения и изменения атрибутов файлов или директорий
Функция Описание
boolean canExecute() Проверяет является ли файл исполняемым.
boolean canRead() Проверяет есть ли доступ на чтение у файла.
boolean canWrite() Проверяет есть ли доступ на запись у файла.
boolean isHidden() Проверяет является ли файл скрытым.
long lastModified() Возвращает количество миллисекунд между датой 1 января 1970 и датой последнего изменения файла.
void setExecutable(boolean executable) Устанавливает будет ли являться файл исполняемым.
void setLastModified(long time) Устанавливает время последнего изменения файла. Время указывается в миллисекундах.
void setReadable(boolean readable) Устанавливает права на «чтение».
void setWriteable(boolean writable) Устанавливает права на «запись».
void setReadOnly() Устанавливает права на «только чтение».

Таблица 2. Функции для создания и удаления папок и файлов
Функция Описание
boolean mkdir() Создание папки, путь которой указывается в конструкторе класса File. Возвращает true если директория была создана, иначе возвращает false.
boolean mkdirs() Создание папки, путь которой указывается в конструкторе класса File. Возвращает true если директория была создана, иначе возвращает false. Отличие ее от функции mkdir() в том, что она создает все необходимые папки, которых нет в заданном пути, в то время как функция mkdir() создает только последнюю папку.
boolean delete() Удаление файла или пустой директории. Возвращает true в случае успеха, и false в противном случае.
boolean renameTo(File dest) Переименование файла, на название, указанное в параметре dest. Возвращает true в случае успеха, и false в противном случае.
boolean createNewFile() Создание пустого файла. Возвращает true в случае успеха, и false в противном случае.
boolean createTempFile(String prefix, String suffix) Создание временного пустого файла. Имя файла будет начинаться с строки prefix и заканчиваться строкой suffix. Возвращает true в случае успеха, и false в противном случае.
boolean createTempFile(String prefix, String suffix, File directory) Создание временного пустого файла в указанной директории. Имя файла будет начинаться с строки prefix и заканчиваться строкой suffix. Возвращает true в случае успеха, и false в противном случае.


Ниже приведем пример использования перечисленных выше функций. Напишем программу которая по заданному имени папки выводит информацию о папках и файлах, находящихся в ней.


import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * Программа для демонстрации использования функций из таблицы 1
 * */
public class Main {
    /*Имя корневой папки*/
    private static String rootName;
    /*Объект корневой папки*/
    private static File root;

    /**
     * Функция для проверки аргументов переданных программе в командной строке.
     * @param args аргументы командной строки
     * @return true, если была передана корневая папка, и false в противном случае
     * */
    private static boolean checkArgs(String[] args) {
        /*Провераяем, что мы передали путь к папке*/
        if (args.length == 0) {
            System.out.println("Введите путь к папке");
            return false;
        }

        rootName = args[0];
        root = new File(rootName);
        /*Проверяем, что ме передали путь к существующей папке*/
        if (!root.exists()) {
            System.out.println("Данной папки не существует");
            return false;
        }

        return true;
    }

    /**
     * Функция для вывода разделителя строк в таблице (см вывод программы)
     * */
    private static void printSeparator() {
        String forType = "------------------";
        String forIsRead = "--------";
        String forIsWrite = "--------";
        String forSize = "-------------------";
        String forLastModified = "---------------------";
        String forName = "----------------";

        String template = "+%s+%s+%s+%s+%s+%s+";
        String line = String.format(template, forType, forIsRead, forIsWrite, forSize, 
                                                            forLastModified, forName);

        System.out.println(line);
    }

    /**
     * Функция для вывода шапки таблицы (см вывод программы)
     * */
    private static void printTitle() {
        printSeparator();
        String type = "Тип (Файл/Папка)";
        String isRead = "Чтение";
        String isWrite = "Запись";
        String size = "Размер (в байтах)";
        String lastModified = "Последнее изменение";
        String name = "   Название   ";

        String template = "| %s | %s | %s | %s | %s | %s |";
        String title = String.format(template, type, isRead, isWrite, size, 
                                                                 lastModified, name);
        System.out.println(title);
        printSeparator();
    }

    /**
     * Функция для вывода типа объекта
     * @param object рассматриваемый объект класса File
     * */
    private static void isDirectory(File object) {
        if (object.isDirectory()) {
            System.out.print("|    Директория    |");
        } else {
            System.out.print("|       Файл       |");
        }
    }

    /**
     * Функция для вывода атрибута чтения рассматриваемого объекта
     * @param object рассматриваемый объект класса File
     * */
    private static void canRead(File object) {
        if (object.canRead()) {
            System.out.print("   Да   |");
        } else {
            System.out.print("   Нет  |");
        }
    }

    /**
     * Функция для вывода атрибута запись рассматриваемого объекта
     * @param object рассматриваемый объект класса File
     * */
    private static void canWrite(File object) {
        if (object.canWrite()) {
            System.out.print("   Да   |");
        } else {
            System.out.print("   Нет  |");
        }
    }

    /**
     * Вспомогательная функция для вывода заданного числа пробелов.
     * Нужная для форматирования значения в ячейке.
     * @param count количество пробелов
     * */
    private static void printSpaces(int count) {
        for (int i = 0; i < count; i++) {
            System.out.print(" ");
        }
    }

    /**
     * Функция для вывода размера рассматриваемого объекта
     * @param object рассматриваемый объект класса File
     * */
    private static void printSize(File object) {
        int sizeTitleLength = "Размер (в байтах)".length();
        int sizeLength = String.valueOf(object.length()).length();

        printSpaces(sizeTitleLength - sizeLength + 1);
        System.out.print(object.length() + " |");
    }

    /**
     * Функция для получения даты последней модификации рассматриваемого объекта.
     * Формат даты следующий: число.месяц.год часы:минуты:секунды
     * @param time число миллисекунд прошедших с 1 января 1970 года
     * @return строка - дата последней модификации рассматриваемого объекта
     * */
    private static String getDateLastModified(long time) {
        String template = "%d.%d.%d %d:%d:%d";
        Date date = new Date(time);

        int day = date.getDate();
        int month = date.getMonth() + 1;
        int year = date.getYear() + 1900;

        int hours = date.getHours();
        int minutes = date.getMinutes();
        int seconds = date.getSeconds();

      String ans = String.format(template, day, month, year, hours, minutes, seconds);
        return ans;
    }

    /**
     * Функция для вывода последней модификации рассматриваемого объекта
     * @param object рассматриваемый объект класса File
     * */
    private static void printLastModified(File object) {
        int lastModifiedTitleLength = "Последнее изменение".length();

        String lastModified = getDateLastModified(object.lastModified());
        int lastModifiedLength = lastModified.length();

        printSpaces(lastModifiedTitleLength - lastModifiedLength + 1);
        System.out.print(lastModified + " |");
    }

    /**
     * Функция для вывода имени рассматриваемого объекта
     * @param object рассматриваемый объект класса File
     * */
    private static void printNameObject(File object) {
        int nameTitleLength = "   Название   ".length();
        int nameLength = String.valueOf(object.getName()).length();

        printSpaces(nameTitleLength - nameLength + 1);
        System.out.println(object.getName() + " |");
    }

    /**
     * Функция для вывода полной информации о рассматриваемом объекте
     * @param object рассматриваемый объект класса File
     * */
    private static void printInfoObject(File object) {
        isDirectory(object);
        canRead(object);
        canWrite(object);
        printSize(object);
        printLastModified(object);
        printNameObject(object);
        printSeparator();
    }

    /**
     * Функция для вывода информации о всей директории.
     * В функции сначала формуруется список директорий и список файлов.
     * Потом выводится информация о директориях, а после них - информации о файлах.
     * */
    private static void printInfoDirectory() {
        List<File> directories = new ArrayList<>();
        List<File> files = new ArrayList<>();

        for (File object : root.listFiles()) {
            if (object.isDirectory()) {
                directories.add(object);
            } else {
                files.add(object);
            }
        }

        for (File object : directories) {
            printInfoObject(object);
        }

        for (File object : files) {
            printInfoObject(object);
        }
    }

    public static void main(String[] args) {
        /*Проверим, что мы передали нужные аргументы*/
        if (checkArgs(args)) {
            /*Если все хорошо, то выведем информацию в таблице*/
            printTitle();
            printInfoDirectory();
        }
    }
}

Проект можно взять здесь


Рис.1 Вывод программы.


На следующем шаге мы рассмотрим интерфейсы AutoCloseable, Closeable и Flushable

Предыдущий шаг Содержание Следующий шаг