3

大きなストリーム(4MB)を文字列に変換しようとしていますが、最終的にはそれをJSON配列に変換します。

ストリームサイズが小さい場合(KB単位)、すべてが正常に機能し、4MBのストリームの処理を開始した瞬間にメモリが不足します

以下は、ストリームを文字列に変換するために使用するものです。ほとんどすべてのことを試しましたが、問題はwhileループにあると思われます。誰か助けてもらえますか?

  public String convertStreamToString(InputStream is)
            throws IOException {

        if (is != null) {
            Writer writer = new StringWriter();

            char[] buffer = new char[1024];
            try
            {
                Reader reader = new BufferedReader(
                        new InputStreamReader(is, "UTF-8"));
                int n;
                while ((n = reader.read(buffer)) != -1) 
                {
                    writer.write(buffer, 0, n);
                }
            }
            finally 
            {
                is.close();
            }
            return writer.toString();
        } else {       
            return "";
        }
    }

更新:わかりました、これは私が現時点で到達した場所です、私は正しい軌道に乗っていますか?私は近くにいると思います..メモリを取り戻すために他に何を閉じるかフラッシュできるかわかりません..

public String convertStreamToString(InputStream is)
        throws IOException {

    String encoding = "UTF-8";
    int maxlines = 2000;
    StringWriter sWriter = new StringWriter(7168);
    BufferedWriter writer = new BufferedWriter(sWriter);
    BufferedReader reader = null;
    if (is == null) {
        return "";
    } else {     


        try {
            int count = 0;
            reader = new BufferedReader(new InputStreamReader(is, encoding));
            for (String line; (line = reader.readLine()) != null;) {
                if (count++ % maxlines == 0) {
                    sWriter.close();
                    // not sure what else to close or flush here to regain memory
                    //Log.v("Max Lines Reached", "Max Lines Reached");;
                }

                writer.write(line);


            }
            Log.v("Finished Loop", "Looping over");


    } finally {
        is.close();
        writer.close();

    }
        return writer.toString();
    }
}
4

1 に答える 1