Как связаны имя java файла и классы которые в этом файле объявляются

Обновлено: 05.07.2024

  • Это абстрактное представление имен файлов и каталогов.
  • Имя пути, будь то абстрактное или в виде строки, может быть абсолютным или относительным. Родитель абстрактного пути может быть получен путем вызова метода getParent () этого класса.
  • Прежде всего, мы должны создать объект класса File, передав ему имя файла или имя каталога. Файловая система может реализовывать ограничения для определенных операций с фактическим объектом файловой системы, таких как чтение, запись и выполнение. Эти ограничения известны как разрешения на доступ.
  • Экземпляры класса File являются неизменяемыми; то есть после создания абстрактный путь, представленный объектом File, никогда не изменится.

Как создать объект File?
Объект File создается путем передачи строки, представляющей имя файла, или строки или другого объекта File. Например,

определяет абстрактное имя файла для гиков в каталоге / usr / local / bin. Это абсолютное абстрактное имя файла.

Конструкторы

  • Файл (File parent, String child): Создает новый экземпляр File из родительского абстрактного пути и строки дочернего пути.
  • File (String pathname): Создает новый экземпляр File путем преобразования заданной строки имени пути в абстрактный путь.
  • Файл (String parent, String child): Создает новый экземпляр File из строки родительского пути и строки дочернего пути.
  • Файл (URI uri): Создает новый экземпляр File путем преобразования указанного файла: URI в абстрактный путь.
  1. boolean canExecute (): проверяет, может ли приложение выполнить файл, обозначенный этим абстрактным путем.
  2. boolean canRead () : проверяет, может ли приложение прочитать файл, обозначенный этим абстрактным путем.
  3. boolean canWrite (): Проверяет, может ли приложение изменить файл, обозначенный этим абстрактным путем.
  4. int compareTo (File pathname): сравнивает два абстрактных пути лексикографически.
  5. boolean createNewFile (): атомно создает новый, пустой файл с именем этого абстрактного пути.
  6. статический файл createTempFile (префикс String, суффикс String): создает пустой файл в каталоге временных файлов по умолчанию.
  7. boolean delete (): Удаляет файл или каталог, обозначенный этим абстрактным путем.
  8. boolean equals (Object obj): проверяет это абстрактное имя пути на равенство с данным объектом.
  9. boolean exist () : Проверяет, существует ли файл или каталог, обозначенный этим абстрактным путем.
  10. String getAbsolutePath (): Возвращает строку абсолютного пути этого абстрактного пути.
  11. long getFreeSpace (): возвращает количество нераспределенных байтов в разделе.
  12. String getName (): возвращает имя файла или каталога, обозначенного этим абстрактным путем.
  13. String getParent (): Возвращает строку пути родителя этого абстрактного пути.
  14. Файл getParentFile (): возвращает абстрактный путь родителя этого абстрактного пути.
  15. String getPath (): преобразует этот абстрактный путь в строку пути.
  16. boolean isDirectory (): проверяет, является ли файл, обозначенный этим путем, каталогом.
  17. boolean isFile (): Проверяет, является ли файл, обозначенный этим абстрактным путем, нормальным файлом.
  18. boolean isHidden (): Проверяет, является ли файл, названный этим абстрактным путем, скрытым файлом.
  19. long length (): возвращает длину файла, обозначенного этим абстрактным путем.
  20. String [] list (): возвращает массив строк с именами файлов и каталогов в каталоге.
  21. File [] listFiles (): возвращает массив абстрактных путей, обозначающих файлы в каталоге.
  22. boolean mkdir (): создает каталог с этим абстрактным путем.
  23. boolean renameTo (File dest): переименовывает файл, обозначенный этим абстрактным путем.
  24. boolean setExecutable (логический исполняемый файл): удобный метод для установки разрешения владельца на выполнение.
  25. boolean setReadable (boolean readable): удобный метод для установки разрешения владельца на чтение.
  26. boolean setReadable (boolean readable, boolean ownerOnly): Устанавливает разрешение на чтение владельцем или всеми.
  27. boolean setReadOnly (): помечает имя файла или каталога так, что разрешены только операции чтения.
  28. boolean setWritable (логическая запись) : удобный метод для установки разрешения на запись владельца.
  29. Строка toString (): возвращает строку пути этого абстрактного пути.
  30. URI toURI (): Создает URI файла, который представляет это абстрактное имя пути.

