অ্যাপ অভ্যন্তরীণ স্টোরেজ হল ডিভাইসের একটি উত্সর্গীকৃত স্থান যা বিচ্ছিন্ন স্টোরেজের মাধ্যমে শুধুমাত্র একটি নির্দিষ্ট অ্যাপ্লিকেশনের জন্য অ্যাক্সেসযোগ্য। Android Developers, 2026 অনুযায়ী, প্রতিটি অ্যাপ্লিকেশন তার নিজস্ব স্যান্ডবক্স ডিরেক্টরি পায় যাতে অন্যান্য অ্যাপ্লিকেশনগুলির সরাসরি অ্যাক্সেস নেই। এই পদ্ধতি অননুমোদিত পড়া থেকে ডেটা রক্ষা করে এবং মোবাইল ডিভাইসের মাল্টিটাস্কিং পরিবেশে স্থিতিশীল অপারেশন নিশ্চিত করে।
মূল পয়েন্ট
Context.getFilesDir(), getCacheDir() এবং getDataDir() প্রদান করেNSDocumentDirectory এবং NSCachesDirectory ব্যবহার করেঅ্যাপ অভ্যন্তরীণ স্টোরেজ হল একটি বিচ্ছিন্ন ডিরেক্টরি যা অপারেটিং সিস্টেম ইনস্টলেশনের সময় প্রতিটি অ্যাপ্লিকেশনকে বরাদ্দ করে। অন্যান্য অ্যাপ্লিকেশন এবং ব্যবহারকারী স্ট্যান্ডার্ড ফাইল ম্যানেজারের মাধ্যমে এই ডিরেক্টরিতে অ্যাক্সেস করতে পারে না। সিস্টেম গ্যারান্টি দেয় যে এই ডিরেক্টরির ভিতরের সমস্ত ডেটা অ্যাপ্লিকেশন আনইনস্টল করার সময় সম্পূর্ণরূপে মুছে ফেলা হবে। এই পদ্ধতি মোবাইল অপারেটিং সিস্টেম নিরাপত্তা মডেলের ভিত্তি তৈরি করে, প্রোগ্রামগুলির মধ্যে গোপনীয় তথ্য ফাঁস রোধ করে।
বাহ্যিক স্টোরেজ (SD কার্ড) থেকে ভিন্ন, অভ্যন্তরীণ স্টোরেজ সর্বদা উপলব্ধ এবং মিডিয়ার উপস্থিতি পরীক্ষা করার প্রয়োজন হয় না। আধুনিক ডিভাইসে NAND ফ্ল্যাশ মেমরিতে পড়া এবং লেখার গতি 800–900 MB/s অনুক্রমিক পঠন এবং 200–300 MB/s অনুক্রমিক লেখায় পৌঁছায়, যা SATA SSD-এর সাথে তুলনীয়। বরাদ্দকৃত এলাকার আকার ডিভাইসের মোট ক্ষমতা এবং প্রস্তুতকারকের নীতির উপর নির্ভর করে: 64 GB ফ্ল্যাশ মেমরি বিশিষ্ট ডিভাইসে, অ্যাপ প্রয়োজন অনুসারে সম্প্রসারণের সম্ভাবনা সহ 16 থেকে 64 MB প্রাথমিক স্থান পায়।
অভ্যন্তরীণ স্টোরেজ আর্কিটেকচার Android এবং iOS-এর মধ্যে ভিন্ন। Android-এ, প্রতিটি অ্যাপ্লিকেশন একটি /data/data/<package_name>/ ডিরেক্টরি পায়, যার ভিতরে সিস্টেম files/, cache/ এবং databases/ উপডিরেক্টরি তৈরি করে। iOS-এ, অ্যাপ্লিকেশন Documents/, Library/ এবং tmp/ ডিরেক্টরি সহ একটি স্যান্ডবক্স কনটেইনারে কাজ করে, যার প্রতিটির নিজস্ব উদ্দেশ্য এবং ব্যাকআপ নীতি রয়েছে।
ডেভেলপারদের অ্যাপ অভ্যন্তরীণ স্টোরেজে ডেটা সংরক্ষণের বিভিন্ন পদ্ধতি উপলব্ধ। প্রতিটি পদ্ধতি একটি নির্দিষ্ট কাজ সমাধান করে এবং একটি নির্দিষ্ট ধরণের ডেটার জন্য উপযুক্ত। সঠিক পদ্ধতি বেছে নেওয়া সরাসরি অ্যাপ্লিকেশনের কর্মক্ষমতা, ডেভেলপমেন্টের সুবিধা এবং ব্যবহারকারী ডেটা নিরাপত্তাকে প্রভাবিত করে।
সর্বনিম্ন স্তরের পদ্ধতি হল ফাইল ডিরেক্টরিতে সরাসরি ফাইল লেখা। একটি অ্যাপ তার স্যান্ডবক্সের ভিতরে যে কোনও ফাইল এবং ডিরেক্টরি তৈরি করতে পারে। এই পদ্ধতি মিডিয়া ফাইল, ব্যবহারকারীর নথি এবং যেকোনো বাইনারি ডেটা সংরক্ষণের জন্য উপযুক্ত যার কাঠামোবদ্ধ সংগঠনের প্রয়োজন নেই। Android-এ, Context.getFilesDir() কলের মাধ্যমে ডিরেক্টরি অ্যাক্সেস করা হয়, যা অ্যাপের ফাইল ডিরেক্টরির সম্পূর্ণ পাথ ফেরত দেয়। iOS-এ, NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) ফাংশন একই উদ্দেশ্য পূরণ করে।
কী-মান জোড়া সংরক্ষণের জন্য, Android SharedPreferences এবং Kotlin কোরুটিন এবং প্রোটোবফ প্রোটোকলের উপর ভিত্তি করে আরও আধুনিক DataStore প্রদান করে। SharedPreferences /data/data/<package>/shared_prefs/ ডিরেক্টরির ভিতরে XML ফাইলে ডেটা সংরক্ষণ করে। সরলতা সত্ত্বেও, SharedPreferences-এর ত্রুটি রয়েছে: সিঙ্ক্রোনাস লেখা UI থ্রেডে বিলম্ব ঘটাতে পারে এবং টাইপ নিরাপত্তার অভাব ত্রুটির ঝুঁকি বাড়ায়। DataStore Flow-ভিত্তিক অ্যাসিঙ্ক্রোনাস API এবং protobuf স্কিমার মাধ্যমে সম্পূর্ণ টাইপ সমর্থন প্রদান করে এই সমস্যাগুলি সমাধান করে।
রিলেশনাল সংযোগ সহ কাঠামোবদ্ধ ডেটার জন্য, SQLite বা Room র্যাপার সর্বোত্তম পছন্দ। ডেটাবেস databases/ ডিরেক্টরির ভিতরে একটি ফাইলে সংরক্ষিত হয় এবং সম্পূর্ণ SQL সিনট্যাক্স সমর্থন করে। Room একটি অফিসিয়াল Jetpack লাইব্রেরি যা টাইপ-নিরাপদ API, স্বয়ংক্রিয় স্কিমা মাইগ্রেশন এবং কোরুটিন সমর্থন প্রদান করে। সঠিক ইনডেক্সিংয়ের সাথে ডেটাবেসের আকার উল্লেখযোগ্য কর্মক্ষমতা ক্ষতি ছাড়াই কয়েক গিগাবাইট পর্যন্ত পৌঁছাতে পারে। মোবাইল ডিভাইসে SQLite একটি আধুনিক ফ্ল্যাগশিপ প্রসেসরে প্রতি সেকেন্ডে 50,000 লেখার অপারেশন পর্যন্ত পরিচালনা করে।
গোপনীয় ডেটা যেমন প্রমাণীকরণ টোকেন এবং এনক্রিপশন কী সংরক্ষণের জন্য, Android EncryptedSharedPreferences প্রদান করে। স্ট্যান্ডার্ড SharedPreferences-এর উপর এই র্যাপারটি AES256-GCM-None ব্যবহার করে কী এবং মান স্বয়ংক্রিয়ভাবে এনক্রিপ্ট করে। ডিস্কে লেখার আগে ফাইল স্তরে এনক্রিপশন করা হয়, তাই ডিভাইসে শারীরিক অ্যাক্সেস থাকলেও, আক্রমণকারী বিষয়বস্তু পড়তে পারে না। EncryptedSharedPreferences AndroidX Security লাইব্রেরির অংশ, যাতে সম্পূর্ণ ফাইল এনক্রিপ্ট করার জন্য EncryptedFile-ও অন্তর্ভুক্ত রয়েছে।
Android SDK Context ক্লাসের মাধ্যমে অভ্যন্তরীণ স্টোরেজের সাথে কাজ করার জন্য পদ্ধতির একটি সেট প্রদান করে। প্রতিটি পদ্ধতি অ্যাপ স্যান্ডবক্সের ভিতরে একটি নির্দিষ্ট সিস্টেম ডিরেক্টরির পাথ ফেরত দেয়। আসুন Kotlin উদাহরণ ব্যবহার করে বেসিক ফাইল লেখা এবং পড়ার অপারেশনগুলি দেখি।
অভ্যন্তরীণ ফাইল ডিরেক্টরির পাথ পাওয়ার প্রধান পদ্ধতি হল context.filesDir। এটি একটি File অবজেক্ট ফেরত দেয় যা /data/data/<package>/files/ ডিরেক্টরির দিকে নির্দেশ করে। প্রথম অ্যাক্সেসে, সিস্টেম স্বয়ংক্রিয়ভাবে সমস্ত প্রয়োজনীয় প্যারেন্ট ডিরেক্টরি তৈরি করে। অভ্যন্তরীণ স্টোরেজে ফাইলের আকার স্পষ্টভাবে সীমাবদ্ধ নয়, তবে ডেটার মোট পরিমাণ /data পার্টিশনে উপলব্ধ স্থানের বেশি হওয়া উচিত নয়, যা সাধারণত মোট ফ্ল্যাশ মেমরি ক্ষমতার 60–80% হয়।
val context = getApplicationContext()
val file = File(context.filesDir, "notes.txt")
file.writeText("নোটের বিষয়বস্তু")
val content = file.readText()
println("পড়া হয়েছে: $content")
writeText এবং readText পদ্ধতিগুলি Kotlin স্ট্যান্ডার্ড লাইব্রেরির এক্সটেনশন ফাংশন। এগুলি স্বয়ংক্রিয়ভাবে স্ট্রিম খোলা এবং বন্ধ করা পরিচালনা করে, যা মেমরি লিক প্রতিরোধ করে। বাইনারি ডেটার জন্য, writeBytes এবং readBytes ব্যবহার করুন, যার এনকোডিংয়ের প্রয়োজন নেই এবং ByteArray অ্যারে নিয়ে কাজ করে। বড় ফাইলের সাথে কাজ করার সময়, বাফারড স্ট্রিম ব্যবহার করার পরামর্শ দেওয়া হয়: টেক্সটের জন্য BufferedReader এবং BufferedWriter, বাইনারি ডেটার জন্য BufferedInputStream এবং BufferedOutputStream।
ফাইলগুলিকে একটি শ্রেণিবিন্যাসে সংগঠিত করতে, filesDir-এর ভিতরে উপডিরেক্টরি তৈরি করুন। এটি ডেটাকে প্রকার অনুসারে কাঠামোবদ্ধ করতে সহায়তা করে: ছবি, নথি, এক্সপোর্ট ফাইল। mkdirs() পদ্ধতি পাথে সমস্ত অনুপস্থিত ডিরেক্টরি তৈরি করে, যার মধ্যে নেস্টেড ডিরেক্টরিও রয়েছে। নিশ্চিত করুন যে তৈরি অপারেশন সফল হয়েছে — পদ্ধতি শুধুমাত্র নতুন ডিরেক্টরি তৈরি হলে true ফেরত দেয়। তৈরি ব্যর্থতা প্রায়শই /data পার্টিশনে অপর্যাপ্ত স্থান বা ফাইল সিস্টেম ইনোড শেষ হওয়ার সাথে সম্পর্কিত।
val imagesDir = File(context.filesDir, "images")
if (imagesDir.mkdirs()) {
println("ডিরেক্টরি তৈরি করা হয়েছে")
}
val imageFile = File(imagesDir, "photo.jpg")
imageFile.writeBytes(byteArray)
বড় ফাইল লেখার আগে উপলব্ধ স্থান পরীক্ষা করতে, File.getFreeSpace() বা File.getUsableSpace() ব্যবহার করুন। দ্বিতীয় পদ্ধতি নিরাপত্তা কোটা বিবেচনা করে বর্তমান অ্যাপ্লিকেশনের জন্য উপলব্ধ বাইটের সংখ্যা ফেরত দেয় — এটি বহু-ব্যবহারকারী ডিভাইসের প্রসঙ্গে আরও নির্ভুল। উপলব্ধ স্থান প্রত্যাশিত ফাইলের আকারের চেয়ে কম হলে, ব্যবহারকারীকে একটি বার্তা দেখান এবং ডিভাইস সেটিংসে স্থান খালি করার পরামর্শ দিন।
iOS-এ, প্রতিটি অ্যাপ্লিকেশন একটি বিচ্ছিন্ন স্যান্ডবক্স কনটেইনারে কাজ করে। সিস্টেম বিশেষ entitlements ছাড়া এর সীমানার বাইরে যাওয়ার জন্য API প্রদান করে না। ফাইল সিস্টেমের সাথে কাজ করার প্রধান টুল হল Foundation ফ্রেমওয়ার্কের FileManager ক্লাস। স্যান্ডবক্স কনটেইনারে বেশ কয়েকটি স্ট্যান্ডার্ড ডিরেক্টরি অন্তর্ভুক্ত রয়েছে, যার প্রতিটির নিজস্ব ব্যাকআপ নীতি রয়েছে।
Documents ডিরেক্টরিটি ব্যবহারকারী ডেটার জন্য যেটি অ্যাপ্লিকেশন চালু হওয়ার মধ্যে সংরক্ষিত থাকা উচিত এবং ব্যাকআপ থেকে পুনরুদ্ধার করা উচিত। iOS স্বয়ংক্রিয়ভাবে এই ডিরেক্টরিটিকে iCloud এবং iTunes ব্যাকআপে অন্তর্ভুক্ত করে। urls(for:in:) পদ্ধতি অনুরোধ করা ডিরেক্টরির URL-এর একটি অ্যারে ফেরত দেয় — অ্যারেতে প্রথম উপাদানটি প্রাথমিক।
let fm = FileManager.default
let docs = fm.urls(
for: .documentDirectory,
in: .userDomainMask
).first!
let fileURL = docs.appendingPathComponent("data.plist")
try data.write(to: fileURL)
FileManager ফাইল অপারেশনের একটি সম্পূর্ণ সেট সমর্থন করে: ফাইল তৈরি, কপি, সরানো, মুছে ফেলা এবং নাম পরিবর্তন করা। প্রতিটি অপারেশন ত্রুটি ছুঁড়তে পারে, তাই সমস্ত কলকে do-catch কনস্ট্রাক্টে মোড়ানো আবশ্যক। ফাইল মুছে ফেলার ক্ষেত্রে বিশেষ মনোযোগ দিন — অপারেশনটি অপরিবর্তনীয়, এবং removeItem(at:)-এর পরে ডেটা পুনরুদ্ধার করা পূর্ববর্তী ব্যাকআপ ছাড়া অসম্ভব।
স্যান্ডবক্স কনটেইনারের সমস্ত ডেটা iCloud ব্যাকআপে অন্তর্ভুক্ত করা উচিত নয়। উদাহরণস্বরূপ, ডাউনলোড করা ক্যাশ করা ছবি বা অস্থায়ী প্রক্রিয়াকরণ ফাইলগুলি পুনরুদ্ধার করার প্রয়োজন নেই — এগুলি পরবর্তী ব্যবহারে পুনরায় তৈরি হবে। ব্যাকআপ থেকে একটি ডিরেক্টরি বা ফাইল বাদ দিতে, isExcludedFromBackup অ্যাট্রিবিউট true-এ সেট করুন। Apple সুপারিশ করে যে দূরবর্তীভাবে পুনরুদ্ধার করা যেতে পারে এমন ডেটা সর্বদা ব্যাকআপ থেকে বাদ দিন, iCloud স্টোরেজ ব্যবহার কমাতে এবং পুনরুদ্ধারের সময় কমাতে।
var cacheURL = fm.urls(
for: .cachesDirectory,
in: .userDomainMask
).first!
cacheURL.hasExcludedFromBackupKey = true
var values = URLResourceValues()
values.isExcludedFromBackup = true
try cacheURL.setResourceValues(values)
মোবাইল ডিভাইসে প্রতিটি স্টোরেজ প্রকারের নিজস্ব উদ্দেশ্য এবং ব্যবহারের নিয়ম রয়েছে। এই পার্থক্যগুলি বোঝা ডেভেলপারকে প্রতিটি ধরণের ডেটার জন্য সঠিক স্থান চয়ন করতে সহায়তা করে। নীচে অ্যাপ্লিকেশনের জন্য উপলব্ধ তিনটি প্রধান স্টোরেজ প্রকারের তুলনা দেওয়া হল।
| বৈশিষ্ট্য | Internal Storage | ক্যাশ ডিরেক্টরি | External Storage |
|---|---|---|---|
| অন্যান্য অ্যাপে দৃশ্যমানতা | লুকানো | লুকানো | অ্যাক্সেসযোগ্য |
| অ্যাপ আনইনস্টলে মুছে ফেলা | সম্পূর্ণ | সম্পূর্ণ | অবস্থানের উপর নির্ভর করে |
| ব্যাকআপ | Android — না, iOS — হ্যাঁ (Documents) | না | শুধুমাত্র সিঙ্ক করার সময় |
| মিডিয়া ছাড়া উপলব্ধতা | সর্বদা | সর্বদা | SD কার্ড প্রয়োজন |
| ডেটা হারানোর ঝুঁকি | সর্বনিম্ন | উচ্চ | মাঝারি |
| প্রস্তাবিত ফাইলের আকার | 100 MB পর্যন্ত | 50 MB পর্যন্ত | যেকোনো |
অভ্যন্তরীণ স্টোরেজ অ্যাপ কনফিগারেশন, ডেটাবেস ফাইল এবং ব্যবহারকারীর নথি সংরক্ষণের জন্য সবচেয়ে উপযুক্ত যা অন্যান্য প্রোগ্রামের জন্য অ্যাক্সেসযোগ্য হওয়া উচিত নয়। ক্যাশ ডিরেক্টরি অস্থায়ী ফাইলগুলির জন্য যা পরবর্তী ব্যবহারে পুনরায় তৈরি করা যেতে পারে: ডাউনলোড করা ছবি, API প্রতিক্রিয়া, মধ্যবর্তী প্রক্রিয়াকরণ ডেটা। বাহ্যিক স্টোরেজ বড় মিডিয়া ফাইল (ফটো, ভিডিও, সঙ্গীত) এবং ব্যবহারকারী অন্যান্য অ্যাপ্লিকেশনের সাথে ভাগ করে নিতে চায় এমন ডেটার জন্য সবচেয়ে উপযুক্ত।
স্টোরেজ প্রকার নির্বাচন Google Play এবং App Store-এ অ্যাপ রেটিংকেও প্রভাবিত করে। যে অ্যাপগুলি পরিষ্কার না করে অভ্যন্তরীণ স্টোরেজে প্রচুর পরিমাণে ডেটা সঞ্চয় করে, তারা নেতিবাচক পর্যালোচনা পায়: ব্যবহারকারীরা স্থানের অভাবের অভিযোগ করেন। App Annie-এর একটি গবেষণা অনুসারে, 62% ব্যবহারকারী একটি অ্যাপ মুছে ফেলেন যদি এটি পরিষ্কার করার বিকল্প ছাড়াই ডিভাইসের অভ্যন্তরীণ স্টোরেজের 500 MB-এর বেশি নেয়।
অ্যাপ অভ্যন্তরীণ স্টোরেজের সঠিক ব্যবস্থাপনা কর্মক্ষমতা, নিরাপত্তা এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করে। নিম্নলিখিত সুপারিশগুলি অফিসিয়াল Android এবং iOS ডকুমেন্টেশন, পাশাপাশি লক্ষ লক্ষ ইনস্টল সহ অ্যাপ্লিকেশন বিকাশের ব্যবহারিক অভিজ্ঞতার উপর ভিত্তি করে।
সীমান্ত ক্ষেত্রের পরীক্ষায় বিশেষ মনোযোগ দেওয়া উচিত। অভ্যন্তরীণ স্টোরেজ পূর্ণ হলে, লেখার অপারেশন অপ্রত্যাশিতভাবে বাধাগ্রস্ত হলে (অ্যাপ ক্র্যাশ, ইনকামিং কল), এবং iOS ব্যাকআপ থেকে পুনরুদ্ধার করার সময় অ্যাপ্লিকেশনের আচরণ পরীক্ষা করুন। এই প্রতিটি পরিস্থিতিতে, ডেটা সামঞ্জস্যপূর্ণ থাকা উচিত বা শেষ স্থিতিশীল অবস্থায় পুনরুদ্ধার করা উচিত। লেনদেন ফাইল ব্যবহার করুন: একটি অস্থায়ী ফাইলে ডেটা লিখুন, তারপর এটি পারমাণবিকভাবে লক্ষ্যে নাম পরিবর্তন করুন। এটি লেখা ব্যর্থ হলে দূষিত ডেটা পড়া প্রতিরোধ করে।
ব্যবহারকারী নিয়ন্ত্রণ সম্পর্কে ভুলবেন না। অ্যাপ সেটিংসে অস্থায়ী ডেটা পরিষ্কার করার এবং দখলকৃত অভ্যন্তরীণ স্টোরেজ ভলিউম প্রদর্শনের বিকল্প প্রদান করুন। Google Play Console অনুসারে, এই বৈশিষ্ট্যযুক্ত অ্যাপগুলি “কর্মক্ষমতা” বিভাগে 18% বেশি ইতিবাচক পর্যালোচনা পায়।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
অ্যাপের অভ্যন্তরীণ স্টোরেজ থেকে সমস্ত ডেটা সম্পূর্ণরূপে মুছে ফেলা হয়। অপারেটিং সিস্টেম ডেটাবেস, সেটিংস এবং অস্থায়ী ফাইল সহ অবশিষ্ট ফাইলের অনুপস্থিতির গ্যারান্টি দেয়। বাহ্যিক স্টোরেজের ডেটা থাকতে পারে।
ডিভাইসে রুট অ্যাক্সেস ছাড়া, অন্যান্য অ্যাপ অন্য অ্যাপের Internal Storage থেকে ফাইল পড়তে পারে না। Android-এ, এর জন্য সুপারইউজার বিশেষাধিকার প্রয়োজন, যখন iOS-এ, স্যান্ডবক্সের মাধ্যমে কার্নেল স্তরে বিচ্ছিন্নতা প্রয়োগ করা হয়।
কোনও স্পষ্ট সীমা নেই, তবে মোট পরিমাণ /data পার্টিশনে উপলব্ধ স্থান দ্বারা সীমাবদ্ধ। প্রতি অ্যাপ্লিকেশনে 100 MB-এর বেশি না রাখার পরামর্শ দেওয়া হয় — বড় ভলিউম বাহ্যিক স্টোরেজ বা ক্লাউডে রাখা ভাল।
filesDir স্থায়ী অ্যাপ ডেটার জন্য এবং সিস্টেম এটি প্রয়োজন হলেই মুছে ফেলে। cacheDir অস্থায়ী ফাইলগুলির জন্য যা সিস্টেম মেমরি কম হলে মুছে ফেলতে পারে। সিস্টেম cacheDir-এর স্থায়িত্বের গ্যারান্টি দেয় না।
Internal Storage থেকে SD কার্ডে সরাসরি অনুলিপি নিরাপত্তা নীতি দ্বারা নিষিদ্ধ। ব্যবহারকারীর সম্মতিতে শেয়ার্ড স্টোরেজে ডেটার কপি তৈরি করতে Android 10+ এ MediaStore API বা SAF (Storage Access Framework) ব্যবহার করুন।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন