2011-06-21 14 views
7

Mam plik words.txt, który umieściłem w folderze res/raw. Słowa w pliku są oddzielone spacją. Ciężko mi pisać kod Android/Java, aby czytać plik słowo po słowie.Czytanie pliku tekstowego z Androidem

+0

znalazłem najlepsze rozwiązanie tutaj: http://stackoverflow.com/a/5675934/336990 – CoDe

Odpowiedz

4

Czytaj od res/raw folderu String

InputStream inputStream = getResources().openRawResource(R.raw.yourtextfile); 
BufferedReader bufferedReader= new BufferedReader(new InputStreamReader(inputStream)); 
String eachline = bufferedReader.readLine(); 
while (eachline != null) { 
    // `the words in the file are separated by space`, so to get each words 
    String[] words = eachline.split(" "); 
    eachline = bufferedReader.readLine(); 
} 
3

Aby dostać słowa z pliku z surowego folderze spróbować z następującym podejściu

odczytać dane z surowego folderu za pomocą getResources().openRawResource(R.raw.song);
Następnie uzyskać InputStream dane w tablicy bajtowej podziel dane za pomocą spacji.

użyć następującego kodu

InputStream is =getResources().openRawResource(R.raw.song); 
      BufferedInputStream bis = new BufferedInputStream(is); 

      ByteArrayBuffer baf = new ByteArrayBuffer(50); 

      int current = 0; 

      while ((current = bis.read()) != -1) { 

       baf.append((byte) current); 

      } 

      byte[] myData = baf.toByteArray(); 
      String dataInString = new String(myData); 
      String[] words = dataInString.split(" "); 

Dzięki Deepak

+0

-1 do czytania bajt po bajcie ... widziałem ten wzór: 'while ((aktywa = bis .read())! = -1) {... 'w wielu odpowiedziach ... facet, który opublikował (nie ty) najpierw powinien być sfilmowany – Selvin

4

Najprostszym jest użycie Scanner.

Scanner s = new Scanner(getResources().openRawResource(R.raw.text_file)); 

try { 
    while (s.hasNext()) { 
     String word = s.next(); 
     // .... 
    } 
} finally { 
    s.close(); 
} 

Domyślnym ogranicznikiem jest biały znak (w tym spacja). Jeśli chcesz, aby uruchamiał się tylko w przestrzeni, po jej utworzeniu użyj s.useDelimiter(" ");.

+0

Używanie tego kodu z plikiem tekstowym, który ma tylko kilka słów, działa po prostu w porządku. Ale kiedy używam pliku zawierającego około 100 000 słów, emulator przestaje odpowiadać. Czemu myślisz? –

+0

Cóż ... To jest wadą tego rozwiązania, ponieważ 'Skaner' tworzy nowe łańcuchy dla każdego połączenia z' next() ', co może być kosztowne. Ale to jest naprawdę ** inny problem i powinien zostać zadany w nowym pytaniu ** (* Używałbym rozwiązania @Sunil Kumar Sahoo, jeśli masz pliki tak duże, ponieważ metoda 'split (..)' nie tworzy nowych ciągów, ale ponownie wykorzystuje ciąg podstawowy *). – dacwe

2

Miałem to samo pytanie i chociaż powyższe odpowiedzi są prawdopodobnie poprawne, nie udało mi się przekonać ich do pracy z powodzeniem. To było prawie na pewno błąd operatora i ignorancja z mojej strony - ale tylko w przypadku, gdy ktoś chce zobaczyć jak ja - n00b - w końcu to zrobił, tutaj jest moje rozwiązanie:

// this is just the click handler for a button... 
public void loadStatesHandler(View v) { 
    try { 
     String states = getStringFromRaw(this); 
     readOutput.setText(states); 
    } 
    catch(Throwable t) { 
     t.printStackTrace(); 
    } 
} 

private String getStringFromRaw(Context c) throws IOException { 
     Resources r = c.getResources(); 
     InputStream is = r.openRawResource(R.raw.states); 
     String statesText = convertStreamToString(is); 
     is.close(); 
     return statesText; 
} 

private String convertStreamToString(InputStream is) throws IOException { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    int i = is.read(); 
    while (i != -1) { 
     baos.write(i); 
     i = is.read(); 
    } 
    return baos.toString(); 
} 

Nie jestem dokładnie pewien, dlaczego to działało dla mnie, gdy powyższe nie było, ponieważ nie wydaje się zasadniczo różne - ale jak powiedziałem - prawdopodobnie był to błąd operatora z mojej strony.

+0

Chciałbym również usłyszeć wszelkie opinie na temat skuteczności (lub jej braku!) Tej metody w porównaniu do tej, którą zaproponował Sunil Kumar Sahoo ... –

5
//put your text file to raw folder, raw folder must be in resource folder. 

private TextView tv; 
private Button btn; 

    btn = (Button)findViewById(R.id.btn_json); 
    tv = (TextView)findViewById(R.id.tv_text); 

    btn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      SimpleText(); 


     } 
    }); 

private void SimpleText(){ 

    try { 


     InputStream is = this.getResources().openRawResource(R.raw.simpletext); 
     byte[] buffer = new byte[is.available()]; 
     while (is.read(buffer) != -1); 
     String jsontext = new String(buffer); 



     tv.setText(jsontext); 

    } catch (Exception e) { 

     Log.e(TAG, ""+e.toString()); 
    } 

}