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



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



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


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



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

673   6  

6 ответов:

файл не будет удален автоматически, из документация:

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

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

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

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

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

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

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

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, я заметил довольно удивительный факт: по-видимому, просто достаточно оставить временный файл незамкнутым, чтобы он не был удален. Конечно, это также означает, что любой сбой, который происходит во время использования временного файла, приведет к тому, что он будет оставлен незадействованным, что это именно то, что мы пытаемся избежать здесь.

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

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

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

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

например,

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

в приведенном выше примере будет создан временный файл с именем "abc.tmp " и удалить его при завершении или выходе из программы.

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

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

например,

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

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

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

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

Comments

    Ничего не найдено.