java creare Come leggere/scrivere stringa da un file in Android




creare file txt android (6)

Per aggiungere un file esistente.

  File file = new File(persistPath);
  BufferedWriter out = new BufferedWriter(new FileWriter(file, true), 1024);
  out.write(str);
  out.newLine();
  out.close(); 

Ho cercato e analizzato la maggior parte delle domande qui, nessuna delle quali sembrava risolvere la mia situazione.

Voglio salvare un file nella memoria interna ottenendo il testo immesso da EditText. Quindi voglio che lo stesso file restituisca il testo immesso in String e lo salvi in ​​un'altra String che deve essere utilizzata in seguito.

Ecco il codice:

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);
            }
        });
    }

Ho incluso commenti per aiutarti ad analizzare ulteriormente i miei punti su dove voglio che le operazioni siano fatte / le variabili da usare.


Answer #1

Sono un po 'un principiante e ho faticato per farlo funzionare oggi.

Di seguito è la classe con cui ho finito. Funziona, ma mi stavo chiedendo quanto sia imperfetta la mia soluzione. Ad ogni modo, speravo che alcuni di voi più esperti potessero essere disposti a dare un'occhiata alla mia classe di IO e darmi qualche consiglio. Saluti!

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();
        }
    }
}

Answer #2

Per coloro che cercano una strategia generale per leggere e scrivere una stringa su file:

Innanzitutto, ottieni un oggetto file

Avrai bisogno del percorso di archiviazione. Per la memoria interna, utilizzare:

File path = context.getFilesDir();

Per la memoria esterna (scheda SD), utilizzare:

File path = context.getExternalFilesDir(null);

Quindi crea il tuo oggetto file:

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

Scrivi una stringa nel file

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

O con Google Guava

String contents = Files.toString (file, StandardCharsets.UTF_8);

Leggi il file su una stringa

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);   

O se usi Google Guava

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

Per completezza, menzionerò

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

che non richiede librerie, ma benchmark 50% - 400% più lento delle altre opzioni (in vari test sul mio Nexus 5).

Gli appunti

Per ognuna di queste strategie, ti verrà chiesto di prendere una IOException.

La codifica dei caratteri predefinita su Android è UTF-8.

Se stai utilizzando una memoria esterna, dovrai aggiungere al tuo manifest:

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

o

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

Il permesso di scrittura implica il permesso di lettura, quindi non è necessario entrambi.


Answer #3
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();
}

Answer #4

controlla il codice qui sotto.

Lettura da un file nel filesystem.

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;
        }
    }

sotto il codice è quello di scrivere il file nel filesystem interno.

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;
        }
    }

Penso che questo ti aiuterà.


Answer #5

Solo un po 'di modifiche sulla lettura di una stringa da un metodo di file per maggiori prestazioni

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;
}




file-io