অ্যান্ড্রয়েডে একটি ফাইল থেকে / এ স্ট্রিং পড়ুন / লিখুন


213

এডিটেক্সট থেকে পাঠ্য ইনপুট করে আমি অভ্যন্তরীণ স্টোরেজে কোনও ফাইল সংরক্ষণ করতে চাই। তারপরে আমি একই ফাইলটি স্ট্রিং ফর্মের ইনপুটযুক্ত পাঠ্যটি ফিরে আসার জন্য এবং এটি অন্য স্ট্রিংয়ে সংরক্ষণ করতে চাই যা পরে ব্যবহার করা উচিত।

কোডটি এখানে:

package com.omm.easybalancerecharge;


import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final EditText num = (EditText) findViewById(R.id.sNum);
        Button ch = (Button) findViewById(R.id.rButton);
        TelephonyManager operator = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        String opname = operator.getNetworkOperatorName();
        TextView status = (TextView) findViewById(R.id.setStatus);
        final EditText ID = (EditText) findViewById(R.id.IQID);
        Button save = (Button) findViewById(R.id.sButton);

        final String myID = ""; //When Reading The File Back, I Need To Store It In This String For Later Use

        save.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                //Get Text From EditText "ID" And Save It To Internal Memory
            }
        });
        if (opname.contentEquals("zain SA")) {
            status.setText("Your Network Is: " + opname);
        } else {
            status.setText("No Network");
        }
        ch.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

                //Read From The Saved File Here And Append It To String "myID"


                String hash = Uri.encode("#");
                Intent intent = new Intent(Intent.ACTION_CALL);
                intent.setData(Uri.parse("tel:*141*" + /*Use The String With Data Retrieved Here*/ num.getText()
                        + hash));
                startActivity(intent);
            }
        });
    }

আমি আমার পয়েন্টগুলি আরও বিশ্লেষণে সহায়তা করতে মন্তব্যগুলি অন্তর্ভুক্ত করেছি যাতে আমি কোথায় অপারেশনগুলি করতে / ভেরিয়েবলগুলি ব্যবহার করতে চাই।


2
প্রশ্নটি হল "ফাইল থেকে / পড়তে / লিখতে কীভাবে?"
দিমিত্রি গুডকভ

আপনি আপনার স্ট্রিংগুলি সঞ্চয় করতে অ্যাপ্লিকেশনটির পছন্দগুলি ব্যবহার করে বিবেচনা করেছেন?
sdabet

4
বিটিডাব্লু, নিশ্চিত হয়ে নিন যে আপনি স্টোরেজ সহ পরিচালনার জন্য প্রধানতম ফাইলটির অনুমতি দিয়েছেন ...
দিমিত্রি গুডকভ

বাস্তবায়নের অনেক পরিবর্তন সহ এটি আমার অর্ধেক সম্পূর্ণ অ্যাপ্লিকেশন। আমার ধারণা হ'ল অ্যাপটি প্রথম চালানোর সময় ব্যবহারকারী একবারে আইডি প্রবেশ করান। তারপরে অ্যাপটি সেই স্টোরড আইডিটিকে ব্যবহারকারী হিসাবে যতবার অ্যাপ চালায় তার উল্লেখ করবে। অনুমতিগুলি সমস্ত ম্যানিফেস্টে যুক্ত হয়।
মেজর অলি

উত্তর:


334

আশা করি এটি আপনার কাজে লাগতে পারে।

ফাইল লিখুন:

private void writeToFile(String data,Context context) {
    try {
        OutputStreamWriter outputStreamWriter = new OutputStreamWriter(context.openFileOutput("config.txt", Context.MODE_PRIVATE));
        outputStreamWriter.write(data);
        outputStreamWriter.close();
    }
    catch (IOException e) {
        Log.e("Exception", "File write failed: " + e.toString());
    } 
}

ফাইল পড়া:

