file storage

এই পর্বে আমরা দেখবো ফাইল স্টোরেজ এর মাধ্যমে কিভাবে আমাদের এপের ডাটা ইউজার এর ফোনে সেভ করে রাখতে পারি । ইউজার এর ফোনে সাধারনত দুই ধরনের মেমোরি থাকে । একটি হল ফোনের ইন বিল্ড মেমোরি অন্যটি হল SD কার্ড যেটি ইউজার এর ফোনে আলাদা ভাবে ইউজার সেট করে । তো এই পর্বে আমরা শিখবো ইউজার এর ফোনের ইন বিল্ড মেমোরিতে কিভাবে ডাটা সেভ করতে হয় ।

তো চলুন শুরু করা যাক । আমরা এই প্রোজেক্ট এর মাধ্যমে ইউজার এর ফোনে একটি নাম এবং একটি ম্যাসেজ সেভ করে রাখবো । আমাদের এপের ইউজার ইন্টারফেসটা দেখতে এরকম হবে -

১ম বক্সে ইউজার ম্যাসেজ লিখবে এবং পরের বক্সে তার নাম । Save Data বাটনে ক্লিক করলে তার নাম এবং ম্যাসেজ তার ফোনের মেমোরিতেই সেভ করে রাখবো । এরপর ইউজার Load Data বাটনে ক্লিক করলে সেই ডাটাগুলো রিড করে নিচের কমলা কালার বক্সে দেখাবো । তো ডিজাইন টা করা যাক ।

activity_main.xml -

 <?xml version="1.0" encoding="utf-8"?>  
 <LinearLayout  
   xmlns:android="http://schemas.android.com/apk/res/android"  
   xmlns:app="http://schemas.android.com/apk/res-auto"  
   xmlns:tools="http://schemas.android.com/tools"  
   android:layout_width="match_parent"  
   android:layout_height="match_parent"  
   android:orientation="vertical"  
   android:id="@+id/backGround"  
   android:padding="7dp"  
   tools:context=".MainActivity"  
   android:gravity="center"  
   android:background="@android:color/holo_orange_light">  
   <EditText  
     android:id="@+id/messageET"  
     android:layout_width="match_parent"  
     android:layout_height="wrap_content"  
     android:padding="50dp"  
     android:background="@android:color/white"/>  
   <EditText  
     android:id="@+id/nameET"  
     android:layout_width="match_parent"  
     android:layout_height="wrap_content"  
     android:padding="10dp"  
     android:layout_marginTop="5dp"  
     android:hint="Enter Your Name"  
     android:gravity="center"  
     android:background="@android:color/white"/>  
   <Button  
     android:layout_width="wrap_content"  
     android:layout_height="wrap_content"  
     android:layout_gravity="center"  
     android:text="Save Data"  
     android:textAllCaps="false"  
     android:textSize="17sp"  
     android:background="@android:color/holo_green_dark"  
     android:textColor="@android:color/white"  
     android:padding="12dp"  
     android:textStyle="bold"  
     android:onClick="FileStorage"  
     android:layout_margin="10dp"/>  
   <Button  
     android:layout_width="wrap_content"  
     android:layout_height="wrap_content"  
     android:layout_gravity="center"  
     android:text="Load Data"  
     android:background="@android:color/holo_green_dark"  
     android:textColor="@android:color/white"  
     android:textSize="17sp"  
     android:textAllCaps="false"  
     android:textStyle="bold"  
     android:padding="12dp"  
     android:onClick="readData"/>  
   <TextView  
     android:id="@+id/messageTV"  
     android:layout_width="match_parent"  
     android:layout_height="wrap_content"  
     android:padding="30dp"  
     android:background="@android:color/holo_orange_dark"  
     android:layout_marginTop="10dp"/>  
 </LinearLayout>  

ডিজাইনের কাজ শেষ। ডিজাইনের কোন কিছু নাহ বুঝলে দয়া করে শুরুর ব্লগ গুলো পরে আসবেন ।

MainActivity.java -

 public class MainActivity extends AppCompatActivity {  
   EditText messageET,nameET;  
   TextView messageTV;  
   @Override  
   protected void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState);  
     setContentView(R.layout.activity_main);  
     messageET = findViewById(R.id.messageET);  
     nameET = findViewById(R.id.nameET);  
     messageTV = findViewById(R.id.messageTV);  
   }  

এগুলোও আশা করি বুঝে ফেলেছেন ।

এবার বাটন দুটির onClick ম্যাথডের জন্য দুটি ম্যাথড তৈরি করবো । ১ম ম্যাথডের সাহায্যে ডাটা সেভ রাখবো এবং পরের বাটনে ক্লিক করলে সেই ডাটা নিচের টেক্সভিউতে দেখাবে ।

১ম ম্যাথড -

   public void FileStorage(View view) {  
   
     String message = messageET.getText().toString();  
     String name = nameET.getText().toString();  
     message = message+"\n";  
   
     try {  
       FileOutputStream stream = openFileOutput("fileStorage.txt",MODE_PRIVATE);  
       stream.write(message.getBytes());  
       stream.write(name.getBytes());  
       stream.close();  
         
       Toast.makeText(this, "Thank You", Toast.LENGTH_SHORT).show();  
       messageET.setText("");  
       nameET.setText("");  
         
     } catch (FileNotFoundException e) {  
       e.printStackTrace();  
     } catch (IOException e) {  
       e.printStackTrace();  
     }  
   }  

