2011-06-21 19 views
7

Tengo un archivo words.txt que he colocado en mi carpeta res/raw. Las palabras en el archivo están separadas por espacio. Me está costando escribir el código Android/Java para leer el archivo palabra por palabra.Lectura del archivo de texto sin formato de Android

+0

me encontré mejor solución aquí: http://stackoverflow.com/a/5675934/336990 – CoDe

Respuesta

4

Leer de res/raw carpeta a la cadena

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

para que las palabras del archivo de la carpeta prima tratan con el enfoque siguiente

leer los datos de la carpeta cruda usando getResources().openRawResource(R.raw.song);
continuación, obtener el flujo de entrada los datos en una matriz de bytes dividen los datos con espacio.

utilizar el siguiente código

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

Gracias Deepak

+0

-1 para la lectura de byte a byte ... que he visto este patrón: 'while ((= corriente bis .read())! = -1) {... 'en muchas respuestas ... chico que publicó (no tú) primero debe ser robado – Selvin

4

Lo más sencillo es utilizar un Scanner.

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

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

El delimitador predeterminado es el espacio en blanco (incluido el espacio). Si desea que solo se active en el espacio, use s.useDelimiter(" "); después de crearlo.

+0

Usando este código con un archivo de texto que tiene solo unas pocas palabras, funciona solo multa. Pero cuando uso el archivo que tiene unas 100.000 palabras, el emulador deja de responder. ¿Por qué piensas? –

+0

Bueno ... Esa es una desventaja de esta solución ya que 'Scanner' creará nuevas cadenas para cada llamada a' next() 'y eso podría ser costoso. Pero eso es realmente ** otro problema y debería hacerse en una nueva pregunta ** (* Usaría la solución @Sunil Kumar Sahoo si tiene archivos tan grandes ya que el método 'split (..)' no crea cadenas nuevas, pero reutiliza la cadena subyacente *). – dacwe

2

Tuve la misma pregunta y, aunque las respuestas anteriores son probablemente correctas, no pude conseguir que funcionen correctamente. que era prácticamente seguro un error del operador y la ignorancia de mi parte - pero por si acaso alguien quiere ver cómo - un n00b - finalmente lo hice, aquí está mi solución:

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

No estoy exactamente seguro de por qué esto funcionó para mí cuando lo anterior no lo hizo, ya que no parece fundamentalmente diferente, pero como dije, fue probablemente un error del operador de mi parte.

+0

También me gustaría escuchar cualquier opinión sobre la eficacia (o la falta de ella) de este método frente al que Sunil Kumar Sahoo sugirió ... –

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

} 
Cuestiones relacionadas