Basit bir metin dosyasını okumak


115

Örnek Android Uygulamamda basit bir metin dosyası okumaya çalışıyorum. Basit metin dosyasını okumak için aşağıdaki yazılı kodu kullanıyorum.

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

Sorularım şu: Bu "test.txt"dosyayı projemde nereye yerleştirmeliyim ? Dosyayı "res/raw"ve "asset"klasörünün altına koymayı denedim, ancak exception "FileNotFound"yukarıda yazılan kodun ilk yayında çalıştırıldığını alıyorum .

Yardım için teşekkürler

Yanıtlar:


181

Metin dosyanızı /assetsAndroid projesinin altındaki dizine yerleştirin. Erişmek için AssetManagersınıfı kullanın .

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

Veya dosyayı /res/raw, dosyanın indeksleneceği ve R dosyasındaki bir id ile erişilebileceği dizine de koyabilirsiniz :

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

9
Bu iki yöntem arasındaki performans farkını merak ediyordum ve hızlı bir kıyaslama kayda değer bir fark göstermedi.
Reuben L.

Kıyaslama testi için kullanılan metin dosyasının boyutu nedir ve res klasörünüze gerçek zamanlı (ticari / ücretsiz) bir android uygulamasına benzeyen resimler ve diğer kaynakları koydunuz mu?
Sree Rama

2
"Merhaba dünya" uygulamamda "varlık" klasörüm yok. Manuel oluşturmalı mıyım?
Kaushik Lele

2
Btw, dizinin /assetsAndroid Studio 1.2.2'den itibaren manuel olarak eklenmesi gerekir. İçeri girmeli src/main.
Jpaji Rajnish

3
Bağlamı nasıl elde edebileceklerini merak eden @ KaushikLele gibi olanlar için; bu kolay. Bir aktivitede, "this" anahtar sözcüğünü kullanarak veya "getCurrentContext ()" yöntemini çağırarak bunu kolayca elde edebilirsiniz.
Alex

25

bunu dene,

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

Ben böyle yaparım:

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

aşağıdaki gibi kullanın:

readFromAssets(context,"test.txt")

1
Dosyanın kodlamasını, örneğin InputStreamReader yapıcısında ikinci parametre olarak "UTF-8" belirtmek faydalı olabilir.
Makalele

7

assetsKlasörünüzde bir dosya olması, klasörden dosya almak için bu kod parçasını kullanmanızı gerektirir assets:

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

Bu örnekte, getAssets()bir AssetManagerörnek döndürür ve ardından AssetManagerAPI'den istediğiniz yöntemi kullanmakta özgürsünüz .


5

Android için Mono'da ....

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

Varlıklar klasörüne kaydedilen dosyayı okumak için

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
"gecerli();" güvenli değil. AssetFileDescriptor kullanın fd = getAssets (). OpenFd (dosyaAdı); int size = (int) fd.getLength (); fd.close ();
GBY

0

İşte size basit bir sınıf olduğunu kolları hem rawve assetdosyaları:

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

}

Örneğin :

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

Ve varlık dosyaları için:

ReadFromFile.asset(context, "file.txt");
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.