Реализация

Программа 1: Программа для проверки, существует ли файл или каталог физически или нет.

// В этой программе мы принимаем имя файла или каталога из
// аргументы командной строки. Затем программа проверит,
// этот файл или каталог физически существуют или нет и
// отображает свойство этого файла или каталога.


// Отображение свойства файла

public static void main(String[] args)

// принимаем имя файла или имя каталога через аргументы командной строки

String fname =args[ 0 ];

// передаем имя файла или имя каталога в объект File

File f = new File(fname);

// применяем методы класса File к объекту File

System.out.println( "File name :" +f.getName());

System.out.println( "Path: " +f.getPath());

System.out.println( "Absolute path:" +f.getAbsolutePath());

System.out.println( "Parent:" +f.getParent());

System.out.println( "Exists :" +f.exists());

System.out.println( "Is writeable:" +f.canWrite());

System.out.println( "Is readable" +f.canRead());

System.out.println( "Is a directory:" +f.isDirectory());

System.out.println( "File Size in bytes " +f.length());

Программа 2: Программа для отображения всего содержимого каталога

Здесь мы примем имя каталога с клавиатуры, а затем отобразим все содержимое каталога. Для этого метод list () можно использовать как:

В предыдущем выражении метод list () вызывает все записи каталога, скопированные в массив arr [] . Затем передайте эти элементы массива arr [i] объекту File и протестируйте их, чтобы узнать, представляют ли они файл или каталог.


// Отображение содержимого каталога

public static void main(String[] args) throws IOException

// вводим путь и имя с клавиатуры

BufferedReader br = new BufferedReader( new InputStreamReader(System.in));

System.out.println( "Enter dirpath:" );

System.out.println( "Enter the dirname" );

// создаем объект File с dirpath и dname

File f = new File(dirpath, dname);

// если каталог существует, то

// получить содержимое в arr []

// теперь arr [i] представляет файл или каталог

// найти нет. записей в каталоге

for ( int i = 0 ; i < n ; i++)

// создаем объект File с записью и тестом

// если это файл или каталог

File f1= new File(arr[i]);

System.out.println( ": is a file" );

System.out.println( ": is a directory" );

System.out.println( "No of entries in this directory " +n);

System.out.println( "Directory not found" );

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


В стандартных Java-программах очень много классов. Сколько? Тысячи, десятки тысяч. А если еще посчитать, что программа использует различные библиотеки, которые содержат классы, написанные другими программистами, то количество классов легко может исчисляться миллионами!

Для всех этих миллионов, да и просто тысяч классов невозможно придумать уникальные имена.

Нет, ну конечно можно придумать имена типа А123 , Б345 , но если мы говорим о выборе для каждого класса хорошего имени, которое облегчает понимание этого класса (как String для строк, например), то даже тысяча уникальных имен — это большой труд.

Поэтому в Java все классы сгруппированы по пакетам.

Классы и их пакеты в Java по своей сути очень напоминают файлы и папки на компьютере.

Например, если вам нужно хранить на компьютере 10 документов, вы скорее всего просто будете хранить их в одной папке. А если документов тысячи (например, хранилище всех документов компании)?

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

Фактически в Java это все и было сделано для классов.

Файлы с классами хранятся в разных директориях (папках), и полное название папки класса со всеми подпапками называется пакетом класса. Пример:

Путь к файлу Имя пакета Имя класса

Имя пакета, в отличие от имени папки, пишется через точку. Т.е. если папка была \com\javarush\tasks\ , ей будет соответствовать пакет com.javarush.tasks .

2. Папка src

В Java принято все классы одной программы хранить в одной папке (и ее подпапках). Такую папку обычно называют src (сокращение от source ).

Такая папка называется корнем проекта ( source root ), и все пути для пакетов считаются от нее. Примеры:

Папки Имя пакета

Программисты в такой ситуации скажут что-то типа «у нас есть проект по имени my , который расположен в папке c:\projects\data » или «у нас есть проект по имени project , который расположен в папке d:\files\git\data »

Лучше всегда класть классы в пакеты, а не в корень папки src . Когда классов мало, это ещё не проблема, но когда классов много, очень легко запутаться. Поэтому всегда создавайте классы только в пакетах.