private String readFromFile(Context context) {

    String ret = "";

    try {
        InputStream inputStream = context.openFileInput("config.txt");

        if ( inputStream != null ) {
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String receiveString = "";
            StringBuilder stringBuilder = new StringBuilder();

            while ( (receiveString = bufferedReader.readLine()) != null ) {
                stringBuilder.append("\n").append(receiveString);
            }

            inputStream.close();
            ret = stringBuilder.toString();
        }
    }
    catch (FileNotFoundException e) {
        Log.e("login activity", "File not found: " + e.toString());
    } catch (IOException e) {
        Log.e("login activity", "Can not read file: " + e.toString());
    }

    return ret;
}

43
Context.openFileInput (): বর্গ ভ্রমণ থেকে বাড়ানো না থাকে, "openFileInput ()" ব্যবহার পদ্ধতি এই কেমন হওয়া উচিত
Behzad

11
দ্রষ্টব্য: উপরের কোডটি ভালভাবে কাজ করে, তবে ফলস্বরূপ স্ট্রিংটিতে ফাইলটি থেকে কোনও লাইনব্রেক থাকবে না। আবার লাইনব্রেকস যুক্ত করতে, "স্ট্রিংবিল্ডার.এপেন্ড (রিসিভস্ট্রিং)" রেখাটি পরিবর্তন করুন; "স্ট্রিংবিল্ডার.অ্যাপেন্ড (রিসিভ স্ট্রিং)। অ্যাপেন্ড (" \ n ");" এ যান। আপনি যদি চূড়ান্ত স্ট্রিংয়ে অন্যান্য লাইন ব্রেক ব্রেক (যেমন উইন্ডোজ টেক্সট ফাইলগুলিতে etc r ইত্যাদি থাকবে) আশা করেন তবে আপনাকে এটি আরও কিছুটা মানিয়ে নিতে হবে।
গাছগুলিএইর কোথাও

