জাভা অস্থায়ী ফাইলগুলি কখন মুছে ফেলা হয়?


92

ধরুন আমি পদ্ধতিটি দিয়ে জাভাতে একটি অস্থায়ী ফাইল তৈরি করি

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

আমি যদি delete()পদ্ধতিটিতে কল্পনা না করি তবে ফাইলটি কখন মুছে যাবে?

অন্তর্দৃষ্টি হিসাবে, এটি হতে পারে যখন জেভিএম সমাপ্ত হয়, বা এর আগে (আবর্জনা সংগ্রাহক দ্বারা), বা পরে (কোনও কোনও অপারেটিং সিস্টেম স্যুইপিং প্রক্রিয়া দ্বারা)।



আমার ক্ষমাপ্রার্থী, আমি কেবল ডকস.অরাকল.com / জাভাস / //docs / api / java / io /… পদ্ধতিটি পরীক্ষা করেছিলাম , যা উত্তর সরবরাহ করে না। দীর্ঘ বিবরণটি কেবল দীর্ঘতর স্বাক্ষর সহ পদ্ধতিতে উপস্থিত রয়েছে।
আলফাআ

উত্তর:


95

ফাইলটি জাভডোক থেকে স্বয়ংক্রিয়ভাবে মুছে ফেলা হবে না :

এই পদ্ধতিটি অস্থায়ী-ফাইল সুবিধার একমাত্র অংশ সরবরাহ করে। এই পদ্ধতি দ্বারা তৈরি করা কোনও ফাইল স্বয়ংক্রিয়ভাবে মোছার ব্যবস্থা করার জন্য, মুছুন অনিঅ্যাক্সিট () পদ্ধতিটি।

সুতরাং আপনাকে স্পষ্টভাবে ডিলিটঅনএক্সিট () কল করতে হবে :

ভার্চুয়াল মেশিন বন্ধ হয়ে গেলে এই বিমূর্ত পথের নাম দ্বারা চিহ্নিত ফাইল বা ডিরেক্টরি মুছে ফেলা হবে Requ


4
এবং যদি ডিলিটঅনএক্সিট ব্যবহার করা হয়, তবে ভার্চুয়াল মেশিনটি বন্ধ হয়ে গেলে "মুছে ফেলা হবে Files ফাইলগুলি (বা ডিরেক্টরিগুলি) নিবন্ধিত হয়েছে এমন বিপরীত ক্রমে মুছে ফেলা হয় dele প্রভাব। জাভা ভাষা নির্দিষ্টকরণ দ্বারা সংজ্ঞায়িত হিসাবে, ভার্চুয়াল মেশিনের সাধারণ সমাপ্তির জন্য মোছার চেষ্টা করা হবে। সুতরাং এটি সমস্ত জেভিএম বিদ্যমান থাকা অবস্থায়ও মুছে ফেলা হয় না।
eis

ধন্যবাদ, আমি কেবল পদ্ধতিটি ডকস.অরাকল.com / জাভাসে / //docs / api / java / io/… পরীক্ষা করেছি , যা উত্তর সরবরাহ করে না। দীর্ঘ বিবরণটি কেবল দীর্ঘতর স্বাক্ষর সহ পদ্ধতিতে উপস্থিত রয়েছে
আলফায়া

52

অন্যান্য উত্তর নোট হিসাবে, সঙ্গে তৈরি করা অস্থায়ী ফাইল File.createTempFile()হবে না আপনা থেকেই মুছে দেওয়া যদি না আপনি স্পষ্টভাবে এটি অনুরোধ।

এটি করার জেনেরিক, বহনযোগ্য উপায় হ'ল অবজেক্টে কল .deleteOnExit()করা File, যা জেভিএম সমাপ্ত হওয়ার পরে ফাইলটি মোছার জন্য নির্ধারিত করে। তবে এই পদ্ধতির সামান্য অসুবিধাটি হ'ল এটি কেবলমাত্র তখনই কাজ করে যদি ভিএম স্বাভাবিকভাবে বন্ধ হয়; অস্বাভাবিক সমাপ্তি (যেমন একটি ভিএম ক্র্যাশ বা ভিএম প্রক্রিয়া জোর করে সমাপ্তকরণ) এ, ফাইলটি মুছে ফেলা হতে পারে।

ইউনিক্সিশ সিস্টেমে (যেমন লিনাক্স) অস্থায়ী ফাইলটি খোলার সাথে সাথেই মুছে ফেলার মাধ্যমে এটি আরও কিছুটা নির্ভরযোগ্য সমাধান পাওয়া সম্ভব । এটি কাজ করে কারণ ইউনিক্স ফাইল সিস্টেমগুলি এখনও কোনও এক বা একাধিক প্রক্রিয়া দ্বারা উন্মুক্ত থাকা অবস্থায় কোনও ফাইল মুছে ফেলার অনুমতি দেয় ( লিঙ্কযুক্ত , সুনির্দিষ্ট হতে)। এই জাতীয় ফাইলগুলি খোলা ফাইলহ্যান্ডেলের মাধ্যমে সাধারণত অ্যাক্সেস করা যায় এবং তারা ডিস্কে যে স্থানটি দখল করে থাকে কেবলমাত্র ওএস দ্বারা ফাইলটি উন্মুক্ত হ্যান্ডেলটি ধারণ করার পরে ফাইলটি পুনরুদ্ধার করতে পারে।

সুতরাং প্রোগ্রামটি প্রস্থান করার পরে একটি অস্থায়ী ফাইল সঠিকভাবে মুছে ফেলা হবে তা নিশ্চিত করার জন্য আমি এখানে সবচেয়ে নির্ভরযোগ্য এবং বহনযোগ্য উপায়:

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.

উইন্ডোজে, আউটপুটটি কিছুটা পৃথক দেখাচ্ছে:

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 এ এই কোড পরীক্ষা করার সময় আমি বরং একটি বিস্ময়কর সত্য বলেছিলেন: দৃশ্যতঃ নিছক টেম্প ফাইল বন্ধ না এটি মুছে ফেলা হচ্ছে থেকে রাখার যথেষ্ট যাব । অবশ্যই এটিরও অর্থ হ'ল টেম্প ফাইল ব্যবহারের সময় ঘটে যাওয়া যে কোনও ক্র্যাশ ঘটলে তা মুছে ফেলা হবে না, যা আমরা এখানে এড়াতে চাইছি ।

আফাইক, এড়াতে একমাত্র উপায় হ'ল টেম্প ফাইলটি সর্বদা একটি finallyব্লক ব্যবহার করে বন্ধ হয়ে যায় তা নিশ্চিত করা । অবশ্যই, তারপরে আপনি একই finallyব্লকের ফাইলটিও মুছতে পারেন । আমি নিশ্চিত নই কি, যদি কিছু থাকে .deleteOnExit()তবে আসলে এটি আপনাকে লাভ করবে।


4
দুর্দান্ত উত্তর। আরেকটি গুরুত্বপূর্ণ বিষয় লক্ষনীয় deleteOnExit(), এটি হ'ল যদি এটি ঘন ঘন বলা হয় (বলুন যে সিস্টেমে প্রচুর নতুন অস্থায়ী ফাইল ব্যবহৃত হয়) তবে এটি সম্ভবত একটি স্মৃতি ফাঁস হতে পারে (যেহেতু এটি অবশ্যই প্রয়োজনীয় সমস্ত পাথ মুখস্ত করতে হবে) মোছা হয়েছে)।
আইয়াল রথ

18

আমি যদি delete()পদ্ধতিটিতে কল্পনা না করি তবে ফাইলটি কখন মুছে যাবে?

এটি হবে না, অন্তত জাভা দ্বারা না। আপনি যদি জেভিএম বন্ধ হয়ে যাওয়ার পরে ফাইলটি মুছতে চান তবে আপনাকে কল করতে হবে tmp.deleteOnExit()


5

থেকে: জাভাতে অস্থায়ী ফাইলটি কীভাবে মুছবেন

অস্থায়ী ফাইলটি কম গুরুত্বপূর্ণ এবং অস্থায়ী ডেটা সঞ্চয় করতে ব্যবহৃত হয়, যা আপনার সিস্টেমটি সমাপ্ত হওয়ার পরে সর্বদা মুছে ফেলা উচিত । এটি করার জন্য সেরা অনুশীলন হ'ল ফাইল.ডিলেটঅনএক্সিট () ব্যবহার করুন।

উদাহরণ স্বরূপ,

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

উপরের উদাহরণটি "abc.tmp" নামে একটি অস্থায়ী ফাইল তৈরি করবে এবং প্রোগ্রামটি শেষ হয়ে গেলে বা প্রস্থান করার সময় এটি মুছবে

আপনি যদি অস্থায়ী ফাইলটি ম্যানুয়ালি মুছতে চান তবে আপনি এখনও ফাইল.ডিলেট () ব্যবহার করতে পারেন।


কেন এই সেরা অনুশীলন?
ফ্রান্স 18

3

অস্থায়ী ফাইলটি কম গুরুত্বপূর্ণ এবং অস্থায়ী ডেটা সঞ্চয় করতে ব্যবহৃত হয়, যা আপনার সিস্টেমটি সমাপ্ত হওয়ার পরে সর্বদা মুছে ফেলা উচিত। এটি করার জন্য সেরা অনুশীলন হ'ল ফাইল.ডিলেটঅনএক্সিট () ব্যবহার করুন।

উদাহরণ স্বরূপ,

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

উপরের উদাহরণটি "abc.tmp" নামে একটি অস্থায়ী ফাইল তৈরি করবে এবং প্রোগ্রামটি শেষ হয়ে গেলে বা প্রস্থান করার সময় এটি মুছবে।


-3

আপনি চাইলে প্রক্রিয়াটি শেষ করার আগে নিজে নিজে ফাইলটি মুছতে পারেন, তবে প্রক্রিয়াটি শেষ হয়ে গেলে ফাইলটিও মুছে ফেলা হবে।


4
না, আপনি কেবলমাত্র কল করলে এটি প্রস্থান করার সময় মুছে ফেলা হবেdeleteOnExit()
আয়ান রবার্টস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.