Autore Topic: Leggere un file di testo dalla directory assets  (Letto 9886 volte)

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Leggere un file di testo dalla directory assets
« il: 08 Luglio 2010, 15:12:17 CEST »
+1
fileName è il nome del file presente all'interno della directory assets del progetto.

Codice (Java): [Seleziona]
public static CharSequence readTextFile(Context context, String fileName) {
                BufferedReader in = null;
                try {
                        in = new BufferedReader(new InputStreamReader(context.getAssets().open(fileName)));
                        String line;
                        StringBuilder buffer = new StringBuilder();
                        while ((line = in.readLine()) != null) buffer.append(line).append('\n');
                        return buffer;
                } catch (IOException e) {
                        Log.e("readTextFile", "Error readind file " + fileName, e);
                        return "";
                } finally {
                        if (in != null) {
                                try {
                                        in.close();
                                } catch (IOException e) {
                                        // Ignore
                                }
                        }
                }
        }
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline Christian Giupponi

  • Utente junior
  • **
  • Post: 128
  • Respect: 0
    • Google+
    • http://it.linkedin.com/pub/christian-giupponi/29/628/810
    • ultimoprofeta
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    ItalianDevTeam
  • Sistema operativo:
    Mac OSX Lion
Re:Leggere un file di testo dalla directory assets
« Risposta #1 il: 08 Luglio 2010, 17:50:04 CEST »
0
Scusa, cosa sarebbe?

Codice (Java): [Seleziona]
Context context

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Leggere un file di testo dalla directory assets
« Risposta #2 il: 08 Luglio 2010, 18:23:02 CEST »
0
Citazione
On Android, a Context is used for many operations but mostly to load and access resources. This is why all the widgets receive a Context parameter in their constructor. In a regular Android application, you usually have two kinds of Context, Activity  and Application. It's usually the first one that the developer passes to classes and methods that need a Context:
Codice (Java): [Seleziona]
@Override
protected void onCreate(Bundle state) {
  super.onCreate(state);
 
  TextView label = new TextView(this);
  label.setText("Leaks are bad");
 
  setContentView(label);
}

This means that views have a reference to the entire activity and therefore to anything your activity is holding onto; usually the entire View hierarchy and all its resources. Therefore, if you leak the Context ("leak" meaning you keep a reference to it thus preventing the GC from collecting it), you leak a lot of memory. Leaking an entire activity can be really easy if you're not careful.
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline sergio

  • Nuovo arrivato
  • *
  • Post: 26
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Legend
Re:Leggere un file di testo dalla directory assets
« Risposta #3 il: 27 Luglio 2010, 15:21:40 CEST »
0
Ciao JD, grazie per questo utile topic.
Sono un novellino, quindi magari ti faccio una domanda un pò stupida.
Come potrei passare il nome del file da leggere al mio metodo readTextFile ?
Ho provato come path, ma ottengo un VM Shutdown.
grazie anticipatamente

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Leggere un file di testo dalla directory assets
« Risposta #4 il: 27 Luglio 2010, 15:25:02 CEST »
0
Come potrei passare il nome del file da leggere al mio metodo readTextFile

Dov'è il file? SD Card?


Offline sergio

  • Nuovo arrivato
  • *
  • Post: 26
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Legend
Re:Leggere un file di testo dalla directory assets
« Risposta #5 il: 27 Luglio 2010, 15:31:36 CEST »
0
Scusa se non ho specificato questa cosa.
Sto facendo delle prove dall'emulatore e il file è nella cartella assets.

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Leggere un file di testo dalla directory assets
« Risposta #6 il: 28 Luglio 2010, 14:45:19 CEST »
0
Se stai usando il mio snippet nella readTextFile devi indicare il nome del file presente nella directory assets, senza path o altro ;)
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline sergio

  • Nuovo arrivato
  • *
  • Post: 26
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Legend
Re:Leggere un file di testo dalla directory assets
« Risposta #7 il: 28 Luglio 2010, 15:17:04 CEST »
0
grazie per la risposta JD, sto usando proprio il tuo snippet.
Ho già provato passando solo il filename, ma sbaglio qualcosa probabilmente
perchè ottengo uno "Shutting down VM" come vedi dal log in basso.
PS: inizializzo la variabile da passare al metodo readTextFile()
Codice (Java): [Seleziona]
String filename = "file.txt";
Codice (Java): [Seleziona]
07-28 13:04:14.299: DEBUG/AndroidRuntime(332): Shutting down VM
07-28 13:04:14.310: WARN/dalvikvm(332): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
07-28 13:04:14.310: ERROR/AndroidRuntime(332): Uncaught handler: thread main exiting due to uncaught exception
07-28 13:04:14.329: ERROR/AndroidRuntime(332): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.FileReader/com.FileReader.FileReader}: java.lang.NullPointerException
07-28 13:04:14.329: ERROR/AndroidRuntime(332):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
07-28 13:04:14.329: ERROR/AndroidRuntime(332):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
07-28 13:04:14.329: ERROR/AndroidRuntime(332):     at android.app.ActivityThread.access$2200(ActivityThread.java:119)
07-28 13:04:14.329: ERROR/AndroidRuntime(332):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
07-28 13:04:14.329: ERROR/AndroidRuntime(332):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-28 13:04:14.329: ERROR/AndroidRuntime(332):     at android.os.Looper.loop(Looper.java:123)
07-28 13:04:14.329: ERROR/AndroidRuntime(332):     at android.app.ActivityThread.main(ActivityThread.java:4363)
07-28 13:04:14.329: ERROR/AndroidRuntime(332):     at java.lang.reflect.Method.invokeNative(Native Method)
07-28 13:04:14.329: ERROR/AndroidRuntime(332):     at java.lang.reflect.Method.invoke(Method.java:521)
07-28 13:04:14.329: ERROR/AndroidRuntime(332):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
07-28 13:04:14.329: ERROR/AndroidRuntime(332):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
07-28 13:04:14.329: ERROR/AndroidRuntime(332):     at dalvik.system.NativeStart.main(Native Method)
07-28 13:04:14.329: ERROR/AndroidRuntime(332): Caused by: java.lang.NullPointerException
07-28 13:04:14.329: ERROR/AndroidRuntime(332):     at com.FileReader.FileReader.readTextFile(FileReader.java:33)
07-28 13:04:14.329: ERROR/AndroidRuntime(332):     at com.FileReader.FileReader.onCreate(FileReader.java:25)
07-28 13:04:14.329: ERROR/AndroidRuntime(332):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-28 13:04:14.329: ERROR/AndroidRuntime(332):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)
07-28 13:04:14.329: ERROR/AndroidRuntime(332):     ... 11 more

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Leggere un file di testo dalla directory assets
« Risposta #8 il: 28 Luglio 2010, 16:17:23 CEST »
0
Strano, sicuro che il file sia presente nella directory assets e che si chiami esattamente "file.txt" (rispettando anche le maiuscole)?

