wake-up-neo.com

Android - Speichern Sie den Inputstream in einer Datei

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

44
Dobes

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

Einfache Funktion

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 .

30
Joshua Pinter

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

8
vovahost

Eine kürzere Version:

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

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

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;
}
0