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