В Java принято давать классам и пакетам осмысленные имена. Многие компании выпускают свои библиотеки (набор классов) и, чтобы не было путаницы, называют пакеты этих классов по имени компании/сайта/проекта:

Имя пакета Имя компании/проекта
Проект «Apache»
Компания «Oracle»
Компания Oracle, проект Java
Компания «IBM», проект WebSphere
Проект «Jboss»

3. Содержимое файла

Согласно стандарту языка Java, внутри файла с кодом должна быть записана информация об имени класса и имя его пакета. Схема стандарта приведена ниже:

Имя пакета должно совпадать с именем папки, а имя файла — с именем публичного класса.

Если у вас есть файл . \src\ com\project \ Service .java , значит у него внутри должно быть записано:

4. Импорт классов

Имя класса + имя пакета формируют так называемое полное уникальное имя класса .

Полное уникальное имя Имя пакета Имя класса
отсутствует

Хорошая новость:

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

Плохая новость:

Полные имена классов обычно либо длинные, либо очень длинные. А ведь каждый раз писать в коде длинное имя, например java.util.ArrayList, очень неудобно.

Поэтому в Java добавили возможность «импортировать классы».

Вы можете использовать в своем коде короткое имя класса , но сначала вам нужно будет объяснить компилятору, какое именно «полное уникальное имя класса» соответствует короткому имени . Вдруг у вас в проекте несколько классов с таким именем. Или сначала был один, а потом еще 15 добавилось.

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

Добавлять такое объявление нужно в самом начале класса, сразу после объявления package .

Благодаря тому, что мы импортировали два класса java.util.Scanner и com.test.helper.special.ArrayList , мы можем использовать их короткие имена в нашем коде. И компилятор будет знать, какие именно классы использовать.

А вот как бы выглядел этот же код, если бы мы не использовали import :

Кстати, если у вас в проекте есть два класса с именем Scanner , импортировать их оба в один файл с кодом не получится: для второго постоянно придется использовать длинное имя .

Допустим, у вас в коллективе есть Серега, и никаких проблем с общением, не возникает — все знают кто это. Но если бы их было трое, чтобы их различать, пришлось бы использовать полные уникальные имена.

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

Таким образом, вы сможете использовать в вашем коде короткие имена всех классов из данного пакета.

Компиляция в Java - 1

Программирование в IDE — прекрасно: связанность зависимостей кода, удобный дебаг, понятное тестирование, темная тема. Так вот, благодаря IDE разработка развивается семимильными шагами. Но она расслабляет. С каждым днем, погружаясь в функционал IDE, разработчик привыкает к коммиту одной кнопкой или сборке двумя кликами. Гораздо хуже обстоит ситуация с новичками в программировании, которые с самого начала работают в IDE, игнорируя работу в командной строке. Например, в Intellij IDEA компиляция Java приложения демонстрируется загрузочным баром в нижней панели, а все параметры компиляции, обработка classpath и прочих прелестей Java-жизни остается за кадром. Предлагаем поговорить о компиляции в Java без IDE. Для запуска примеров в статье следует убедиться, что на вашей машине установлена JDK 1.7 и старше.

Как скомпилировать программу?

  1. Есть исходный код в файле с именем НазваниеКласса.java;
  2. Если в коде нет ошибок, он компилируется в байт-код (в файл НазваниеКласса.class);
  3. Программа запускается.

Для чего нужна команда javac

Компиляция в Java - 2

Окей, первый пункт выполнен. Идем дальше, чтобы понять: скомпилировать — это как? :) В этом нам поможет команда javac, в аргументе которой необходимо указать нужный файл: Если нет ошибок в коде, рядом с файлом Test.java появится файл Test.class. Это и есть скомпилированный байт-код. Теперь его нужно запустить. Здесь используется команда java, запускающая байт-код: На скриншоте видно, что в выводе получаем какие-то иероглифы: очевидно, это сбитая кодировка. Как правило это происходит в системе Windows. Для корректного отображения кириллицы в консоли, есть следующие команды: Они меняют текущую кодовую страницу командной консоли на время работы текущего окна. Попробуем еще раз: Это говорит приложение из командной строки. Знать принцип работы команды javac очень полезно, так как эта команда лежит в основе любой системы сборки проектов.

Компиляция и выполнение нескольких классов

Для работы с несколькими классами нужен classpath. Он похож на файловую систему, в которой содержатся классы, а функцию папок выполняют пакеты (packages). На этом этапе стоит задуматься об отделении файлов исходного кода от скомпилированных файлов. Как правило исходники находятся в каталоге src, а скомпилированные классы — в bin. Например, у нас есть класс Box и класс BoxMachine , в котором содержится метод main . Класс Box : Он находится в пакете src, это необходимо зафиксировать. Класс BoxMachine : Этот класс также находится в пакете src. В методе main он создает пять объектов класса Box разного размера и выводит в консоль информацию о них. Чтобы скомпилировать эту группу классов, необходимо из главного каталога (в котором лежат папки src и bin) использовать команду javac с аргументами: -d — флаг, после которого следует указать расположение, куда попадут скомпилированные классы. Это очень удобно, так как перекладывать, например, 1000 классов — очень трудоемкий процесс. bin — название папки. ./src/* — расположение исходных файлов. * указывает, что необходимо скомпилировать все файлы. Теперь скомпилированные классы появились в папке bin. Для их запуска используется команда java из той же директории, также с аргументами: -classpath — флаг, после которого следует указать местоположение скомпилированных классов. Java будет искать главный класс и все сопутствующие именно в этой директории. ./bin — название папки, в которой находятся скомпилированные классы. BoxMachine — название главного класса. Как и в первом случае, не следует указывать .class , так как это название класса, а не файла. Вывод:

Создание JAR-файлов

Чтобы программу было легко переносить и запускать, можно собрать скомпилированные классы в jar-файл — архив классов. Главное отличие от zip или rar-архивов — наличие файла манифеста. В этом манифесте указывается главный класс, который будет запускаться при выполнении jar-файла, classpath, а также много дополнительной информации. В главном каталоге создадим файл manifest.mf. Его содержимое будет следующим: main-class указывает класс, который содержит метод main и будет выполнен при запуске. class-path — путь к скомпилированным классам или дополнительным библиотекам. Настало время собрать настоящую программу без IDE с помощью команды jar: -cmf — флаг, после которого следует указать путь к файлу манифеста. manifest.mf — путь к манифесту. box-machine.jar — название выходного jar-файла. -С — флаг, после которого указывается путь к скомпилированным классам. . — путь, куда будет помещен jar-файл. В нашем случае —это главный каталог. Теперь можно запустить. Запуск jar-файлов выполняется также с помощью команды java, но следом нужно указать флаг -jar : он говорит о том, что запускается Jar-файл, а второй аргумент — путь к jar -файлу, включая расширение: Вывод:

Компиляция в Java без IDE: обзор систем сборок

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

Как скомпилировать Java?

Самые известные системы сборки на Java — это Ant, Maven и Gradle. Среди нет плохой или хорошей: каждая из них создана для решения определенных задач. Рассмотрим каждую из них подробнее.

  • mkdir — создание директорий
  • delete — удаление файлов и директорий
  • javac — компиляция Java–кода
  • java — запуск скомпилированного кода

Maven

Компиляция в Java - 3

Maven предлагает несколько другой подход к сборке проектов. Здесь разработчик скорее описывает свой проект и дополнительные инструменты, которые использует, в отличие от Ant, где сборка — это последовательность действий. Maven популярен среди разработчиков благодаря простому управлению зависимостями и удобной интеграции со всеми средами разработки. При работе с Maven придерживаются такой структуры проекта: Правила сборки, зависимости и прочее описывается в файле pom.xml. Как правило он находится в главной папке проекта. При запуске Maven проверяет структуру и синтаксис файла, предупреждая об ошибках. В главной директории рядом с папками bin и src создаем файл pom.xml, внутрь добавляем: Далее в командной строке выполняем команду mvn: Теперь в папке bin есть папка src, в которой находятся скомпилированные классы. В pom.xml в теге build определена цель сборки — компиляция, директории файлов исходного кода и результата компиляции, а также имя проекта. У Maven есть множество целей сборки и плагинов для запуска тестирования, создания Jar-файлов, сборки дистрибутивов и других задач.

Gradle

Это самая молодая система сборки, которая основывается на Ant и Maven. Главное отличие — работа на базе ациклического графа для определения порядка выполнения задач. Это очень полезно при более сложных задачах, например, инкрементальных и многопроектных сборках. При сборке с помощью Gradle также рекомендуется придерживаться структуры папок проекта Maven. Кстати, файл для сборки в Gradle он называется build.gradle и выглядит гораздо меньше, чем у Maven. Пример для наших классов: В файле происходит подключение плагинов, определение директории файлов исходного кода (если не используется структура проектов Maven), директория результатов сборки, имя главного класса, а также задачи по умолчанию. За запуск сборки отвечает команда gradle в директории, где лежит файл build.gradle:

Заключение

Компиляция в Java - 4

На первый взгляд, умение компиляции и сборки кода без IDE кажется бесполезным. Действительно, зачем мучиться с командными строками и гуглить все команды, когда есть уютная IDEшечка с плагинами, автопроверкой всего что можно (современные IDE разве что уровень IQ не проверяют) и интеграцией с популярными системами. Однако практика показывает, что умение собирать код без среды разработки и понимание каждого шага этого процесса — суровая необходимость. Этот навык сэкономит немало нервных клеток и времени вам и вашей компании. Освоить работу в IDE, попрактиковаться в написании кода и, конечно же, получить фундаментальные основы по программированию на Java вы можете здесь — на JavaRush. Пора вернуться к обучению :)

// Компиляция этой Java-программы
// результат в нескольких файлах классов.

public static void main(String[] args)

System.out.println( "Class File Structure" );

Для компиляции:

После компиляции в соответствующей папке будет 3 файла классов с именем:

  • Sample.class
  • Student.class
  • Test.class

Структура файла одного класса содержит атрибуты, которые описывают файл класса.
Представление структуры файла класса

Элементы файла класса следующие:

    magic_number: первые 4 байта файла класса называются magic_number. Это предопределенное значение, которое JVM использует для определения того, создан ли файл .class допустимым компилятором или нет. Предопределенное значение будет в шестнадцатеричной форме, то есть 0xCAFEBABE .
    Теперь давайте посмотрим, что произойдет, когда JVM не найдет действительное магическое число. Предположим, у нас есть файл .java с именем Sample.java, как показано ниже, и следуйте пошаговому процессу в вашей системе.

Шаг 1. Компиляция с использованием javac Sample.java.
Шаг 2: Теперь откройте файл Sample.class. Это будет выглядеть следующим образом.



Шаг 3: Теперь удалите хотя бы один символ из этого файла Sample.class в начале файла и сохраните его.
Шаг 4: Теперь попробуйте запустить эту команду с помощью Java Sample и увидеть волшебство т.е. вы получите во время выполнения исключения (см выделенного текста ниже изображения):

Примечание: это может варьироваться в зависимости от того, насколько вы удаляете данные файла .class .

Примечание . Файл .class, созданный компилятором более низкой версии, может быть выполнен JVM высокой версии, но файл .class, созданный компилятором более высокой версии, не может быть выполнен JVM более низкой версии. Если мы попытаемся выполнить, мы получим исключение во время выполнения.

Эта демонстрация для ОС Windows выглядит следующим образом:

Шаг 2: Теперь проверьте другую версию, которая может быть выше или ниже, чем уже установленная. эта ссылка для скачивания.
И установите это на свой ПК или ноутбук и запишите адрес установки.
Шаг 3: Откройте второе окно командной строки и задайте путь к папке bin установленного jdk, установленного во время второго шага. И проверьте версию компилятора Java и версию JVM.

Шаг 4: Теперь в первой командной строке скомпилируйте любой действительный файл .java . Например: см. Выше файл Sample.java . Скомпилируйте это как:

Шаг 5: Теперь на втором окне командной строки попробуйте запустить выше скомпилированный файл класса кода и посмотреть , что произойдет. Есть исключение во время выполнения, которое я выделил на рисунке ниже.


Примечание: Внутренняя версия jdk 1.5 означает 49.0, а 1.6 означает 50.0, а 1.7 означает 51.0 и т. Д. Версия файла класса, где цифры перед десятичной точкой представляют major_version, а цифры после десятичной точки представляют minor_version.

Читайте также: