Калі Java часовыя файлы выдаляюцца?

Выкажам здагадку, я ствараю часовы файл у Java з дапамогай метаду

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

Калі я не ў відавочнай форме выклічце Выдаліць() метад, калі, файл будзе выдалены?

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

60
дададзена аўтар devnull, крыніца
так ... чаму вы не проста праверыць Javadoc, замест таго, каб ісці з інтуіцыяй? яна выразна дакументаваны.
дададзена аўтар eis, крыніца
мае прабачэнні, я толькі праверыў метад docs.oracle.com/javase/6/docs/api/java/io/… , які не дае адказу. Доўгае апісанне прысутнічае толькі ў метадзе з даўжэйшай подпісам.
дададзена аўтар Alphaaa, крыніца
мае прабачэнні, я толькі праверыў метад docs.oracle.com/javase/6/docs/api/java/io/… , які не дае адказу. Доўгае апісанне прысутнічае толькі ў метадзе з даўжэйшай подпісам.
дададзена аўтар Alphaaa, крыніца
мае прабачэнні, я толькі праверыў метад docs.oracle.com/javase/6/docs/api/java/io/… , які не дае адказу. Доўгае апісанне прысутнічае толькі ў метадзе з даўжэйшай подпісам.
дададзена аўтар Alphaaa, крыніца

18 адказы

Файл не будзе выдалены аўтаматычна, з JavaDoc :

<�Р> Гэты метад забяспечвае толькі частка часовага файла аб'екта. да   арганізаваць файл, створаны з дапамогай гэтага метаду, які будзе аўтаматычна выдалены,   выкарыстоўваць метад deleteOnExit (). </р>

Такім чынам, вы павінны відавочна выклікаць deleteOnExit() :

<�Р> просіць пра тое, што файл ці каталог, пазначаны гэтым абстрактным шляхавы імя   быць выдаленыя, калі віртуальная машына завяршае працу.
67
дададзена
і калі выкарыстоўваецца deleteOnExit, ён будзе выдалены «, калі віртуальная машына завяршае працу. Файлы (або каталогі) выдаляюцца ў зваротным парадку, што яны зарэгістраваныя. Выклік гэтага метаду, каб выдаліць файл ці каталог, які ўжо зарэгістраваны для выдалення не мае эфект. Выключэнне будзе выконвацца толькі для нармальнага завяршэння віртуальнай машыны, як вызначана спецыфікацыяй мовы Java «. так што не выдаляюцца нават на ўсіх JVM існуе.
дададзена аўтар eis, крыніца
дзякуй, я толькі праверыў метад docs.oracle.com/javase/6/docs/api/java/io/… , які не дае адказу. Доўгае апісанне прысутнічае толькі ў метадзе з даўжэйшай подпісам
дададзена аўтар Alphaaa, крыніца

Як і іншыя адказы адзначыць, часовыя файлы, створаныя з дапамогай File.createTempFile() будзе не будзе аўтаматычна выдалены, калі відавочна не запатрабуе.

Радавой, пераносны спосаб зрабіць гэта, каб патэлефанаваць < код> .deleteOnExit() на файл аб'ект, які будзе планаваць файл для выдалення, калі віртуальная машына завяршаецца. Невялікі недахоп гэтага метаду, аднак, заключаецца ў тым, што яна працуе толькі тады, калі віртуальная машына завяршаецца нармальна; на аварыйным завяршэнні (г.зн. аварыі VM або прымусовае спыненне працэсу VM), файл можа заставацца адноўлены.

На юниксовые сістэмах (напрыклад, Linux), гэта на самай справе можна атрымаць некалькі больш надзейнае рашэнне, выдаліўшы часовы файл адразу пасля адкрыцця . Гэта працуе, таму што Unix файлавыя сістэмы дазваляюць файл павінен быць выдалены ( нязвязанага , каб быць дакладным), пакуль ён усё яшчэ трымаў адкрыты адным ці некалькімі працэсамі. Такія файлы могуць быць даступныя як правіла, праз адкрыты дэскрыптар, і прастора, якое яны займаюць на дыску будзе вызвалена толькі пасля таго, як восы апошняга працэсу, які змяшчае адкрыты дэскрыптар да файлавых выйсцяў.

Дык вось самы надзейны і партатыўны спосаб я ведаю, каб пераканацца, што часовы файл будзе правільна выдалены пасля выхаду з праграмы:

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();
        }
    }
}

На юниксовой сістэме працуе гэта павінна вырабляць штосьці накшталт наступнага высновы:

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. While testing this code on Windows, I observed a rather surprising fact: apparently, merely leaving the temp file unclosed is enough to keep it from being deleted. Of course, this also means that any crash that happens while the temp file is in use will cause it to be left undeleted, which is exactly what we're trying to avoid here.

AFAIK, адзіны спосаб пазбегнуць гэтага, каб гарантаваць, што тэмпература файл заўсёды закрываецца з дапамогай , нарэшце, блок. Вядома, вы маглі б сапраўды гэтак жа выдаліць файл у тым жа , нарэшце, блок таксама. Я не ўпэўнены, што, калі што-небудзь, выкарыстоўваючы .deleteOnExit() будзе на самой справе атрымаць вас з гэтай нагоды.

46
дададзена
Вялікі адказ. Іншая важная рэч, каб адзначыць аб deleteOnExit() , з'яўляецца тое, што, калі ён называецца часта (скажам, у сістэме, якая выкарыстоўвае мноства новых часовых файлаў), то, верагодна, выкліча уцечку памяці (з ёй павінен запомніць ўсе шляхі, якія павінны быць выдалены).
дададзена аўтар Eyal Roth, крыніца

Як і іншыя адказы адзначыць, часовыя файлы, створаныя з дапамогай File.createTempFile() будзе не будзе аўтаматычна выдалены, калі відавочна не запатрабуе.

Радавой, пераносны спосаб зрабіць гэта, каб патэлефанаваць < код> .deleteOnExit() на файл аб'ект, які будзе планаваць файл для выдалення, калі віртуальная машына завяршаецца. Невялікі недахоп гэтага метаду, аднак, заключаецца ў тым, што яна працуе толькі тады, калі віртуальная машына завяршаецца нармальна; на аварыйным завяршэнні (г.зн. аварыі VM або прымусовае спыненне працэсу VM), файл можа заставацца адноўлены.

На юниксовые сістэмах (напрыклад, Linux), гэта на самай справе можна атрымаць некалькі больш надзейнае рашэнне, выдаліўшы часовы файл адразу пасля адкрыцця . Гэта працуе, таму што Unix файлавыя сістэмы дазваляюць файл павінен быць выдалены ( нязвязанага , каб быць дакладным), пакуль ён усё яшчэ трымаў адкрыты адным ці некалькімі працэсамі. Такія файлы могуць быць даступныя як правіла, праз адкрыты дэскрыптар, і прастора, якое яны займаюць на дыску будзе вызвалена толькі пасля таго, як восы апошняга працэсу, які змяшчае адкрыты дэскрыптар да файлавых выйсцяў.

Дык вось самы надзейны і партатыўны спосаб я ведаю, каб пераканацца, што часовы файл будзе правільна выдалены пасля выхаду з праграмы:

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();
        }
    }
}

На юниксовой сістэме працуе гэта павінна вырабляць штосьці накшталт наступнага высновы:

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. While testing this code on Windows, I observed a rather surprising fact: apparently, merely leaving the temp file unclosed is enough to keep it from being deleted. Of course, this also means that any crash that happens while the temp file is in use will cause it to be left undeleted, which is exactly what we're trying to avoid here.

AFAIK, адзіны спосаб пазбегнуць гэтага, каб гарантаваць, што тэмпература файл заўсёды закрываецца з дапамогай , нарэшце, блок. Вядома, вы маглі б сапраўды гэтак жа выдаліць файл у тым жа , нарэшце, блок таксама. Я не ўпэўнены, што, калі што-небудзь, выкарыстоўваючы .deleteOnExit() будзе на самой справе атрымаць вас з гэтай нагоды.

46
дададзена
Вялікі адказ. Іншая важная рэч, каб адзначыць аб deleteOnExit() , з'яўляецца тое, што, калі ён называецца часта (скажам, у сістэме, якая выкарыстоўвае мноства новых часовых файлаў), то, верагодна, выкліча уцечку памяці (з ёй павінен запомніць ўсе шляхі, якія павінны быць выдалены).
дададзена аўтар Eyal Roth, крыніца
<�Р> Калі я не ў відавочнай форме выклічце Выдаліць() метад, калі, файл будзе выдалены?

Гэта не будзе, па меншай меры, не Java. Калі вы хочаце, каб файл, які будзе выдалены, калі JVM заканчваецца, то вам трэба выклікаць tmp.deleteOnExit() .

14
дададзена
+1 на самай справе адказаць на пытанне
дададзена аўтар Nicolás Carlo, крыніца
<�Р> Калі я не ў відавочнай форме выклічце Выдаліць() метад, калі, файл будзе выдалены?

Гэта не будзе, па меншай меры, не Java. Калі вы хочаце, каб файл, які будзе выдалены, калі JVM заканчваецца, то вам трэба выклікаць tmp.deleteOnExit() .