Ho ricreato un progetto da zero e funziona perfettamente:

Codice (Java): [Seleziona]
package com.android.hello;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;


public class HelloAndroid extends Activity {

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);

                CharSequence cs = readTextFile(this, "file.txt");
                Toast.makeText(this, cs.toString(), Toast.LENGTH_LONG).show();

        }
        public static CharSequence readTextFile(Context context, String fileName) {
                BufferedReader in = null;
                try {
                        in = new BufferedReader(new InputStreamReader(context.getAssets().open(fileName)));
                        String line;
                        StringBuilder buffer = new StringBuilder();
                        while ((line = in.readLine()) != null) buffer.append(line).append('\n');
                        return buffer;
                } catch (IOException e) {
                        Log.e("readTextFile", "Error readind file " + fileName, e);
                        return "";
                } finally {
                        if (in != null) {
                                try {
                                        in.close();
                                } catch (IOException e) {
                                        // Ignore
                                }
                        }
                }
        }
}
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline sergio

  • Nuovo arrivato
  • *
  • Post: 26
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Legend
Re:Leggere un file di testo dalla directory assets
« Risposta #9 il: 29 Luglio 2010, 11:41:59 CEST »
0
funziona! grazie mille JD!
Appena ho tempo cerco di capire quale era il motivo per cui avevo quel risultato.

Offline Christian Giupponi

  • Utente junior
  • **
  • Post: 128
  • Respect: 0
    • Google+
    • http://it.linkedin.com/pub/christian-giupponi/29/628/810
    • ultimoprofeta
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    ItalianDevTeam
  • Sistema operativo:
    Mac OSX Lion
Re:Leggere un file di testo dalla directory assets
« Risposta #10 il: 27 Settembre 2010, 18:01:13 CEST »
0
scusate ma come dovrei fare per scrivere sempre in un file che è nella cartella asset?

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Leggere un file di testo dalla directory assets
« Risposta #11 il: 27 Settembre 2010, 18:05:35 CEST »
0
Non te lo posso dare per certo ma secondo me, al 99%, tutto quello che sta in asset è in sola lettura :P
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline Christian Giupponi

  • Utente junior
  • **
  • Post: 128
  • Respect: 0
    • Google+
    • http://it.linkedin.com/pub/christian-giupponi/29/628/810
    • ultimoprofeta
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    ItalianDevTeam
  • Sistema operativo:
    Mac OSX Lion
Re:Leggere un file di testo dalla directory assets
« Risposta #12 il: 27 Settembre 2010, 18:07:04 CEST »
0
Non te lo posso dare per certo ma secondo me, al 99%, tutto quello che sta in asset è in sola lettura :P

ah ok...e dove mi consigli di mettere un file che deve sia essere letto che scritto?

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Leggere un file di testo dalla directory assets
« Risposta #13 il: 27 Settembre 2010, 18:17:59 CEST »
0
Se possibile, sulla SD. Quanto spesso devi accedere a questo file? Potrebbe essere sostituito con un DB?
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline Christian Giupponi

  • Utente junior
  • **
  • Post: 128
  • Respect: 0
    • Google+
    • http://it.linkedin.com/pub/christian-giupponi/29/628/810
    • ultimoprofeta
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Play Store ID:
    ItalianDevTeam
  • Sistema operativo:
    Mac OSX Lion
Re:Leggere un file di testo dalla directory assets
« Risposta #14 il: 27 Settembre 2010, 18:22:03 CEST »
0
Se possibile, sulla SD. Quanto spesso devi accedere a questo file? Potrebbe essere sostituito con un DB?

è un file di configurazione che deve contenere dati sensibili quindi eviterei di usare la SD.
Per quanto riguarda il DB i dati da memorizzare non occupano molto quindi mi sembra un po' uno spreco ma non lo escludo anche perchè velocizzerebbe il lavoro di ricerca!

googolando ho trovato questa discussione: anddev.org • View topic - Write to and read from a file
provo un po' a vedere come funziona e al massimo opto per il DB