অন্যান্য উত্তর নোট হিসাবে, সঙ্গে তৈরি করা অস্থায়ী ফাইল 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 {
File temp = File.createTempFile("tempfiletest", ".tmp");
String path = temp.getAbsolutePath();
System.err.println("Temp file created: " + path);
RandomAccessFile fh = new RandomAccessFile (temp, "rw");
System.err.println("Temp file opened for random access.");
boolean deleted = false;
try {
deleted = temp.delete();
} catch (SecurityException e) {
}
if (deleted) {
System.err.println("Temp file deleted.");
} else {
temp.deleteOnExit();
System.err.println("Temp file scheduled for deletion.");
}
try {
String str = "A quick brown fox jumps over the lazy dog.";
fh.writeUTF(str);
System.err.println("Wrote: " + str);
fh.seek(0);
String out = fh.readUTF();
System.err.println("Read: " + out);
} finally {
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()
তবে আসলে এটি আপনাকে লাভ করবে।