0

最初にアプリケーションでファイルをダウンロードし、try.pdf という名前で保存します。

ここのコード:

try {

URL url = new URL(aurl[0]);
    URLConnection conexion = url.openConnection();
    conexion.connect();

    int lenghtOfFile = conexion.getContentLength();
    Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile);

    InputStream input = new BufferedInputStream(url.openStream());
    FileOutputStream fos = openFileOutput("try.pdf", Context.MODE_PRIVATE);

    byte data[] = new byte[1024];

    long total = 0;

        while ((count = input.read(data)) != -1) {
            total += count;
            publishProgress(""+(int)((total*100)/lenghtOfFile));
            fos.write(data, 0, count);
        }

        fos.flush();
        fos.close();
        input.close();
} catch (Exception e) {}
return null;

}

さて、次のコードを使用して開きたいときに問題が発生します。

   try {
    FileInputStream in = openFileInput("try.pdf"); 
    InputStreamReader inputStreamReader = new InputStreamReader(in); 
    BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 
    StringBuilder sb = new StringBuilder(); 
    String line; 
    try {
        while ((line = bufferedReader.readLine()) != null){ 
            sb.append(line); 
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

FileInputStream でファイル「try.pdf」を使用してファイルを読み取ろうとすると、エラー outOfMemory が発生します。解決策はありますか?

ありがとう

4

2 に答える 2

0

私が疑う問題は、C'ish DOS シングル スレッドのコーディング スタイルにあります。

while ((count = input.read(data)) != -1) {
        total += count;
        publishProgress(""+(int)((total*100)/lenghtOfFile));
        fos.write(data, 0, count);
    }

再び同じ C'ish DOC シングル スレッド スタイル

while ((line = bufferedReader.readLine()) != null){ 
        sb.append(line); 

2 つの異なるスレッド (明らかに非 UI) で read と publishProgress (readLine と append) が必要です。1 つのスレッドが待機中のデータのキューに追加すると、もう 1 つのスレッドがそこからプルします。このようにして、CPU 時間をチラックスに少し与えています。

この 2 つのスレッド間共有キューには、必ず LinkedList と ArrayList を使用してください。

于 2012-06-27T08:50:40.333 に答える
0

これの最も可能性の高い原因は、ファイルが大きすぎてメモリに保持できないことです (そして、ファイル全体をメモリにロードしようとしているようです) - ただし、エラー自体は、割り当ての失敗が発生したときに突き止められます.

また、それが実際にプレーンテキストファイルではなくpdfファイルである場合、BufferedReaderがそれを正しく読み取ることができるとは思いません(おそらく、おそらく含まれていないCRLFが必要なため、改行が正しく行われないでしょう) pdf バイナリ)。

大きすぎる場合は、(何をしているかに応じて)画面に表示されるものを制御し、そのデータのみをロードするか、処理している場合は 1 つではなく小さなチャンクで処理する必要があります。表示するのではなく。

于 2012-06-27T08:40:34.733 に答える