Главная » Java » Класс File в Java

0

 

   Класс File (не путать с потоками File— см. раздел 15.6.1) реализует ряд полезных средств, позволяющих манипулировать именами файлов, например разделять имена на компоненты или запрашивать дополнительную информацию о файле с заданным именем.

   Объект File служит для представления имени файла (наличие файла как такового, вообще говоря,  не обязательно).  Например,  чтобы ответить на вопрос существует ли файл с определенным именем, достаточно создать объект File на основе строки, содержащей имя, и вызвать метод exists этого объекта.

   Строка полного имени файла делится на части, соответствующие наименованиям каталогов и собственно файла, посредством экземпляров определенного символа, который хранится в статическом поле separatorChar типа char, a как объект String — в статическом поле separator. (Термин каталог (directory) принят в большинстве операционных систем; в некоторых системах для обозначения той же сущности употребляется и термин папка (folder).)

   Объекты File могут быть созданы с помощью любого из трех конструкторов, описанных ниже.

 

public  File(String path)

               Создает объект File на основе строки,path, содержащей полное имя файла.

 public File(String dirName,   String name)

Создает объект File, представляющий файл с именем name, который размещен в каталоге dirName. Если параметр dirName равен null, рассматривается только параметр name. Если di rName содержит пустую строку, считается, что файл name должен располагаться в каталоге, предусматриваемом по умолчанию значениями настроек операционной системы. Во всех других случаях конструктор аналогичен предыдущему при условии File(dirName + File.separator + name).

public File(File fileDir,   String name)

Создает объект File, представляющий файл с именем name; файл размещен в каталоге, наименование которого определяется объектом f i I eDi Г типа File. Конструктор аналогичен предыдущему при условии File(fileDi r.getPath() ,   name).

   Существует пять методов get, которые позволяют получить информацию о компонентах полного имени файла или альтернативные варианты его представления. Следующий фрагмент кода демонстрирует (1) процесс создания объекта File для файла с именем         Filelnfo. Java, размещенного в подкаталоге ok каталога, который является родительским  (". . ") по отношению к текущему, и (2) способы вызова каждого из методов get:

File src = new File(".." + File.separator + "ok",

                                     "Filelnfo.java");

System.out.println("getName() = " + src.getName()) ;

System.out.println("getPath() = " + src.getPath()) ;

System.out.println("getAbsolutePath()  = "

   + src.getAbsolutePathO);

 system.out.println("getCanonicalPath()  = "

   + src.getCanonicalPath());

 system.out.println("getParent()  = " + src.getParent()) ;

 

результат работы программы может выглядеть следующим образом:

 

getName()  = Filelnfo.java

getPath() =  . ./ok/Filelnfo. Java

getAbsolutePath() = /vob/java_prog/src/../ok/Filelnfo.Java

getCanonicalPath()  = /vob/java_prog/ok/Filelnfo.Java

getParent()  =  . ./ok

Структура канонического имени файла (canonical path) определяется особенностями конкретной операционной системы. Обычно оно служит формой представления абсолютного имени файла (absolute path) при условии, что компоненты, задающие те или иные взаимоотношения каталогов (такие как ". . ", указывающие на родительский каталог), преобразованы в "естественный" вид и ссылки на текущий каталог удалены. Метод getCanoni cal Path, в отличие от других get, способен выбрасывать исключение типа IOException, поскольку преобразование компонентов файловых имен требует обращения к функциям операционной системы, а при этом возможны отказы и ошибки.

   Методы getParentFile, getAbsoluteFile и getCanonicalFile являются аналогами методов getParent, getAbsolutePath и getCanoni cal Path, но, в отличие от последних, возвращают не строки, а объекты типа File.

  Переопределенный метод File.equals заслуживает особого внимания. Два объекта File считаются равными не в том случае, если они указывают на один и тот же объект файловой системы, а тогда, когда обладают одинаковыми строками имени файла. Метод File.equals нельзя использовать для проверки того, адресуют ли два объекта File один и тот же файл. Объекты File вправе ссылаться на один файл посредством различных имен, но в такой ситуации объекты не будут трактоваться как равные. С помощью метода сотрагеТо два имени файла могут сопоставляться в лексикографическом порядке: метод возвращает отрицательное, нулевое или положительное числовые значения, если строка текущего имени файла меньше строки, задаваемой аргументом, равна таковой или превосходит ее соответственно. Существуют два перегруженных варианта метода сотрагеТо: в первом предусмотрен аргумент типа File, а второй принимает ссылку на объект класса Object и реализует интерфейс Comparable.

  Информация о конкретном файле может быть получена с помощью ряда методов-запросов, возвращающих значения типа boolean:

 

