Подтвердить что ты не робот

Когда удаляются временные файлы Java?

Предположим, что я создал временный файл на Java с помощью метода

File tmp = File.createTempFile(prefix, suffix);

Если я не объясню, вызовите метод delete(), когда файл будет удален?

Как интуиция, может быть, когда JVM завершается или раньше (сборщиком мусора) или позже (некоторым процессом подметания операционной системы).

4b9b3361

Ответ 1

Файл не будет удален автоматически, из JavaDoc:

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

Итак, вы должны явно вызвать deleteOnExit():

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

Ответ 2

Как отмечают другие ответы, временные файлы, созданные с помощью File.createTempFile(), не будут удалены автоматически, если вы явно не запросите его.

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

В системах Unixish (например, Linux) на самом деле можно получить несколько более надежное решение, удалив временный файл сразу после его открытия. Это работает, потому что файловые системы Unix позволяют удалять файл (unlinked, если быть точным), пока он все еще остается открытым одним или несколькими процессами. Обычно такие файлы можно получить через открытую дескриптор файла, а пространство, которое они занимают на диске, будет восстановлено только ОС после того, как последний процесс будет содержать открытый дескриптор выхода файла.

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

import java.io.File;
import java.io.RandomAccessFile;
import java.io.IOException;

public class TempFileTest
{
    public static void main(String[] args)
    {
        try {
            // create a temp file
            File temp = File.createTempFile("tempfiletest", ".tmp"); 
            String path = temp.getAbsolutePath();
            System.err.println("Temp file created: " + path);

            // open a handle to it
            RandomAccessFile fh = new RandomAccessFile (temp, "rw");
            System.err.println("Temp file opened for random access.");

            // try to delete the file immediately
            boolean deleted = false;
            try {
                deleted = temp.delete();
            } catch (SecurityException e) {
                // ignore
            }

            // else delete the file when the program ends
            if (deleted) {
                System.err.println("Temp file deleted.");
            } else {
                temp.deleteOnExit();
                System.err.println("Temp file scheduled for deletion.");
            }

            try {
                // test writing data to the file
                String str = "A quick brown fox jumps over the lazy dog.";
                fh.writeUTF(str);
                System.err.println("Wrote: " + str);

                // test reading the data back from the file
                fh.seek(0);
                String out = fh.readUTF();
                System.err.println("Read: " + out);

            } finally {
                // close the file
                fh.close();
                System.err.println("Temp file closed.");
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

В системе Unixish выполнение этого должно приводить к следующему выводу:

Temp file created: /tmp/tempfiletest587200103465311579.tmp
Temp file opened for random access.
Temp file deleted.
Wrote: A quick brown fox jumps over the lazy dog.
Read: A quick brown fox jumps over the lazy dog.
Temp file closed.

тогда как в Windows вывод выглядит несколько иначе:

Temp file created: C:\DOCUME~1\User\LOCALS~1\Temp\tempfiletest5547070005699628548.tmp
Temp file opened for random access.
Temp file scheduled for deletion.
Wrote: A quick brown fox jumps over the lazy dog.
Read: A quick brown fox jumps over the lazy dog.
Temp file closed.

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


Ps.. При тестировании этого кода в Windows я заметил довольно удивительный факт: видимо, просто оставить закрытый файл temp достаточно, чтобы он не удалялся. Разумеется, это также означает, что любой сбой, который происходит во время использования временного файла, заставит его оставить без изменений, чего мы пытаемся избежать здесь.

AFAIK, единственный способ избежать этого - убедиться, что временный файл всегда закрывается с помощью блока finally. Конечно, тогда вы могли бы также удалить файл в том же блоке finally. Я не уверен, что, если что-нибудь, используя .deleteOnExit(), на самом деле вы об этом узнаете.

Ответ 3

Если я не объясню, вызовите метод delete(), когда файл будет удален?

Это не будет, по крайней мере, не Java. Если вы хотите, чтобы файл был удален при завершении JVM, вам необходимо вызвать tmp.deleteOnExit().

Ответ 4

from: Как удалить временный файл в Java

Временной файл используется для хранения менее важных и временных данных, , который всегда должен быть удален, когда ваша система завершена. Лучшая практика - использовать File.deleteOnExit() для этого.

Например,

File temp = File.createTempFile("abc", ".tmp"); 
temp.deleteOnExit();

В приведенном выше примере создается временный файл с именем "abc.tmp" и удаляется, когда программа завершается или завершается.

Если вы хотите удалить временный файл вручную, вы все равно можете использовать File.delete().

Ответ 5

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

Например,

File temp = File.createTempFile("abc", ".tmp"); 
temp.deleteOnExit();

В приведенном выше примере создается временный файл с именем "abc.tmp" и удаляется, когда программа завершается или завершается.

Ответ 6

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