213 votes

lire le fichier à partir d'actifs

 public class Utils {

    public static List<Message> getMessages() {

    //File file = new File("file:///android_asset/helloworld.txt");

    AssetManager assetManager = getAssets();
    InputStream ims = assetManager.open("helloworld.txt");

     }
}
 

J'utilise ce code en essayant de lire un fichier à partir d'actifs. J'ai essayé deux façons de le faire. Tout d'abord, lorsque File utilisé, j'ai reçu FileNotFoundException , lorsque la méthode AssetManager getAssets() n'est pas reconnue. Y a-t-il une solution ici?

258voto

HpTerm Points 3412

Voici ce que je fais dans une activité pour le tampon de lecture étendre/modifier pour l'adapter à vos besoins

BufferedReader reader = null;
try {
    reader = new BufferedReader(
        new InputStreamReader(getAssets().open("filename.txt")));

    // do reading, usually loop until end of file reading  
    String mLine = reader.readLine();
    while (mLine != null) {
       //process line
       ...
       mLine = reader.readLine(); 
    }
} catch (IOException e) {
    //log the exception
} finally {
    if (reader != null) {
         try {
             reader.close();
         } catch (IOException e) {
             //log the exception
         }
    }
}

EDIT : Ma réponse est peut-être inutile si votre question est: comment faire en dehors d'une activité. Si votre question est simplement de savoir comment lire un fichier à partir d'actifs, alors la réponse est ci-dessus.

Mise à JOUR :

Pour ouvrir un fichier en spécifiant le type d'ajouter simplement le type dans la InputStreamReader appel en tant que de suivre.

BufferedReader reader = null;
try {
    reader = new BufferedReader(
        new InputStreamReader(getAssets().open("filename.txt"), "UTF-8")); 

    // do reading, usually loop until end of file reading 
    String mLine = reader.readLine();
    while (mLine != null) {
       //process line
       ...
       mLine = reader.readLine(); 
    }
} catch (IOException e) {
    //log the exception
} finally {
    if (reader != null) {
         try {
             reader.close();
         } catch (IOException e) {
             //log the exception
         }
    }
}

MODIFIER

@Stan dit dans le commentaire, le code que je donne n'est pas en additionnant les lignes. mLine est remplacé à chaque passe. C'est pourquoi j'ai écrit //process line. Je suppose que le fichier contient une sorte de données (j'.e une liste de contacts) et chaque ligne doit être traitée séparément.

Dans le cas où vous souhaitez simplement charger le fichier sans aucun type de traitement, vous aurez pour résumer mLine lors de chaque passage à l'aide de StringBuilder() et en ajoutant à chaque passage.

UNE AUTRE ÉDITION

Selon le commentaire de @Vincent j'ai ajouté de l' finally bloc.

Notez également que dans Java 7 et supérieure, vous pouvez utiliser try-with-resources utilisation de l' AutoCloseable et Closeable caractéristiques de ces dernières Java.

69voto

user370305 Points 46287
 getAssets()
 

Cela ne fonctionne que dans Activité dans les autres classes où vous devez utiliser Context .

Créez un constructeur pour la classe Utils qui passe en référence à une référence d'activité (moche) ou à un contexte d'application. En utilisant cela, utilisez getAsset () dans votre classe Utils.

62voto

Florin Mircea Points 198

Mieux vaut tard que jamais.

J'ai eu de la difficulté à lire des fichiers ligne par ligne dans certaines circonstances. La méthode ci-dessous est le meilleur que j'ai trouvé, jusqu'à présent, et je vous la recommande.

Utilisation: String yourData = LoadData("YourDataFile.txt");

YourDataFile.txt est supposé résider dans les actifs/

 public String LoadData(String inFile) {
        String tContents = "";

    try {
        InputStream stream = getAssets().open(inFile);

        int size = stream.available();
        byte[] buffer = new byte[size];
        stream.read(buffer);
        stream.close();
        tContents = new String(buffer);
    } catch (IOException e) {
        // Handle exceptions here
    }

    return tContents;

 }

EDIT. Problème Apparent: cette fonction renvoie cette chaîne:

'android.contenu.res.D'assetmanager$AssetInputStream@[code]'

au lieu du contenu du fichier. Je n'arrive pas encore à reproduire le problème. Jusqu'à ce que je mette à jour ma réponse quand j'ai ce problème, considérons le code ci-dessus est probablement peu fiable'.

41voto

swathi Points 397
public String ReadFromfile(String fileName, Context context) {
    StringBuilder returnString = new StringBuilder();
    InputStream fIn = null;
    InputStreamReader isr = null;
    BufferedReader input = null;
    try {
        fIn = context.getResources().getAssets()
                .open(fileName, Context.MODE_WORLD_READABLE);
        isr = new InputStreamReader(fIn);
        input = new BufferedReader(isr);
        String line = "";
        while ((line = input.readLine()) != null) {
            returnString.append(line);
        }
    } catch (Exception e) {
        e.getMessage();
    } finally {
        try {
            if (isr != null)
                isr.close();
            if (fIn != null)
                fIn.close();
            if (input != null)
                input.close();
        } catch (Exception e2) {
            e2.getMessage();
        }
    }
    return returnString.toString();
}

12voto

Siva Charan Points 10518
AssetManager assetManager = getAssets();
InputStream inputStream = null;
try {
    inputStream = assetManager.open("helloworld.txt");
}
catch (IOException e){
    Log.e("message: ",e.getMessage());
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X