Главная » Java » Потоки File и объекты FileDescriptor в Java

0

 

  Потоковые классы семейства File— Filelnputstream, FileOutputStream, p-jleReader и FileWriter — позволяют трактовать файл как поток, предназначенный для ввода (чтения) или вывода (записи) данных. В составе каждого из типов предусмотрены три конструктора, принимающих в качестве параметра одно из следующих значений:

 

·         строку String, задающую имя файла;

·         объект класса File (см. раздел 15.6.3), указывающий на файл;

·         объект FileDescriptor

 

Бели при использовании байтового или символьного потоков ввода (чтения) обнаруживается, что файл не существует, выбрасывается исключение типа FileNotFoundException. При доступе к файлу во всех случаях проверяется наличие соответствующих полномочий: если необходимые права на обращение к файлу отсутствуют, генерируется исключение типа Securi tyException (см. раздел 18.5).

  Два первых конструктора при построении байтового или символьного потоков вывода (записи) предусматривают создание файла, если такового не существует; при наличии файла его содержимое усекается (уничтожается). Процессом усечения данных можно управлять, используя соответствующие варианты конструкторов с двумя параметрами: строкой String, задающей имя файла, и флагом типа boolean, который, будучи равным true, устанавливает, что в процессе записи каждая новая порция данных должна передаваться в поток, не уничтожая ранее сохраненного содержимого. Если в качестве значения флага задается false, вместо прежних данных будут записаны новые. Если файл не существует, он будет создан (значение флага в этом случае во внимание не принимается).

  Объект FileDescriptor служит для представления сущности, описывающей открытый файл и определяемой особенностями применяемой операционной системы. Объект дескриптора открытого файла может быть получен вызовом метода getFD объекта байтового потока File, но его нельзя определить для символьных потоков File. Чтобы проверить, действителен ли объект FileDescriptor, следует использовать метод val i d этого объекта, возвращающий значение типа boolean; дескрипторы, созданные непосредственно с помощью конструктора класса FileDescriptor без параметров, действительными не считаются.

  Объект FileDescriptor может быть применен для создания нового потока Fl le на основе того же файла, который используется другим потоком, — информация об имени и местоположении файла в данном случае не нужна. Следует тщательно избегать опасности непредусмотренного взаимодействия между потоками, выполняющими различные функции над данными одного и того же файла: невозможно предсказать, что случится, например, если два потока вычисле-ний примутся единовременно записывать данные в один файл посредством двух Различных объектов FileOutputStream.

  Метод flush классов FileOutputStream и FileWriter гарантирует, что содержимое внутреннего буфера потока будет сброшено в соответствующий файл.

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

аны на диске, поскольку файловая система вправе осуществлять собственную

буферизацию данных. Чтобы спровоцировать выполнение операции записи даа ных на диск, можно попытаться вызвать метод sync текущего объект FileDescriptor; если файловая система не поддерживает контракт, реализуе мый методом, будет выброшено исключение типа SyncFailedException.

 

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

По теме:

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