file storage
এই পর্বে আমরা দেখবো ফাইল স্টোরেজ এর মাধ্যমে কিভাবে আমাদের এপের ডাটা ইউজার এর ফোনে সেভ করে রাখতে পারি । ইউজার এর ফোনে সাধারনত দুই ধরনের মেমোরি থাকে । একটি হল ফোনের ইন বিল্ড মেমোরি অন্যটি হল SD কার্ড যেটি ইউজার এর ফোনে আলাদা ভাবে ইউজার সেট করে । তো এই পর্বে আমরা শিখবো ইউজার এর ফোনের ইন বিল্ড মেমোরিতে কিভাবে ডাটা সেভ করতে হয় ।
তো চলুন শুরু করা যাক । আমরা এই প্রোজেক্ট এর মাধ্যমে ইউজার এর ফোনে একটি নাম এবং একটি ম্যাসেজ সেভ করে রাখবো । আমাদের এপের ইউজার ইন্টারফেসটা দেখতে এরকম হবে -
১ম বক্সে ইউজার ম্যাসেজ লিখবে এবং পরের বক্সে তার নাম । Save Data বাটনে ক্লিক করলে তার নাম এবং ম্যাসেজ তার ফোনের মেমোরিতেই সেভ করে রাখবো । এরপর ইউজার Load Data বাটনে ক্লিক করলে সেই ডাটাগুলো রিড করে নিচের কমলা কালার বক্সে দেখাবো । তো ডিজাইন টা করা যাক ।
activity_main.xml -
ডিজাইনের কাজ শেষ। ডিজাইনের কোন কিছু নাহ বুঝলে দয়া করে শুরুর ব্লগ গুলো পরে আসবেন ।
MainActivity.java -
এগুলোও আশা করি বুঝে ফেলেছেন ।
এবার বাটন দুটির onClick ম্যাথডের জন্য দুটি ম্যাথড তৈরি করবো । ১ম ম্যাথডের সাহায্যে ডাটা সেভ রাখবো এবং পরের বাটনে ক্লিক করলে সেই ডাটা নিচের টেক্সভিউতে দেখাবে ।
১ম ম্যাথড -
EditText থেকে পাওয়া ডাটা দুটি String ভ্যারিয়েবল এর ভিতরে রেখে দিলাম । এরপর প্রথম ডাটার সাথে একটি নতুন লাইন এড করে দিলাম যাতে TextView তে ডাটা লোড হওয়ার সময় ডাটা দুটি আলাদা লাইনে দেখায় ।
এবার ফাইল খুলে ডাটা সেভ করার জন্য আমাদের যে ক্লাসের সাহায্য নিতে হবে সেটি হল FileOutputStream । এই ক্লাসের অব্জেক্ট তৈরির সময় আমাদের কন্সট্রাক্টর এ দুটি ভ্যালু পাঠাতে হবে । ১ম টি হল ফাইলের নাম এবং পরেরটি ফাইল এর প্রাইভেসি । এবং এই লাইনটি লেখার সময় দেখবেন ইরর দেখাবে কারন কোন কারনে exception ধরা পড়লে যাতে সেটি হ্যান্ডেল করতে পারি আমরা এই জন্য এটি try-catch ব্লগের ভিতরে নিতে হবে ।
এবার যে ফাইল আমরা তৈরি করলাম সেখানে ডাটা ঢুকানোর জন্য .write ম্যাথডের সাহায্য নিবো । এখানে ফাইলে ডাটা বাইট আকারে সেভ হবে । তাই বাইট এ কনভার্ট করে সেই ফাইলের ভিতরে আমাদের ডাটা দুটি রেখে দিয়ে সেই ফাইলটি ক্লোজ করে দিলাম মানে বন্ধ করে দিলাম। এখানেও বাইট এর জন্যও আমাদের Catch Clause এড করতে হবে ।
এরপর ইউজারকে Toast এর সাহায্যে কনফার্মেশন ম্যাসেজ দিয়ে EditText থেকে লেখাগুলো মুছে দিয়ে ফাকা স্পেস রেখে দিলাম ।
ব্যাস আমরা ইউজার থেকে পাওয়া ডাটা দুটি ইউজার এর ফোন মেমোরিতে সেভ করে রাখলাম । এভাবে আপনার কাছে থাকা ইউজার এর ডাটা ইউজার এর ফোনে সেভ করে রাখতে পারেন ।
এবার আমরা দেখবো ইউজার এর ফোনে থাকা সেই ডাটা কিভাবে আবার এপের ভিতরে নিয়ে আসবো ।
২য় ম্যাথড -
ডাটা সেভ রাখতে আমরা FileOutputStream ক্লাসের সাহায্য নিছিলাম, এবার সেই ফাইল আবার ওপেন করতে FileInputStream ক্লাসের সাহায্য নিতে হবে । সেইম ভাবে আমরা FileInputStream ক্লাসে অব্জেক্ট তৈরি করে আমাদের ফাইলের যে নাম দিছিলাম ঠিক সেই নাম টাই দিতে হবে । এখানেও ফাইল নাহ পাওয়া গেলে যাতে প্রোগ্রাম ক্রাশ নাহ করে তাই try-catch ব্লগের ভিতরে নিতে হবে ।
এবার BufferedReader এর সাহায্যে সেই ডাটা রিড করবো এবং জাভা থেকে আমরা জানি বাফাররিডার এর অব্জেক্ট খুলতে InputStreamReader এর দরকার হয় । ডাটা রিড করার জন্য নতুন একটি স্ট্রিং ভ্যারিয়েবল নিলাম । ডাটা রিড করে এখানে জমা রাখবো । এখন আমরা কতক্ষন ডাটা রিড করবো সেটি লুপের মাধ্যমে বলে দিতে হবে । আমরা চাই সেখানে থাকা সকল ডাটাই ফিরে আসুক । তাই নাল নাহ পাওয়া পর্যন্ত সেই ডাটা রিড হয়ে হয়ে StringBuffer দ্বারা text এর ভিতরে চলে যাবে । StringBuffer ডাটা বারবার পাল্টাতে সাহায্য করে । একই ভ্যারিয়েবল এর ভিতর বার বার ডাটা পাল্টে রাখার জন্য StringBuffer ইউজ করা হয় ।
এবং StringBuffer এ ডাটা এড করতে append ম্যাথড ব্যাবহার করা হয় । এখানে text এর সাথে নতুন লাইন এড করে দিলাম কারন প্রতি লাইন ডাটা রিড করার পর যাতে নতুন একটি লাইন তৈরি হয় । তা নাহ হলে আগের লাইনের ডাটার সাথে মিশেই ডাটা শো করবে । এবং অবশেষে সেই ডাটাগুলো TextView তে সেট করে দিলাম ।
এবার এপটি রান করুন । আশা করছি কোন ইরর ছাড়াই এপটি রান হবে 😊😊😊
তো চলুন শুরু করা যাক । আমরা এই প্রোজেক্ট এর মাধ্যমে ইউজার এর ফোনে একটি নাম এবং একটি ম্যাসেজ সেভ করে রাখবো । আমাদের এপের ইউজার ইন্টারফেসটা দেখতে এরকম হবে -
১ম বক্সে ইউজার ম্যাসেজ লিখবে এবং পরের বক্সে তার নাম । 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 তে সেট করে দিলাম ।
এবার এপটি রান করুন । আশা করছি কোন ইরর ছাড়াই এপটি রান হবে 😊😊😊
মন্তব্যসমূহ
একটি মন্তব্য পোস্ট করুন