14
дададзена
+1 на самай справе адказаць на пытанне
дададзена аўтар Nicolás Carlo, крыніца
<�Р> Калі я не ў відавочнай форме выклічце Выдаліць() метад, калі, файл будзе выдалены?

Гэта не будзе, па меншай меры, не Java. Калі вы хочаце, каб файл, які будзе выдалены, калі JVM заканчваецца, то вам трэба выклікаць tmp.deleteOnExit() .

14
дададзена
+1 на самай справе адказаць на пытанне
дададзена аўтар Nicolás Carlo, крыніца
<�Р> Калі я не ў відавочнай форме выклічце Выдаліць() метад, калі, файл будзе выдалены?

Гэта не будзе, па меншай меры, не Java. Калі вы хочаце, каб файл, які будзе выдалены, калі JVM заканчваецца, то вам трэба выклікаць tmp.deleteOnExit() .

14
дададзена
+1 на самай справе адказаць на пытанне
дададзена аўтар Nicolás Carlo, крыніца

from: How to delete temporary file in Java

<�Р> Часовы файл выкарыстоўваецца для захоўвання менш важных і часавых дадзеных,   <�Моцны>, якія заўсёды павінны быць выдаленыя, калі сістэма завяршаецца .   Лепш за ўсё выкарыстоўваць File.deleteOnExit (), каб зрабіць гэта.

Напрыклад,

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

Прыведзены вышэй прыклад створыць часовы файл з імем «abc.tmp» і выдаліць яго, калі праграма завяршаецца або выхаду .

Калі вы хочаце , каб выдаліць часовы файл ўручную , вы можаце выкарыстоўваць File.delete ().

2
дададзена
Чаму гэта лепшая практыка?
дададзена аўтар Frans, крыніца

from: How to delete temporary file in Java

<�Р> Часовы файл выкарыстоўваецца для захоўвання менш важных і часавых дадзеных,   <�Моцны>, якія заўсёды павінны быць выдаленыя, калі сістэма завяршаецца .   Лепш за ўсё выкарыстоўваць File.deleteOnExit (), каб зрабіць гэта.

Напрыклад,

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

Прыведзены вышэй прыклад створыць часовы файл з імем «abc.tmp» і выдаліць яго, калі праграма завяршаецца або выхаду .

Калі вы хочаце , каб выдаліць часовы файл ўручную , вы можаце выкарыстоўваць File.delete ().

2
дададзена
Чаму гэта лепшая практыка?
дададзена аўтар Frans, крыніца

from: How to delete temporary file in Java

<�Р> Часовы файл выкарыстоўваецца для захоўвання менш важных і часавых дадзеных,   <�Моцны>, якія заўсёды павінны быць выдаленыя, калі сістэма завяршаецца .   Лепш за ўсё выкарыстоўваць File.deleteOnExit (), каб зрабіць гэта.

Напрыклад,

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

Прыведзены вышэй прыклад створыць часовы файл з імем «abc.tmp» і выдаліць яго, калі праграма завяршаецца або выхаду .

Калі вы хочаце , каб выдаліць часовы файл ўручную , вы можаце выкарыстоўваць File.delete ().

2
дададзена
Чаму гэта лепшая практыка?
дададзена аўтар Frans, крыніца

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

Напрыклад,

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

Прыведзены вышэй прыклад створыць часовы файл з імем «abc.tmp» і выдаліць яго, калі праграма завяршаецца або завяршаецца.

2
дададзена

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

Напрыклад,

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

Прыведзены вышэй прыклад створыць часовы файл з імем «abc.tmp» і выдаліць яго, калі праграма завяршаецца або завяршаецца.

2
дададзена

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

Напрыклад,

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

Прыведзены вышэй прыклад створыць часовы файл з імем «abc.tmp» і выдаліць яго, калі праграма завяршаецца або завяршаецца.

2
дададзена

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

Напрыклад,

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

Прыведзены вышэй прыклад створыць часовы файл з імем «abc.tmp» і выдаліць яго, калі праграма завяршаецца або завяршаецца.

2
дададзена

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

0
дададзена
Не, ён будзе выдалены толькі на выхадзе, калі вы адмыслова выклікаць deleteOnExit()
дададзена аўтар Ian Roberts, крыніца

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

0
дададзена
Не, ён будзе выдалены толькі на выхадзе, калі вы адмыслова выклікаць deleteOnExit()
дададзена аўтар Ian Roberts, крыніца

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

0
дададзена
Не, ён будзе выдалены толькі на выхадзе, калі вы адмыслова выклікаць deleteOnExit()
дададзена аўтар Ian Roberts, крыніца

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

0
дададзена
Не, ён будзе выдалены толькі на выхадзе, калі вы адмыслова выклікаць deleteOnExit()
дададзена аўтар Ian Roberts, крыніца