EditText থেকে পাওয়া ডাটা দুটি String ভ্যারিয়েবল এর ভিতরে রেখে দিলাম । এরপর প্রথম ডাটার সাথে একটি নতুন লাইন এড করে দিলাম যাতে TextView তে ডাটা লোড হওয়ার সময় ডাটা দুটি আলাদা লাইনে দেখায় ।

এবার ফাইল খুলে ডাটা সেভ করার জন্য আমাদের যে ক্লাসের সাহায্য নিতে হবে সেটি হল FileOutputStream । এই ক্লাসের অব্জেক্ট তৈরির সময় আমাদের কন্সট্রাক্টর এ দুটি ভ্যালু পাঠাতে হবে । ১ম টি হল ফাইলের নাম এবং পরেরটি ফাইল এর প্রাইভেসি । এবং এই লাইনটি লেখার সময় দেখবেন ইরর দেখাবে কারন কোন কারনে exception ধরা পড়লে যাতে সেটি হ্যান্ডেল করতে পারি আমরা এই জন্য এটি try-catch ব্লগের ভিতরে নিতে হবে ।

এবার যে ফাইল আমরা তৈরি করলাম সেখানে ডাটা ঢুকানোর জন্য  .write ম্যাথডের সাহায্য নিবো । এখানে ফাইলে ডাটা বাইট আকারে সেভ হবে । তাই বাইট এ কনভার্ট করে সেই ফাইলের ভিতরে আমাদের ডাটা দুটি রেখে দিয়ে সেই ফাইলটি ক্লোজ করে দিলাম মানে বন্ধ করে দিলাম। এখানেও বাইট এর জন্যও আমাদের Catch Clause এড করতে হবে ।

এরপর ইউজারকে Toast এর সাহায্যে কনফার্মেশন ম্যাসেজ দিয়ে EditText থেকে লেখাগুলো মুছে দিয়ে ফাকা স্পেস রেখে দিলাম ।

ব্যাস আমরা ইউজার থেকে পাওয়া ডাটা দুটি ইউজার এর ফোন মেমোরিতে সেভ করে রাখলাম । এভাবে আপনার কাছে থাকা ইউজার এর ডাটা ইউজার এর ফোনে সেভ করে রাখতে পারেন ।

এবার আমরা দেখবো ইউজার এর ফোনে থাকা সেই ডাটা কিভাবে আবার এপের ভিতরে নিয়ে আসবো ।

২য় ম্যাথড -

   public void readData(View view) {  
       
     try {  
       FileInputStream inputStream = openFileInput("fileStorage.txt");  
       InputStreamReader reader = new InputStreamReader(inputStream);  
       BufferedReader bufferedReader = new BufferedReader(reader);  
         
       String text;  
       StringBuffer buffer = new StringBuffer();  
   
       while ((text = bufferedReader.readLine())!= null) {  
         buffer.append(text+"\n");  
       }  
         
       messageTV.setText(buffer.toString());  
   
     } catch (FileNotFoundException e) {  
       e.printStackTrace();  
     } catch (IOException e) {  
       e.printStackTrace();  
     }  
   }  

ডাটা সেভ রাখতে আমরা FileOutputStream ক্লাসের সাহায্য নিছিলাম, এবার সেই ফাইল আবার ওপেন করতে FileInputStream ক্লাসের সাহায্য নিতে হবে । সেইম ভাবে আমরা FileInputStream ক্লাসে অব্জেক্ট তৈরি করে আমাদের ফাইলের যে নাম দিছিলাম ঠিক সেই নাম টাই দিতে হবে । এখানেও ফাইল নাহ পাওয়া গেলে যাতে প্রোগ্রাম ক্রাশ নাহ করে তাই try-catch ব্লগের ভিতরে নিতে হবে ।

এবার BufferedReader এর সাহায্যে সেই ডাটা রিড করবো এবং জাভা থেকে আমরা জানি বাফাররিডার এর অব্জেক্ট খুলতে InputStreamReader এর দরকার হয় । ডাটা রিড করার জন্য নতুন একটি স্ট্রিং ভ্যারিয়েবল নিলাম । ডাটা রিড করে এখানে জমা রাখবো । এখন আমরা কতক্ষন ডাটা রিড করবো সেটি লুপের মাধ্যমে বলে দিতে হবে । আমরা চাই সেখানে থাকা সকল ডাটাই ফিরে আসুক । তাই নাল নাহ পাওয়া পর্যন্ত সেই ডাটা রিড হয়ে হয়ে StringBuffer দ্বারা text এর ভিতরে চলে যাবে । StringBuffer ডাটা বারবার পাল্টাতে সাহায্য করে । একই ভ্যারিয়েবল এর ভিতর বার বার ডাটা পাল্টে রাখার জন্য StringBuffer ইউজ করা হয় ।

এবং StringBuffer এ ডাটা এড করতে append ম্যাথড ব্যাবহার করা হয় । এখানে text এর সাথে নতুন লাইন এড করে দিলাম কারন প্রতি লাইন ডাটা রিড করার পর যাতে নতুন একটি লাইন তৈরি হয় । তা নাহ হলে আগের লাইনের ডাটার সাথে মিশেই ডাটা শো করবে । এবং অবশেষে সেই ডাটাগুলো TextView  তে সেট করে দিলাম ।

এবার এপটি রান করুন । আশা করছি কোন ইরর ছাড়াই এপটি রান হবে 😊😊😊

মন্তব্যসমূহ

এই ব্লগটি থেকে জনপ্রিয় পোস্টগুলি

Spinner View - 11 ( Android Bangla Tutorial)

ImageView ( Android Bangla Tutorial - )

Toggle Button - 10 ( Android Bangla Tutorial)