---
title: Управление потоками
seo:
  title: Управление потоками — Java Developer
  description: Тема «Управление потоками» для собеседования Java Developer. Что вы знаете об интерфейсе FileFilter? Что вы знаете о RandomAccessFile?
---

[Все темы Java Developer](/java-developer)

## <strong>Что вы знаете об интерфейсе</strong> <code>FileFilter</code><strong>?</strong> [#q-14bee738d69b81ac9da0fb4370f45c7d]

Интерфейс <code>FileFilter</code> в Java представляет собой функциональный интерфейс, который используется для фильтрации файлов в директории на основе определенных критериев. Он содержит единственный абстрактный метод&#58;

```java
public interface FileFilter {
    boolean accept(File pathname);
}
```

Метод <code>accept&#40;File pathname&#41;</code> принимает объект <code>File</code>, представляющий файл или директорию, и возвращает <code>true</code>, если файл удовлетворяет критериям фильтрации, или <code>false</code> в противном случае.

<strong>Пример&#58;</strong>

```java
import java.io.File;
import java.io.FileFilter;

public class ExampleFileFilter implements FileFilter {

    @Override
    public boolean accept(File pathname) {
        // Фильтр для файлов только с расширением .txt
        if (pathname.isFile() && pathname.getName().endsWith(".txt")) {
            return true;
        }
        return false;
    }

    public static void main(String[] args) {
        File directory = new File("/path/to/directory");

        // Получаем список файлов, отфильтрованных по критериям FileFilter
        File[] txtFiles = directory.listFiles(new ExampleFileFilter());

        // Выводим список отфильтрованных файлов
        for (File file : txtFiles) {
            System.out.println(file.getName());
        }
    }
}
```

:::note[Ссылки для изучения]

1. [Потоки ввода/вывода в Java](https://javarush.com/quests/lectures/questcore.level08.lecture01)
   :::

---

## <strong>Что вы знаете о</strong> <code>RandomAccessFile</code><strong>?</strong> [#q-14bee738d69b818a9850dd20808b4dd7]

<code>RandomAccessFile</code> в Java представляет собой класс, который позволяет
читать и записывать данные в файле в произвольных местах, то есть осуществлять
произвольный доступ к данным. Основные особенности и возможности
<code>RandomAccessFile</code>&#58;

{/* prettier-ignore */}
1. <strong>Произвольный доступ</strong>&#58; <code>RandomAccessFile</code> позволяет перемещаться по файлу и читать/писать данные с любой позиции в файле.

1. <strong>Чтение и запись</strong>&#58; поддерживает как чтение данных из файла, так и запись данных в файл.

1. <strong>Режимы доступа</strong>&#58;

    - <code>r</code>&#58; только для чтения.

    - <code>rw</code>&#58; чтение и запись.

1. <strong>Методы</strong>&#58;

    - <code>read&#40;&#41;</code>, <code>readFully&#40;&#41;</code>&#58; для чтения данных из файла.

    - <code>write&#40;&#41;</code>, <code>writeBytes&#40;&#41;</code>, <code>writeUTF&#40;&#41;</code>&#58; для записи данных в файл.

    - <code>seek&#40;long pos&#41;</code>&#58; перемещение указателя на указанную позицию в файле.

    - <code>length&#40;&#41;</code>&#58; возвращает текущую длину файла в байтах.

    - <code>close&#40;&#41;</code>&#58; закрывает файл и освобождает связанные ресурсы.

1. <strong>Не является членом иерархии потоков</strong>&#58; <code>RandomAccessFile</code> не является наследником <code>InputStream</code> или <code>OutputStream</code>, а предоставляет собственные методы для работы с файлом.

Пример использования <code>RandomAccessFile</code> для чтения и записи данных&#58;

```java
import java.io.RandomAccessFile;

public class ExampleRandomAccessFile {
    public static void main(String[] args) {
        try {
            // Создаем RandomAccessFile для чтения и записи в файл "data.txt"
            RandomAccessFile file = new RandomAccessFile("data.txt", "rw");

            // Записываем данные в файл
            file.writeUTF("Hello, World!");

            // Перемещаем указатель в начало файла
            file.seek(0);

            // Читаем данные из файла
            String message = file.readUTF();
            System.out.println("Message from file: " + message);

            // Закрываем файл
            file.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

Этот пример демонстрирует создание <code>RandomAccessFile</code>, запись строки в файл, чтение этой строки и закрытие файла после операций. <code>RandomAccessFile</code> полезен в случаях, когда требуется эффективно читать и записывать данные в различные места файла без необходимости последовательного доступа.

:::note[Ссылки для изучения]

1. [Потоки ввода/вывода в Java](https://javarush.com/quests/lectures/questcore.level08.lecture01)
   :::

---

## <strong>Что такое «абсолютный путь» и «относительный путь»?</strong> [#q-14bee738d69b81f6b648e79e1399f4ee]

<strong>Абсолютный путь</strong> и <strong>относительный путь</strong> - это
понятия, используемые для определения местоположения файла или директории в
файловой системе&#58;

{/* prettier-ignore */}
1. <strong>Абсолютный путь</strong>&#58;

    - Это полный путь к файлу или директории, начиная от корневого каталога файловой системы.

    - В Windows может начинаться с диска (например, <code>C&#58;&#92;&#92;folder&#92;&#92;file&#46;txt</code>).

    - В Unix-подобных системах начинается с корневого каталога (<code>&#47;home&#47;user&#47;folder&#47;file&#46;txt</code>).

1. <strong>Относительный путь</strong>&#58;

    - Это путь к файлу или директории относительно текущего рабочего каталога или другой относительной точки отсчета.

    - Не начинается с корневого каталога, а использует текущее местоположение в файловой системе.

    - Примеры&#58;

        - <code>folder&#47;file&#46;txt</code> (относительно текущего каталога)

        - <code>&#46;&#46;&#47;parent&#95;folder&#47;file&#46;txt</code> (относительно родительского каталога)

:::note[Ссылки для изучения]

1. [Потоки ввода/вывода в Java](https://javarush.com/quests/lectures/questcore.level08.lecture01)
   :::

---

## <strong>Что такое «символьная ссылка»?</strong> [#q-14bee738d69b8104b686c11681f2373d]

Символьная ссылка (<code>symbolic link</code>), также известная как символическая ссылка или симлинк, это специальный тип файла в файловых системах, который работает как указатель на другой файл или директорию.

<strong>Основные характеристики символьной ссылки&#58;</strong>

1. <strong>Указатель на другой объект</strong>&#58; символьная ссылка содержит
   путь к целевому файлу или директории.

1. <strong>Независимость от расположения</strong>&#58; целевой объект может быть
   расположен как на том же диске, так и на другом, что делает символьные ссылки
   более гибкими по сравнению с жесткими ссылками.

1. <strong>Символьная ссылка сама по себе является файлом</strong>&#58;
   символьная ссылка имеет свои собственные метаданные (размер, права доступа и
   т.д.).

1. <strong>Слабая связь</strong>&#58; если целевой файл или директория удалены
   или перемещены, символьная ссылка остается, но становится битой (broken
   link).

Примеры использования символьных ссылок&#58;

- Создание сокращенных или удобных путей к часто используемым директориям.

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

- Создание ссылок на файлы, находящиеся в разных местах файловой системы для удобства работы с ними.

:::note[Ссылки для изучения]

1. [Потоки ввода/вывода в Java](https://javarush.com/quests/lectures/questcore.level08.lecture01)
   :::
