JavaRush /Курсы /JAVA 25 SELF /Работа с временными файлами и директориями

Работа с временными файлами и директориями

JAVA 25 SELF
40 уровень , 3 лекция
Открыта

1. Создание временных файлов: Files.createTempFile

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

Чаще всего временные файлы используют при скачивании больших документов (сначала загружаем их во временную папку, а потом переносим в нужное место), при кэшировании информации, которую можно пересчитать или получить заново, для хранения промежуточных результатов при обработке больших массивов данных, а также для обмена данными между частями программы или потоками. Ещё один частый сценарий — тесты: удобнее писать во временные файлы, чем захламлять рабочие каталоги.

Можно сказать, что временные файлы — это черновики для программы. Они не для публики, но без них работу не всегда сделаешь.

В Java создать такой файл очень просто — буквально одной строчкой. Для этого есть метод Files.createTempFile.

Простой пример

import java.nio.file.*;

public class TempFileExample {
    public static void main(String[] args) throws Exception {
        // Создаём временный файл с префиксом "myapp_" и суффиксом ".tmp"
        Path tempFile = Files.createTempFile("myapp_", ".tmp");
        System.out.println("Временный файл создан: " + tempFile);

        // Можно записать туда данные
        Files.writeString(tempFile, "Это временные данные");

        // Читаем обратно
        String data = Files.readString(tempFile);
        System.out.println("Содержимое: " + data);
    }
}

Что происходит?

  • Файл создаётся в системной временной директории (обычно это "/tmp" на Linux или "C:\\Users\\<имя>\\AppData\\Local\\Temp" на Windows).
  • Имя файла будет что-то вроде "myapp_1234567890.tmp".
  • Файл уже существует на диске, можно с ним работать как с обычным.

Аргументы метода

  • Первый аргумент — префикс имени файла (например, "myapp_").
  • Второй аргумент — суффикс (например, ".tmp"). Если не указать, будет просто ".tmp".
  • Если оба аргумента — null, имя будет по умолчанию.

Куда сохраняется файл?

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

Path tempDir = Paths.get("my_temp_folder");
Files.createDirectories(tempDir); // Создаём, если нет
Path tempFile = Files.createTempFile(tempDir, "prefix_", ".txt");

2. Создание временных директорий: Files.createTempDirectory

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

Пример

import java.nio.file.*;

public class TempDirExample {
    public static void main(String[] args) throws Exception {
        // Создаём временную директорию с префиксом "work_"
        Path tempDir = Files.createTempDirectory("work_");
        System.out.println("Временная папка: " + tempDir);

        // Можно создавать в ней файлы
        Path fileInTempDir = Files.createTempFile(tempDir, "file_", ".dat");
        System.out.println("Временный файл внутри: " + fileInTempDir);
    }
}

Особенности:

  • Имя папки будет примерно таким: "work_1234567890".
  • По умолчанию — в системной временной директории, но можно указать любую другую.

Указание директории

Path baseDir = Paths.get("my_temp_work");
Files.createDirectories(baseDir);
Path tempDir = Files.createTempDirectory(baseDir, "session_");

3. Удаление временных файлов и директорий

Вот тут кроется один из главных «подводных камней» Java: временные файлы и папки не удаляются автоматически! Если вы их не уберёте, они останутся на диске и будут радовать вас своим присутствием долгие годы (или до следующей чистки системой).

Как удалять временные файлы?

  • Вручную: после окончания работы с файлом вызовите Files.delete(...) или Files.deleteIfExists(...).
  • В конце программы: можно использовать старый добрый метод File.deleteOnExit(), но только для объектов типа File, а не Path.

Пример: удаление временного файла

import java.nio.file.*;

public class TempFileDeleteExample {
    public static void main(String[] args) throws Exception {
        Path tempFile = Files.createTempFile("demo_", ".tmp");
        System.out.println("Создан: " + tempFile);

        // ... работаем с файлом

        // Удаляем файл
        Files.deleteIfExists(tempFile);
        System.out.println("Удалён: " + tempFile);
    }
}

Использование deleteOnExit()

import java.io.File;

public class DeleteOnExitDemo {
    public static void main(String[] args) throws Exception {
        File tempFile = File.createTempFile("legacy_", ".tmp");
        System.out.println("Создан: " + tempFile);

        // Помечаем файл на удаление при завершении JVM
        tempFile.deleteOnExit();
    }
}

