66

URLからXMLフィードを取得し、それを解析しています。私がする必要があるのは、インターネット接続がないときにライブオプションではなく保存されたオプションを解析できるように、それを電話の内部に保存することです。

私が直面している問題は、urlオブジェクトを作成し、getInputStreamを使用してコンテンツを取得できることですが、保存できません。

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

後でロードできるように、入力ストリームを保存する方法についてのアイデア。

乾杯

4

8 に答える 8

117

これが、入力はあなたinputStreamです。次に、同じファイル(名前)を使用FileInputStreamして、将来データを読み取ります。

try {
    File file = new File(getCacheDir(), "cacheFileAppeal.srl");
    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();
    }
} finally {
    input.close();
}
于 2012-06-01T21:12:03.017 に答える
35

シンプルな機能

この単純な関数を試して、次のようにまとめてください。

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

ジョーダン・ラプリスと彼の答えに感謝します。

于 2015-01-24T23:15:18.260 に答える
24

Kotlinバージョン(テスト済みでライブラリは不要):

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

use最後に両方のストリームを自動的に閉じる機能を利用します。

例外が発生した場合でも、ストリームは正しく閉じられます。

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/use.html
https://kotlinlang.org/docs/tutorials/kotlin-for-py/scoped-resource-usage.html

于 2019-05-10T08:57:18.127 に答える
7

短いバージョン:

OutputStream out = new FileOutputStream(file);
fos.write(IOUtils.read(in));
out.close();
in.close();
于 2016-10-10T10:28:43.730 に答える
7

これは、すべての例外を処理し、以前の回答に基づいたソリューションです。

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();
        }
    }
}
于 2017-12-19T16:45:21.247 に答える
3
  1. アプリケーションのbuild.gradleファイルで、以下を追加しますdependencies
    implementation 'commons-io:commons-io:2.5'
  1. あなたのコードでは:
import org.apache.commons.io.FileUtils;

// given you have a stream, e.g.
InputStream inputStream = getContext().getContentResolver().openInputStream(uri);

// you can now write it to a file with
FileUtils.copyToFile(inputStream, new File("myfile.txt"));

于 2020-03-08T15:34:37.133 に答える
1

IOUtilsの方法は次のとおりです。

copy(InputStream input, OutputStream output)

そのコードはこれに似ています:

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;
}
于 2017-12-09T17:37:49.803 に答える
0

GoogleGuavaを使用できます

 import com.google.common.io.ByteStreams;

コード:

 try (FileOutputStream fos = new FileOutputStream(new File("C:\\example.txt"))){
      ByteStreams.copy(inputStream, fos)
 }
于 2021-11-29T06:31:36.913 に答える