web-dev-qa-db-fra.com

Android - Stocker le flux d'entrée dans un fichier

Je récupère un flux XML à partir d'une URL, puis je l'analyse. Ce que je dois faire, c'est également stocker cela en interne sur le téléphone afin que, lorsqu'il n'y a pas de connexion Internet, il puisse analyser l'option enregistrée plutôt que l'option en direct.

Le problème auquel je suis confronté est que je peux créer l'objet url, utilisez getInputStream pour obtenir le contenu, mais cela ne me permettra pas de le sauvegarder.

URL url = null;
InputStream inputStreamReader = null;
XmlPullParser xpp = null;

url = new URL("http://*********");
inputStreamReader = getInputStream(url);

ObjectOutput out = new ObjectOutputStream(new FileOutputStream(new File(getCacheDir(),"")+"cacheFileAppeal.srl"));

//--------------------------------------------------------
//This line is where it is erroring.
//--------------------------------------------------------
out.writeObject( inputStreamReader );
//--------------------------------------------------------
out.close();

Toutes les idées sur la manière de sauvegarder le flux d’entrée afin de pouvoir le charger plus tard.

À votre santé

44
Dobes

La voici est votre inputStreamReader. Utilisez ensuite les mêmes Fichier (nom) et FileInputStream pour lire les données à l’avenir.

try {
    File file = new File(getCacheDir(), "cacheFileAppeal.srl");
    OutputStream output = new FileOutputStream(file);
    try {
        byte[] buffer = new byte[4 * 1024]; // or other buffer size
        int read;

        while ((read = input.read(buffer)) != -1) {
            output.write(buffer, 0, read);
        }

        output.flush();
    } finally {
        output.close();
    }
} finally {
    input.close();
}
88

Fonction simple

Essayez cette fonction simple pour envelopper soigneusement: 

// Copy an InputStream to a File.
//
private void copyInputStreamToFile(InputStream in, File file) {
    OutputStream out = null;

    try {
        out = new FileOutputStream(file);
        byte[] buf = new byte[1024];
        int len;
        while((len=in.read(buf))>0){
            out.write(buf,0,len);
        }
    } 
    catch (Exception e) {
        e.printStackTrace();
    } 
    finally {
        // Ensure that the InputStreams are closed even if there's an exception.
        try {
            if ( out != null ) {
                out.close();
            }

            // If you want to close the "in" InputStream yourself then remove this
            // from here but ensure that you close it yourself eventually.
            in.close();  
        }
        catch ( IOException e ) {
            e.printStackTrace();
        }
    }
}

Merci à Jordan LaPrise et à sa réponse .

30
Joshua Pinter

Une version plus courte:

OutputStream out = new FileOutputStream(file);
fos.write(IOUtils.read(in));
out.close();
in.close();
6
Tuan Chau

Voici une solution qui gère toutes les exceptions et se base sur les réponses précédentes:

void writeStreamToFile(InputStream input, File file) {
    try {
        try (OutputStream output = new FileOutputStream(file)) {
            byte[] buffer = new byte[4 * 1024]; // or other buffer size
            int read;
            while ((read = input.read(buffer)) != -1) {
                output.write(buffer, 0, read);
            }
            output.flush();
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            input.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
4
vovahost

Il y a le chemin de IOUtils:

copy(InputStream input, OutputStream output)

Le code de celui-ci est semblable à ceci:

public static long copyStream(InputStream input, OutputStream output) throws IOException {
    long count = 0L;
    byte[] buffer = new byte[4096]; 
    for (int n; -1 != (n = input.read(buffer)); count += (long) n)
        output.write(buffer, 0, n);
    return count;
}
0
android developer