Внимание!
Метод deleteOnExit() работает только с File, а не с Path. Если вы используете современный API (Path и Files), удаляйте вручную.

Удаление временных директорий

Удалить временную папку можно только если она пуста:

Files.delete(tempDir); // выбросит исключение, если внутри что-то осталось

Если в папке есть файлы — сначала удалите их, потом папку. Обычно для этого пишут небольшой рекурсивный метод.

4. Практические рекомендации

Где хранить временные файлы?

Системная временная директория:
Используйте её по умолчанию, если нет особых требований. Получить путь можно так:

String tempDir = System.getProperty("java.io.tmpdir");
System.out.println("Системная temp-папка: " + tempDir);

Своя папка:
Если безопасность или организация важны — создайте отдельную папку (например, внутри каталога приложения).

Безопасность

  • Не храните временные файлы в общедоступных папках — особенно если там может быть что-то секретное.
  • Очищайте временные файлы после использования — иначе они могут накапливаться и занимать место.

Очистка при ошибках

Если в ходе выполнения программы случилась ошибка, не забудьте удалить временные файлы. Для этого удобно использовать блоки try-finally:

Path tempFile = Files.createTempFile("task_", ".tmp");
try {
    // используем файл
} finally {
    Files.deleteIfExists(tempFile);
}

Временные файлы и тестирование

В тестах часто используют временные файлы и папки для изоляции данных. После теста — обязательно удаляйте всё созданное!

5. Пример: временная рабочая директория для обработки данных

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

import java.nio.file.*;
import java.io.IOException;

public class TempWorkDirExample {
    public static void main(String[] args) throws IOException {
        // Создаём временную директорию
        Path tempWorkDir = Files.createTempDirectory("unzip_");
        System.out.println("Временная рабочая папка: " + tempWorkDir);

        try {
            // Здесь могла бы быть распаковка архива
            Path tempFile = Files.createTempFile(tempWorkDir, "file_", ".txt");
            Files.writeString(tempFile, "Временные данные для обработки");

            // ... работаем с файлами

        } finally {
            // Удаляем все файлы в папке и саму папку
            Files.walk(tempWorkDir)
                .sorted((a, b) -> b.compareTo(a)) // сначала файлы, потом папки
                .forEach(path -> {
                    try {
                        Files.deleteIfExists(path);
                    } catch (IOException ex) {
                        System.err.println("Не удалось удалить " + path + ": " + ex.getMessage());
                    }
                });
            System.out.println("Временная папка и файлы удалены.");
        }
    }
}

Обратите внимание:
Сначала удаляем все файлы, потом саму папку. Сортировка нужна, чтобы не попытаться удалить папку до того, как удалили её содержимое.

6. Типичные ошибки при работе с временными файлами

Ошибка №1: забыли удалить временный файл или папку. Самая частая проблема — временные файлы остаются на диске, накапливаются и со временем приводят к «захламлению» системы. Особенно это критично для серверных приложений и долгоживущих процессов.

Ошибка №2: используете deleteOnExit() для Path. Метод deleteOnExit() работает только с классом File, а не с Path. Если вы используете современный API, придётся удалять вручную.

Ошибка №3: пытаетесь удалить непустую папку через Files.delete. Метод Files.delete() удаляет только пустые директории. Если внутри что-то осталось — выбросится исключение. Для удаления непустых директорий используйте рекурсивный обход и удаление всех файлов.

Ошибка №4: создаёте временные файлы в рабочей директории проекта. Это может привести к случайному удалению важных файлов или к путанице. Лучше использовать системную temp-папку или отдельную папку для временных файлов приложения.

Ошибка №5: не обрабатываете исключения при удалении временных файлов. Если файл уже удалён или заблокирован, попытка удаления может выбросить исключение. Используйте Files.deleteIfExists() и обработку ошибок.

1
Задача
JAVA 25 SELF, 40 уровень, 3 лекция
Недоступна
Уборка временных заметок приложения 🗑️
Уборка временных заметок приложения 🗑️
1
Задача
JAVA 25 SELF, 40 уровень, 3 лекция
Недоступна
Завершение цифровой сессии и полная очистка 🌀
Завершение цифровой сессии и полная очистка 🌀
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