web-dev-qa-db-ja.com

Java一時ファイルはいつ削除されますか?

メソッドでJavaに一時ファイルを作成するとします

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

delete()メソッドを明示的に呼び出さない場合、ファイルはいつ削除されますか?

直感的には、JVMが終了するとき、または以前(ガベージコレクターによる)、または(オペレーティングシステムのスイーププロセスによる)の場合があります。

76
Alphaaa

JavaDoc から、ファイルは自動的に削除されません。

このメソッドは、一時ファイル機能の一部のみを提供します。このメソッドで作成されたファイルが自動的に削除されるようにするには、deleteOnExit()メソッドを使用します。

したがって、明示的に deleteOnExit() を呼び出す必要があります。

仮想マシンの終了時に、この抽象パス名で示されるファイルまたはディレクトリを削除することを要求します。

80
Kai

他の回答のメモにあるように、 File.createTempFile() で作成された一時ファイルは、明示的に要求しない限り、自動的に削除されますnot

これを行うための一般的で移植可能な方法は、Fileオブジェクトで .deleteOnExit() を呼び出すことです。これにより、JVMの終了時にファイルの削除がスケジュールされます。ただし、この方法のわずかな欠点は、VMが正常に終了した場合にのみ機能することです。異常終了(つまり、VMクラッシュまたはVMプロセスの強制終了)の場合、ファイルは削除されないままになる可能性があります。

Unixishシステム(Linuxなど)では、一時ファイルを削除することで、多少信頼性の高いソリューションを実際に取得できますすぐに開く。これは、Unixファイルシステムが1つまたは複数のプロセスによって開かれたままの状態でファイルを削除できる(正確には- nlinked )ために機能します。このようなファイルは、開いているファイルハンドルを介して通常アクセスできます。ディスク上のファイルが占有しているスペースは、ファイルへの開いたハンドルを保持する最後のプロセスが終了した後にのみOSによって回収されます。

したがって、プログラムの終了後に一時ファイルが適切に削除されるようにするための最も信頼性が高く移植性の高い方法を次に示します。

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でこのコードをテストしているときに、かなり驚くべき事実を観察しました。明らかに、単に削除されない。もちろん、これは、一時ファイルの使用中にクラッシュが発生すると、削除されないままになることを意味します。これはまさに、ここでavoidを試みています。

知る限り、これを回避する唯一の方法は、一時ファイルalwaysfinallyブロックを使用して閉じられるようにすることです。もちろん、同じfinallyブロック内のファイルも削除できます。 .deleteOnExit()を使用すると、実際にそれを超えるとどうなるかわかりません。

50
Ilmari Karonen

delete()メソッドを明示的に呼び出さない場合、ファイルはいつ削除されますか?

少なくともJavaではそうではありません。 JVMの終了時にファイルを削除する場合は、tmp.deleteOnExit()を呼び出す必要があります。

17
Ian Roberts

from: Javaで一時ファイルを削除する方法

一時ファイルは、重要度の低い一時データを保存するために使用されます。これは、システムの終了時に常に削除される必要があります。ベストプラクティスは、File.deleteOnExit()を使用して行うことです。

例えば、

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

上記の例では、「abc.tmp」という名前の一時ファイルを作成し、プログラムの終了時または終了時に削除しますを作成します。

一時ファイルを手動で削除するが必要な場合でも、File.delete()を使用できます。

4
Grijesh Chauhan

一時ファイルは、重要度の低い一時データを保存するために使用されます。これらのデータは、システムの終了時に常に削除する必要があります。ベストプラクティスは、File.deleteOnExit()を使用して行うことです。

例えば、

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

上記の例は、「abc.tmp」という名前の一時ファイルを作成し、プログラムが終了または終了したときに削除します。

3
Juned Ahsan

必要に応じて、プロセスを終了する前にファイルを手動で削除できますが、プロセスが終了すると、ファイルも削除されます。

0
Jasper Ketelaar