·         exists; возвращает true, если файл существует в файловой системе;

·         canRead; возвращает true, если файл существует и его содержимое может

        быть считано;

·         canWrite; возвращает true, если файл существует и его содержимое может быть прочитанным

·         isFile; возвращает true, если файл не является каталогом или иным

         специальным объектом файловой системы;

·         isDi rectory; возвращает true, если файл является каталогом;

·         isAbsolute; возвращает true, если файл адресуется с помощью абсолют

  ного имени;

·         isHidden; возвращает true, если файл является скрытым.

 

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

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

 

 public long lastModified()

Возвращает ненулевое значение типа long, представляющее момент времени, когда файл подвергался изменению в последний раз, либо нуль, ecли файл не существует.

 

public long length()

      Возвращает длину файла в байтах либо нуль, если файл не существует.

public boolean  renameTo(File newName)

       Переименовывает файл, возвращая значение true, если результат операции успешен.

public boolean delete()

Удаляет файл или каталог, задаваемый текущим объектом File, и возвращает значение true при успешном завершении операции. Каталог, подлежащий удалению, должен быть пустым.

Рассмотрим методы, позволяющие создать файл или каталог, имя которого

задается текущим объектом File.

public boolean createNewFile()

Создает новый пустой файл с именем, определяемым текущим объектом File. Возвращает значение false, если файл уже существует либо не может быть создан. Проверка факта существования файла и действия по его созданию выполняются атомарным образом по отношению к другим операциям с файловой системой. Метод, в сочетании с другим методом, deleteOnExit, способен послужить в качестве простого и надежного механизма блокировки на основе файлов (cooperative file-locking) (см. ниже).

public boolean mkdir()

Создает каталог с именем, определяемым текущим объектом File, и возвращает значение true при успешном завершении операции.

public boolean mkdirs()

Создает иерархию каталогов, перечисленных в строке полного имени, которо задается текущим объектом File, и возвращает true, если все каталоги был успешно созданы. Значение fal se возвращается тогда,  когда не создан п меньшей мере один каталог.  Другими словами,  некоторые каталоги могу1 быть созданы даже в том случае, если общий результат операции равен false.

 

Впрочем,     для     создания     файлов     обычно     применяются     средства     класс

FileOutputStream, Filewriter или RandomAccessFile, а не объектов типа File-

  

В составе класса Fi I e имеются два метода, позволяющих изменить состояние конкретного файла в предположении, что тот действительно существует.

public boolean setLastModified(long time)

Изменяет значение момента "последнего изменения" файла, возвращая false, если операция не может быть выполнена.

public boolean setReadOnly()

Обозначает файл атрибутом "только для чтения", возвращая false, если операция не может быть выполнена. Файл остается в состоянии, запрещающем внесение изменений, до момента его удаления либо ликвидации атрибута "только для чтения" с помощью каких-либо "внешних" инструментов — методов, позволяющих непосредственно устранить атрибут "только для чтения", не существует.

 

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

public String[]   list()

Создает список файлов, принадлежащих текущему каталогу. Если объект Fi I e описывает нечто, не относящееся к каталогам, возвращается значение null; в противном случае результатом будет массив строк с именами файлов. В список включаются наименования всех файлов, кроме строк "." и ". .", обозначающих текущий и родительский каталоги соответственно.

 

 

public String[]  list(FilenameFilter filter)

Возвращает список файлов, принадлежащих текущему каталогу и удовлетворяющих условию фильтрации, которое определяется объектом filter класса FilenameFilter (см. следующий раздел).

 public static File[]  listRoots()

Возвращает массив объектов Fi I e, описывающих доступные корневые каталоги локальной файловой системы. Для платформ Windows, например, характерно наличие корневого каталога для каждого активного логического дискового устройства; файловые системы платформ UNIX, однако, обладают единственным корневым каталогом, который обозначается символом   ‘ /’ •  Если корневые каталоги не обнаружены, возвращается пустой массив.

 Методы listFiles() и  listFiles(FilenameFilter)   аналогичны методам list() и list(FilenameFilter), но вместо массивов строк возвращают массивы объектов  типа   File.   Метод   listFiles(FileFilter)   аналогичен  методу "list (FilenameFilter).

  В составе класса File также объявлены методы, реализующие функции создания и удаления временных файлов (temporary files); временные файлы могут создаваться в ходе работы программы и использоваться, скажем, для хранения промежуточных результатов, но по завершении процесса вычислений они утрачивают свое значение.

 

Public static File createTempFile(String prefix,   String suffix,

      File directory)  throws IOException

