Страницы

Поиск по вопросам

понедельник, 2 декабря 2019 г.

Конструктор класса File не создает файл на диске

#java #файлы


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

File f = new File("E://test.txt");       в интернете много, но почему-то у меня на
JDK 8 оно не работает.

public class Main {
public static void main(String[] args) throws IOException{
    File f = new File ("E://Workspace//create4.txt");

    System.out.println("File name : "+ f.getName());
    System.out.println("Parent: " + f.getParent());
    System.out.println(f.exists() ? "exists" : "does not exist");
    }
}


В итоге, вот, что получается:

File name : create4.txt
Parent: E:\Workspace
does not exist


Файла - нет. Знаю, что если набрать в try  f.createNewFile();  то все будет ок, но
раз приводят примеры без него, то значит должно работать.
    


Ответы

Ответ 1



Конструктор класса java.io.File создаёт объект, представляющий файл на диске. Но конструктор не создаёт этот файл, а предоставляет некоторый интерфейс, который затем позволяет что-либо сделать. Например, проверить существует ли файл. Проще говоря, объект класса File после создания представляет собой только имя файла, независимо от его физического существования на диске. Как верно замечено в вопросе, чтобы создать файл нужно вызвать метод createNewFile. Или же передавать объект типа File каким-либо функциям для дальнейшей работы. Но ещё раз повторю, что конструктор сам никаких новых файлов на диске не создаёт.

Ответ 2



На мой взгляд, это недостаток наименования класса как File, поскольку по сути этот класс является абстрактным представлением пути к файлу или директории (из документации): An abstract representation of file and directory pathnames. Также добавлю цитату из книги "Thinking in Java" (4 издание, Bruce Eckel, в переводе): Название класса File обманчиво. Кажется, что он представляет файл, но на самом деле это не так. На самом деле, более правильным названием было бы FilePath — путь к файлу. Он представляет собой реально либо имя конкретного файла, либо имя группы файлов в каталоге. Если это группа файлов, вы можете получить их все, используя метод list( ), который возвращает массив строк. Возврат именно массива, а не одного из более удобных классов-контейнеров, имеет свой смысл: количество элементов фиксировано, а если вам нужен другой список файлов, вы просто создаёте другой объект типа File Если посмотреть исходный код конструктора, то он очень прост: public File(String pathname) { if (pathname == null) { throw new NullPointerException(); } this.path = fs.normalize(pathname); this.prefixLength = fs.prefixLength(this.path); } Как видим, никакого файла на диске не создается.

Комментариев нет:

Отправить комментарий