26
এই কনফিগারেশন ফাইলটি আসল ডিভাইসে কোথায় সংরক্ষণ করে? আমি এটি চেক করতে পারি না :(
মাহদি

4
আমি মনে করি, finalবন্ধগুলি স্ট্রিমগুলি ব্লকটিতে @ শার্কএল্লি উত্তর হিসাবে হওয়া উচিত
ইউরি কে ২

4
@ কেনজি ফাইলটি অ্যাপ্লিকেশনটির ফাইল ডিরেক্টরিতে সংরক্ষণ করা হয়েছে (যেমন / ডেটা / ডেটা / <প্যাকেজ_নাম> / ফাইলস / কনফিগ। টেক্সট)। অ্যাপ্লিকেশনটির প্রক্রিয়া এতে অ্যাক্সেস করতে পারে তবে ওএসের সমস্ত প্রক্রিয়া নয়। আপনার ডিভাইসটি কোন অ্যান্ড্রয়েড সংস্করণে চলে তার উপর নির্ভর করে প্রয়োগটি পৃথক হতে পারে। আপনি অনলাইনে এওএসপি প্রয়োগ বাস্তবায়ন করতে পারেন। উদাহরণ হিসেবে বলা যায়, অ্যান্ড্রয়েড 8.1_r5 জন্য: android.googlesource.com/platform/frameworks/base/+/...
vhamon

187

স্ট্রিং পড়ার এবং লেখার জন্য একটি সাধারণ কৌশল খুঁজছেন তাদের জন্য:

প্রথমে একটি ফাইল অবজেক্ট পান

আপনার স্টোরেজ পাথের প্রয়োজন হবে। অভ্যন্তরীণ স্টোরেজের জন্য, ব্যবহার করুন:

File path = context.getFilesDir();

বাহ্যিক স্টোরেজ (এসডি কার্ড) এর জন্য, ব্যবহার করুন:

File path = context.getExternalFilesDir(null);

তারপরে আপনার ফাইল অবজেক্টটি তৈরি করুন:

File file = new File(path, "my-file-name.txt");

ফাইলটিতে একটি স্ট্রিং লিখুন

FileOutputStream stream = new FileOutputStream(file);
try {
    stream.write("text-to-write".getBytes());
} finally {
    stream.close();
}

অথবা গুগল পেয়ারা দিয়ে

স্ট্রিংয়ের সামগ্রী = ফাইলস.টস্ট্রিং (ফাইল, স্ট্যান্ডার্ডচারেটস.ইউটিএফ_8);

একটি স্ট্রিং ফাইল পড়ুন

int length = (int) file.length();

byte[] bytes = new byte[length];

FileInputStream in = new FileInputStream(file);
try {
    in.read(bytes);
} finally {
    in.close();
}

String contents = new String(bytes);   

অথবা আপনি যদি গুগু পেয়ারা ব্যবহার করছেন

String contents = Files.toString(file,"UTF-8");

সম্পূর্ণতার জন্য আমি উল্লেখ করব

String contents = new Scanner(file).useDelimiter("\\A").next();

যার জন্য কোনও গ্রন্থাগার প্রয়োজন নেই, তবে বেঞ্চমার্কগুলি অন্যান্য বিকল্পগুলির তুলনায় 50% - 400% ধীর গতিতে (আমার নেক্সাস 5 এর বিভিন্ন পরীক্ষায়)।

মন্তব্য

এই প্রতিটি কৌশলগুলির জন্য, আপনাকে একটি আইওএক্সেপশন ধরতে বলা হবে।

অ্যান্ড্রয়েডে ডিফল্ট অক্ষর এনকোডিংটি ইউটিএফ -8 is

আপনি যদি বাহ্যিক স্টোরেজ ব্যবহার করে থাকেন তবে আপনাকে আপনার ম্যানিফেস্টে যুক্ত করতে হবে:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

অথবা

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

লেখার অনুমতি পড়ার অনুমতি বোঝায় তাই আপনার উভয়েরই দরকার নেই।


ঠিক আছে উদাহরণস্বরূপ আমি একজন ব্যবহারকারীকে তার সমস্ত পোস্ট দেখতে চাই এবং তিনি যখন অন্য পর্দায় যান এবং ফিরে আসেন তখন আমার কি আবার এটি আঁকতে হবে বা এটি ক্যাশে হওয়ার কারণে এটি কেবল এটি ক্যাশে থেকে বাইরে টেনে এনে কেবল এটি দেখায়, যদি এটি থাকে কেবল এটি টানতে পারে, আমার সার্ভারগুলি জিজ্ঞাসা না করার শর্তসাপেক্ষে আমি কীভাবে যুক্ত করব
Lion789

4
এটা পছন্দ করবেন না new File(path + "/my-file-name.txt");। এটি অর্থে অনেকটাই অস্বীকার করে Filenew File(path, "my-file-name.txt");পরিবর্তে ব্যবহার করুন।
জিমিবি

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

1
Fileএকটি কারণ আছে। আপনার ক্ষেত্রে, আপনি ঠিক পাশাপাশি এড়িয়ে যেতে Fileএবং করতে পারেন new FileInputStream(path + "/my-file-name.txt");, যা আমি সুপারিশ করি না। ( উদাহরণস্বরূপ যদি pathপিছনে কিছু থাকে তবে কী হবে /?)
জিমিবি

আপনার পরামর্শ অনুযায়ী সম্পাদিত। ধন্যবাদ :)
শার্কএলি

37
public static void writeStringAsFile(final String fileContents, String fileName) {
    Context context = App.instance.getApplicationContext();
    try {
        FileWriter out = new FileWriter(new File(context.getFilesDir(), fileName));
        out.write(fileContents);
        out.close();
    } catch (IOException e) {
        Logger.logError(TAG, e);
    }
}

public static String readFileAsString(String fileName) {
    Context context = App.instance.getApplicationContext();
    StringBuilder stringBuilder = new StringBuilder();
    String line;
    BufferedReader in = null;

    try {
        in = new BufferedReader(new FileReader(new File(context.getFilesDir(), fileName)));
        while ((line = in.readLine()) != null) stringBuilder.append(line);

    } catch (FileNotFoundException e) {
        Logger.logError(TAG, e);
    } catch (IOException e) {
        Logger.logError(TAG, e);
    } 

    return stringBuilder.toString();
}

7
অ্যাপ !? কী হওয়ার কথা!
আলাপ

@ আলাপ এমন কিছু যা ইউজিন স্ট্যাটিকভাবে অ্যাপ্লিকেশন প্রসঙ্গে পুনরুদ্ধার করতে ব্যবহার করছে। তার জন্য এটি দরকার context.getFilesDir()। আপনি কেবলমাত্র new File(context.getFilesDir(), fileName)কোনও Fileঅবজেক্ট বা এর Stringপরিবর্তে কার্য করতে পাসের সাথে সংঘটন করতে পারেন fileName
lorenzo-s

7

আরও পারফরম্যান্সের জন্য একটি ফাইল পদ্ধতি থেকে স্ট্রিং পড়ার ক্ষেত্রে কেবল অ বিট পরিবর্তন

private String readFromFile(Context context, String fileName) {
    if (context == null) {
        return null;
    }

    String ret = "";

    try {
        InputStream inputStream = context.openFileInput(fileName);

        if ( inputStream != null ) {
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);               

            int size = inputStream.available();
            char[] buffer = new char[size];

            inputStreamReader.read(buffer);

            inputStream.close();
            ret = new String(buffer);
        }
    }catch (Exception e) {
        e.printStackTrace();
    }

    return ret;
}

6

নীচের কোডটি পরীক্ষা করুন।

ফাইল সিস্টেমে একটি ফাইল থেকে পড়া।

FileInputStream fis = null;
    try {

        fis = context.openFileInput(fileName);
        InputStreamReader isr = new InputStreamReader(fis);
        // READ STRING OF UNKNOWN LENGTH
        StringBuilder sb = new StringBuilder();
        char[] inputBuffer = new char[2048];
        int l;
        // FILL BUFFER WITH DATA
        while ((l = isr.read(inputBuffer)) != -1) {
            sb.append(inputBuffer, 0, l);
        }
        // CONVERT BYTES TO STRING
        String readString = sb.toString();
        fis.close();

    catch (Exception e) {

    } finally {
        if (fis != null) {
            fis = null;
        }
    }

কোডের নীচে হ'ল অভ্যন্তরীণ ফাইল সিস্টেমে ফাইলটি লিখতে হয়।

FileOutputStream fos = null;
    try {

        fos = context.openFileOutput(fileName, Context.MODE_PRIVATE);
        fos.write(stringdatatobestoredinfile.getBytes());
        fos.flush();
        fos.close();

    } catch (Exception e) {

    } finally {
        if (fos != null) {
            fos = null;
        }
    }

আমি মনে করি এটি আপনাকে সাহায্য করবে।


3

আমি কিছুটা শিক্ষানবিস এবং আজকের এই কাজটি করার জন্য সংগ্রাম করেছি।

নীচে ক্লাসটি দিয়ে শেষ করেছি। এটি কাজ করে তবে আমি ভাবছিলাম যে আমার সমাধানটি কতটা অসম্পূর্ণ। যাইহোক, আমি আশা করছিলাম আপনার মধ্যে আরও অভিজ্ঞ লোকেরা আমার আইও ক্লাসটি একবার দেখতে এবং আমাকে কিছু টিপস দিতে রাজি হতে পারে। চিয়ার্স!

public class HighScore {
    File data = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator);
    File file = new File(data, "highscore.txt");
    private int highScore = 0;

    public int readHighScore() {
        try {
            BufferedReader br = new BufferedReader(new FileReader(file));
            try {
                highScore = Integer.parseInt(br.readLine());
                br.close();
            } catch (NumberFormatException | IOException e) {
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
            try {
                file.createNewFile();
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }
            e.printStackTrace();
        }
        return highScore;
    }

    public void writeHighScore(int highestScore) {
        try {
            BufferedWriter bw = new BufferedWriter(new FileWriter(file));
            bw.write(String.valueOf(highestScore));
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

সেখানে কোনও ফাইল না থাকলে আপনাকে নতুন ফাইল তৈরি করার দরকার নেই।
rML

1

আমাদের প্রথম যে জিনিসটি দরকার তা হ'ল অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল এর অনুমতি

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />

সুতরাং একটি asyncTask কোটলিন শ্রেণিতে আমরা ফাইলটি তৈরির চিকিত্সা করি

    import android.os.AsyncTask
    import android.os.Environment
    import android.util.Log
    import java.io.*
    class WriteFile: AsyncTask<String, Int, String>() {
        private val mFolder = "/MainFolder"
        lateinit var folder: File
        internal var writeThis = "string to cacheApp.txt"
        internal var cacheApptxt = "cacheApp.txt"
        override fun doInBackground(vararg writethis: String): String? {
            val received = writethis[0]
            if(received.isNotEmpty()){
                writeThis = received
            }
            folder = File(Environment.getExternalStorageDirectory(),"$mFolder/")
            if(!folder.exists()){
                folder.mkdir()
                val readME = File(folder, cacheApptxt)
                val file = File(readME.path)
                val out: BufferedWriter
                try {
                    out = BufferedWriter(FileWriter(file, true), 1024)
                    out.write(writeThis)
                    out.newLine()
                    out.close()
                    Log.d("Output_Success", folder.path)
                } catch (e: Exception) {
                    Log.d("Output_Exception", "$e")
                }
            }
            return folder.path

    }

        override fun onPostExecute(result: String) {
            super.onPostExecute(result)

            if(result.isNotEmpty()){
                //implement an interface or do something
                Log.d("onPostExecuteSuccess", result)
            }else{
                Log.d("onPostExecuteFailure", result)
            }
        }

    }

অবশ্যই আপনি যদি অপি 23 এর ওপরে অ্যান্ড্রয়েড ব্যবহার করছেন তবে ডিভাইস মেমরিতে লেখার অনুমতি দেওয়ার জন্য আপনাকে অবশ্যই অনুরোধটি পরিচালনা করতে হবে। এটার মতো কিছু

    import android.Manifest
    import android.content.Context
    import android.content.pm.PackageManager
    import android.os.Build
    import androidx.appcompat.app.AppCompatActivity
    import androidx.core.app.ActivityCompat
    import androidx.core.content.ContextCompat

    class ReadandWrite {
        private val mREAD = 9
        private val mWRITE = 10
        private var readAndWrite: Boolean = false
        fun readAndwriteStorage(ctx: Context, atividade: AppCompatActivity): Boolean {
            if (Build.VERSION.SDK_INT < 23) {
                readAndWrite = true
            } else {
                val mRead = ContextCompat.checkSelfPermission(ctx, Manifest.permission.READ_EXTERNAL_STORAGE)
                val mWrite = ContextCompat.checkSelfPermission(ctx, Manifest.permission.WRITE_EXTERNAL_STORAGE)

                if (mRead != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(atividade, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), mREAD)
                } else {
                    readAndWrite = true
                }

                if (mWrite != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(atividade, arrayOf(Manifest.permission.WRITE_EXTERNAL_STORAGE), mWRITE)
                } else {
                    readAndWrite = true
                }
            }
            return readAndWrite
        }
    }

তারপরে কোনও ক্রিয়াকলাপে, কলটি কার্যকর করুন।

  var pathToFileCreated = ""
    val anRW = ReadandWrite().readAndwriteStorage(this,this)
    if(anRW){
        pathToFileCreated =  WriteFile().execute("onTaskComplete").get()
        Log.d("pathToFileCreated",pathToFileCreated)
    }

এই অভ্যন্তরীণ স্টোরেজ অনুমতিগুলি অবৈধ।
Lerk

0

Kotlin

class FileReadWriteService {

    private var context:Context? = ContextHolder.instance.appContext

    fun writeFileOnInternalStorage(fileKey: String, sBody: String) {
        val file = File(context?.filesDir, "files")
        try {
            if (!file.exists()) {
                file.mkdir()
            }
            val fileToWrite = File(file, fileKey)
            val writer = FileWriter(fileToWrite)
            writer.append(sBody)
            writer.flush()
            writer.close()
        } catch (e: Exception) {
            Logger.e(classTag, e)
        }
    }

    fun readFileOnInternalStorage(fileKey: String): String {
        val file = File(context?.filesDir, "files")
        var ret = ""
        try {
            if (!file.exists()) {
                return ret
            }
            val fileToRead = File(file, fileKey)
            val reader = FileReader(fileToRead)
            ret = reader.readText()
            reader.close()
        } catch (e: Exception) {
            Logger.e(classTag, e)
        }
        return ret
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.