Создает новый пустой файл в заданном каталоге directory; при выборе имени файла учитываются указанные значения префикса (prefix) и расширения имени, или суффикса, (suffix). При успешном завершении метод возвращает сгенерированное имя файла и гарантирует его уникальность на протяжении текущего сеанса работы виртуальной машины (т.е.ни этот метод, ни любой из его вариантов, будучи выполненными в     ч ние одного сеанса работы виртуальной машины, не возвратят того же им ни  временного  файла дважды).  Длина строки   prefix  не  должна быть меньше  трех  символов;   в  противном  случае  выбрасывается  исключени типа illegalArgumentException. Рекомендуется употреблять в качестве префиксов имен временных файлов краткие и выразительные слова или аббревиатуры, такие как, например, "mail" или "abc". Если в качестве значения параметра suffix передается null, будет использовано расширение имени файла ".tmp". Поскольку предопределенных символов, которые выполняли бы функцию разделителя между именем файла и его расширением, не существует, любой требуемый разделитель, такой как  ‘ . ‘ должен быть включен в состав строки суффикса явно. Если значение параметра directory равно null, создаваемый файл будет размещен в каталоге, который по умолчанию предлагается операционной системой для хранения временных файлов (наименование такого каталога задается системным свойством (system property) Java.io.tmpdir).

 

public static File createTempFile(String prefix,   String suffix)

   throws lOException

       Метод аналогичен предыдущему при условии createTempFile(prefix, suffix,   null).

 

public void deleteOnExit( )

Обращается к системе с запросом на удаление файла при завершении сеанса работы виртуальной машины (см. раздел 18.3). Если запрос выдан, он не может быть отозван и будет удовлетворен только при нормальном окончании сеанса.

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

символ точки (.), этот символ и три символа, следующие за ним, будут сохранены. После выполнения необходимых преобразований формируется имя нового файла: к префиксу присоединяется пять или больше символов, генерируемых исполняющей системой, а затем к полученной последовательности добавляется строка суффикса. Временные файлы по завершении работы программы автоматически не удаляются; чтобы достичь noj добного эффекта, следует вызвать метод deleteOnExit объекта File, который возвращается методом createTempFi1е.

   Методы createNewFile и deleteOnExit могут быть использованы для реализации средствами файловой системы простого механизма блокировки, рассмотрим пример:

 

public static void main(string[]  args)

throws DataBaseinaccessibleException,   lOException

{

File lockFile = new File("database.Ick");

 boolean  haveLock = lockFile.createNewFile();

 if  (lhaveLock)

       throw new DataBaselnaccessibleException();

lockFile.deleteOnExit();

  try {

      useDataBase() ;

}  finally {

       lockFile.delete();

   }

}

Программа использует файл в качестве признака блокировки, который препятствует возможности одновременного обращения нескольких приложений к одной и той же базе данных. Каждая программа, работающая с подобной базой данных, должна удовлетворять требованиям единого протокола доступа. Файл блокировки создается только в том случае, если он не существует, — соответствующая проверка и операция создания файла выполняются атомарным образом в теле метода createNewFile. Если файл существует, это свидетельствует о том, что в данный момент к базе данных обращается другое приложение, и текущая программа завершает работу, выбрасывая исключение типа DataBaselnaccessibleException. После создания файл помечается признаком удаления при завершении (deleteOnExit) — при нормальном окончании сеанса работы виртуальной машины файл блокировки будет гарантированно удален. Впрочем, нелишней окажется и инструкция принудительного удаления файла, когда манипуляции с базой данных (useDataBase) завершены, — это просто свидетельство хорошего тона. Обратите внимание, что признаком удаления следует помечать только тот файл, который создали мы сами, — если применить признак по отношению к уже существующему файлу, это будет означать, что по завершении работы нашей программы удалению подвергнется файл блокировки, установленной другим приложением. Кроме того, следует гарантировать, что никакая иная часть программы не вызовет остановку виртуальной машины до момента задания признака удаления файла. Помеченный файл будет удален только при нормальном завершении сеанса работы виртуальной машины. Если же сеанс прекращается аварийным образом (скажем, из-за возникновения асинхронного исключения), ресурс, разделяемый несколькими приложениями (в нашем примере — база данных), может оказаться в неустойчивом или несообразном состоянии, и возможность доступа к нему со стороны других программ автоматически обеспечена не будет.

  В заключение следует упомянуть, что символ, используемый для разделения компонентов пути поиска файлов (file search path), представляется полями File. pathSeparatorChar (типа char) и File. pathSeparator (типа String). В UNIX имена файлов и каталогов в пути поиска разделяются символом двоеточия (:)— как, например, в строке " . : /bin : /usr/bin",— поэтому в среде UNIX значением поля File.pathSeparatorChar будет ‘ : ‘.

 

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии