Предположим, я создаю временный файл в Java с помощью метода
File tmp = File.createTempFile(prefix, suffix);
Если я не явно называют удаление (метод)
, когда файл будет удален?
Как интуиция, может быть, когда JVM завершает работу, или earlier (сборщиком мусора), или наш (на некоторых операционных подметание системный процесс).
Файл выиграл'т быть удалены автоматически, от документации:
этот метод обеспечивает только часть временного файла объекта. Для организовать файл, создаваемый этим методом был удален автоматически, использовать deleteOnExit() метод.
Поэтому вы должны явно вызвать deleteOnExit():
запросы, что файл или каталог, обозначенный этим абстрактным путем будет удален, когда виртуальная машина завершается.
Как и другие ответы, обратите внимание, временные файлы, созданные с File.createTempFile()
будет не будет удален автоматически, если явно запросить его.
Универсальный, портативный способ, чтобы сделать это позвонить [.deleteOnExit()
](http://docs.oracle.com/javase/7/docs/api/java/io/File.html#deleteOnExit()) на "файл" объекта, который назначит файл для удаления, когда JVM завершает работу. Небольшим недостатком этого метода, однако, является то, что он работает только если виртуальная машина завершает работу в обычном режиме; на аварийное завершение (т. е. крэш виртуальной машины или принудительное завершение процесса ВМ), то файл может остаться неудаленными.
На Unixish системах (таких как Linux), это'ов на самом деле можно получить более надежное решение путем удаления временных файлов immediately после открытия it. Это работает, потому что файловых систем UNIX позволяют удаляемый файл ([разъединены](http://en.wikipedia.org/wiki/Unlink_(ОС UNIX)), чтобы быть точным), пока он's по-прежнему удерживаются открытыми с помощью одного или нескольких процессов. Такие файлы могут быть доступны через открытый файловый дескриптор, и место, которое они занимают на диске будет только быть исправлен ОС после последнего процесса проводит открытый дескриптор файла выходы.
Так вот'ы самый надежный и портативный способ я знаю, чтобы убедиться, что временный файл будет правильно удален после того, как программа завершает свою работу:
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.
В любом случае, однако, временный файл не должен оставаться на диске после того, как программа закончилась.
Зы. При проверке этого кода на Windows, я заметил довольно удивительный факт: видимо, просто leaving файл Temp незакрытые достаточно, чтобы сохранить его от deleted. Конечно, это также означает, что любая авария, которая происходит при Temp файл в использование приводит к левой и восстановлен, а это именно то, что мы'вновь пытается avoid здесь.
Насколько мне известно, единственный способ избежать это, чтобы убедиться, что файл Temp always закрывается с помощью "наконец-то" блок. Конечно, тогда вы могли бы точно также удалить файл в блок то же "наконец-то" тоже. Я'м не уверен, что, если что, используя `.deleteOnExit () будет на самом деле получить вас за это.
если не явного вызова
удаление (метод)
, когда файл будет удален?
Он выиграл'т, по крайней мере, не на Java. Если вы хотите, чтобы файл быть удален, когда JVM завершает работу, то вам нужно позвонить ТМП.deleteOnExit()`.
от: Как удалить временные файлы в Java
временный файл используется для хранения менее важных и временных данных, что всегда должно быть удален, когда ваша система прекращен. В рекомендуется использовать файл.deleteOnExit (), чтобы сделать это.
Например,
File temp = File.createTempFile("abc", ".tmp");
temp.deleteOnExit();
Приведенный выше пример создаст временный файл с именем “Азбука.tmp” и удалить, когда программа завершается или отменяется.
Если вы хотите удалить временный файл вручную, вы все еще можете использовать файл.удалить().
Временный файл используется для хранения менее важных и временные данные, которые всегда должны быть удалены, когда вашей системе прекращается. Рекомендуется использовать файл.deleteOnExit (), чтобы сделать это.
Например,
File temp = File.createTempFile("abc", ".tmp");
temp.deleteOnExit();
Приведенный выше пример создаст временный файл с именем “Азбука.tmp” и удалить его, когда программа завершается или отменяется.
Вы можете вручную удалить файл, прежде чем завершить процесс, если вы хотите, однако, когда процесс прекращается, то файл будет удален, а также.