Ich rufe einen XML-Feed von einer URL ab und analysiere ihn dann. Ich muss das auch intern im Telefon speichern, so dass es, wenn keine Internetverbindung besteht, die gespeicherte Option statt der Live-Option parsen kann.
Das Problem, mit dem ich konfrontiert bin, ist, dass ich das URL-Objekt erstellen kann. Verwenden Sie getInputStream, um den Inhalt abzurufen, aber ich kann es nicht speichern.
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();
Irgendwelche Ideen, wie ich den Eingabestrom speichern kann, damit ich ihn später laden kann.
Prost
Hier ist es, Ihre Eingabe ist Ihre inputStreamReader
. Verwenden Sie dann dieselbe Datei (Name) und FileInputStream
, um die Daten in Zukunft zu lesen.
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();
}
Probieren Sie diese einfache Funktion aus, um sie ordentlich einzuwickeln:
// 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();
}
}
}
Dank an Jordan LaPrise und seine Antwort .
Kotlin Version (getestet und keine Bibliothek erforderlich):
fun copyStreamToFile(inputStream: InputStream, outputFile: File) {
inputStream.use { input ->
val outputStream = FileOutputStream(outputFile)
outputStream.use { output ->
val buffer = ByteArray(4 * 1024) // buffer size
while (true) {
val byteCount = input.read(buffer)
if (byteCount < 0) break
output.write(buffer, 0, byteCount)
}
output.flush()
}
}
}
Wir nutzen die Funktion use
, die beide Streams am Ende automatisch schließt.
Die Streams werden auch im Ausnahmefall ordnungsgemäß geschlossen.
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/use.html
https://kotlinlang.org/docs/tutorials/kotlin-for-py/scoped-resource-usage.html
Eine kürzere Version:
OutputStream out = new FileOutputStream(file);
fos.write(IOUtils.read(in));
out.close();
in.close();
Hier ist eine Lösung, die alle Ausnahmen behandelt und auf den vorherigen Antworten basiert:
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();
}
}
}
Es gibt den Weg von IOUtils:
copy(InputStream input, OutputStream output)
Der Code davon ist ähnlich:
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;
}