Leggere un semplice file di testo


115

Sto cercando di leggere un semplice file di testo nella mia applicazione Android di esempio. Sto usando il codice scritto di seguito per leggere il semplice file di testo.

InputStream inputStream = openFileInput("test.txt");
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

Le mie domande sono: dove devo inserire questo "test.txt"file nel mio progetto ?. Ho provato a mettere il file sotto "res/raw"e nella "asset"cartella, ma ottengo il exception "FileNotFound"primo live del codice scritto sopra viene eseguito.

Grazie per l'aiuto

Risposte:


181

Inserisci il tuo file di testo nella /assetsdirectory sotto il progetto Android. Usa la AssetManagerclasse per accedervi.

AssetManager am = context.getAssets();
InputStream is = am.open("test.txt");

Oppure puoi anche mettere il file nella /res/rawdirectory, dove il file verrà indicizzato ed è accessibile da un id nel file R:

InputStream is = context.getResources().openRawResource(R.raw.test);

9
Mi chiedevo quale fosse la differenza di prestazioni tra questi due metodi e un rapido benchmark non ha mostrato differenze apprezzabili.
Reuben L.

Qual è la dimensione del file di testo utilizzato per i test di benchmark e hai inserito immagini e altre risorse nella cartella res che simula un'app Android in tempo reale (commerciale / gratuita)?
Sree Rama

2
Non ho la cartella "asset" nella mia app "hello world". Devo creare manualmente?
Kaushik Lele

2
A proposito, la /assetsdirectory deve essere aggiunta manualmente a partire da Android Studio 1.2.2. Dovrebbe entrare src/main.
Jpaji Rajnish

3
Per quelli come @KaushikLele, che si stanno chiedendo come ottenere un contesto; è facile. In un'attività puoi ottenerla semplicemente usando la parola chiave "this" o chiamando il metodo "getCurrentContext ()".
Alex

25

prova questo,

package example.txtRead;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import java.util.Vector;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class txtRead extends Activity {
    String labels="caption";
    String text="";
    String[] s;
    private Vector<String> wordss;
    int j=0;
    private StringTokenizer tokenizer;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        wordss = new Vector<String>();
        TextView helloTxt = (TextView)findViewById(R.id.hellotxt);
        helloTxt.setText(readTxt());
 }

    private String readTxt(){

     InputStream inputStream = getResources().openRawResource(R.raw.toc);
//     InputStream inputStream = getResources().openRawResource(R.raw.internals);
     System.out.println(inputStream);
     ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

     int i;
  try {
   i = inputStream.read();
   while (i != -1)
      {
       byteArrayOutputStream.write(i);
       i = inputStream.read();
      }
      inputStream.close();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

     return byteArrayOutputStream.toString();
    }
}

23

Ecco come lo faccio:

public static String readFromAssets(Context context, String filename) throws IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(context.getAssets().open(filename)));

    // do reading, usually loop until end of file reading  
    StringBuilder sb = new StringBuilder();
    String mLine = reader.readLine();
    while (mLine != null) {
        sb.append(mLine); // process line
        mLine = reader.readLine();
    }
    reader.close();
    return sb.toString();
}

usalo come segue:

readFromAssets(context,"test.txt")

1
Può essere utile specificare la codifica del file, ad esempio "UTF-8" come secondo parametro nel costruttore InputStreamReader.
Makalele

7

La presenza di un file nella assetscartella richiede l'utilizzo di questo pezzo di codice per ottenere i file dalla assetscartella:

yourContext.getAssets().open("test.txt");

In questo esempio, getAssets()restituisce AssetManagerun'istanza e quindi sei libero di utilizzare qualsiasi metodo desideri AssetManagerdall'API.


5

In Mono per Android ...

try
{
    System.IO.Stream StrIn = this.Assets.Open("MyMessage.txt");
    string Content = string.Empty;
    using (System.IO.StreamReader StrRead = new System.IO.StreamReader(StrIn))
    {
      try
      {
            Content = StrRead.ReadToEnd();
            StrRead.Close();
      }  
      catch (Exception ex) { csFunciones.MostarMsg(this, ex.Message); }
      }
          StrIn.Close();
          StrIn = null;
}
catch (Exception ex) { csFunciones.MostarMsg(this, ex.Message); }

3

Per leggere il file salvato nella cartella degli asset

public static String readFromFile(Context context, String file) {
        try {
            InputStream is = context.getAssets().open(file);
            int size = is.available();
            byte buffer[] = new byte[size];
            is.read(buffer);
            is.close();
            return new String(buffer);
        } catch (Exception e) {
            e.printStackTrace();
            return "" ;
        }
    }

1
"è disponibile();" non è sicuro. Usa AssetFileDescriptor fd = getAssets (). OpenFd (fileName); int dimensione = (int) fd.getLength (); fd.close ();
GBY

0

Ecco una semplice classe che gestisce sia rawe assetfile:

public class ReadFromFile {

public static String raw(Context context, @RawRes int id) {
    InputStream is = context.getResources().openRawResource(id);
    int size = 0;
    try {
        size = is.available();
    } catch (IOException e) {
        e.printStackTrace();
        return "";
    }
    return readFile(size, is);
}

public static String asset(Context context, String fileName) {
    InputStream is = null;
    int size = 0;
    try {
        is = context.getAssets().open(fileName);
        AssetFileDescriptor fd = null;
        fd = context.getAssets().openFd(fileName);
        size = (int) fd.getLength();
        fd.close();
    } catch (IOException e) {
        e.printStackTrace();
        return "";
    }
    return readFile(size, is);
}


private static String readFile(int size, InputStream is) {
    try {
        byte buffer[] = new byte[size];
        is.read(buffer);
        is.close();
        return new String(buffer);
    } catch (Exception e) {
        e.printStackTrace();
        return "";
    }
}

}

Per esempio :

ReadFromFile.raw(context, R.raw.textfile);

E per i file di risorse:

ReadFromFile.asset(context, "file.txt");
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.