Android – Stocker les stream d’entrée dans un fichier

Je récupère un stream XML à partir d’une URL et ensuite l’parsing. Ce que je dois faire est également de stocker cela en interne sur le téléphone afin que, quand il n’y a pas de connexion Internet, il puisse parsingr l’option enregistrée plutôt que celle en direct.

Le problème auquel je suis confronté est que je peux créer l’object url, utiliser 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 façon dont je peux procéder pour enregistrer le stream d’entrée afin que je puisse le charger plus tard.

À votre santé

Ici, l’entrée est votre inputStreamReader . Utilisez ensuite le même fichier (name) et FileInputStream pour lire les données ultérieurement.

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

Fonction simple

Essayez cette fonction simple pour bien l’emballer dans:

 // 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 .

Une version plus courte:

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

Voici une solution qui gère toutes les exceptions et est basée 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(); } } } 

Il y a la voie de IOUtils:

 copy(InputStream input, OutputStream output) 

Le code de celui-ci est similaire à 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; }