Android читает большой файл построчно - PullRequest
4 голосов
/ 24 октября 2011

Я работаю над приложением, которое подключается к веб-серверу и получает ответ. Я сохраняю этот ответ в текстовом файле во внутренней памяти устройства. Теперь мне нужно прочитать весь файл построчно, потому что, если я пытаюсь прочитать весь файл, он выдает OutofMemoryException. Итак, сейчас я пишу и читаю файл с таким кодом:

    httpclient = new DefaultHttpClient();
    httppost = new HttpPost("http://www.rpc.probnata.com");


    postParameters = new ArrayList<NameValuePair>();
    postParameters.add(new BasicNameValuePair("debug_data","1"));


    httppost.setEntity(new UrlEncodedFormEntity(postParameters));

    HttpResponse response = httpclient.execute(httppost);
    Log.w("Response ","Status line : "+ response.getStatusLine().toString());
    buffer = EntityUtils.toByteArray(response.getEntity());
    FileOutputStream out = this.openFileOutput("response",this.MODE_PRIVATE);
    out.write(buffer);
    out.close();

Чтение файла:

public void parseResponse(){
    try {
        File myDir = new File(getFilesDir().getAbsolutePath());

        BufferedReader br = new BufferedReader(new FileReader(myDir + "/response"));
        String line;
        while ((line = br.readLine()) != null) {
            Log.v("","line : "+line);
            handleDataFromSync(line);
        }
        br.close();



    } catch (Exception e){
        e.printStackTrace();
    }
}

Этот метод разбирает ответ.

public void handleDataFromSync(final String responseBody) {

        for(int index=0;index<responseBody.length();index++){
                Log.w("Response ","Response size : "+ responseBody.length());
                Log.w("","****************Index is : "+index);

                int objectIdentificator = 0;
                objectIdentificator = Integer.parseInt(responseBody.substring(index,index+packetFieldSizes[0]));  
                Log.w("Response ","Object Identificator (LONGINT) : "+ objectIdentificator);
                index = index+packetFieldSizes[0]; 
                Log.w("","****************Index is (must be 32) : "+index);

                String type = null;
                type = responseBody.substring(index,index + packetFieldSizes[1]);
                Log.w("Response ","TYPE (UNSIGNED BYTE) : "+ type);
                short pType = Short.parseShort(type);
                Log.w("Response ","TYPE (UNSIGNED BYTE) : "+ pType);

                index = index + packetFieldSizes[1];
                Log.w("","****************Index is (must be 35) : "+index);

                String operation=null;
                operation = responseBody.substring(index,index + packetFieldSizes[2]);
                short operationType = Short.parseShort(operation);
                Log.w("Response ","OPERATION (UNSIGNED BYTE) : "+ operation);
                Log.w("Response ","OPERATION (UNSIGNED BYTE) : "+ operationType);
                index = index + packetFieldSizes[2];
                Log.w("","****************Index is (must be 38) : "+index);

                String objectId=null;
                objectId = responseBody.substring(index, index + packetFieldSizes[3]);
                Log.w("Response ","UID (CHAR, length 32) : "+ objectId);
                index = index + packetFieldSizes[3];
                Log.w("","****************Index is (must be 70) : "+index);

                int id=0;
                id = Integer.parseInt(responseBody.substring(index,index + packetFieldSizes[4]));
                Log.w("Response ","ID (LONGINT) : "+ responseBody.substring(index, index + packetFieldSizes[4]));
                Log.w("Response ","ID (LONGINT) : "+ id);
                index = index + packetFieldSizes[4];
                Log.w("","****************Index is (must be 102) : "+index);

                String size=null;
                size = responseBody.substring(index,index + packetFieldSizes[5]); 
                int dataSize = Integer.parseInt(size);
                Log.w("Response ","Data Size (LONGINT) : "+ dataSize);
                index = index + packetFieldSizes[5];
                Log.w("","****************Index is (must be 134) : "+index);

                String hash=null;
                hash = responseBody.substring(index,index + packetFieldSizes[6]);
                Log.w("Response ","Data Hash (CHAR, length 32 : "+ hash);
                index = index + packetFieldSizes[6];
                Log.w("","****************Index is (must be 166) : "+index);

                String  dType=null;
                dType = responseBody.substring(index,index + packetFieldSizes[7]);
                Log.w("Response ","Data Type (UNSIGNED BYTE) : "+ dType);
                short dataType = Short.parseShort(dType);
                Log.w("Response ","Data Type (UNSIGNED BYTE) : "+ dataType);
                index = index + packetFieldSizes[7];
                Log.w("","****************Index is (must be 169) : "+index);

                String data=null;
                data = responseBody.substring(index, index + dataSize);
                Log.w("Response ","Data (CHAR, any length, in BASE64) : "+ data);

                index = (index + dataSize)-1;
                Log.w("","****************Index is must be  : "+index);
                byte[] first = Base64.decode(data);
                String string = new String(first, "UTF-8");
                Log.w("Response ","BASE 64 : "+ string);
      }
}

Так что любая идея, как читать следующую строку, потому что этот код сейчас выполняет чтение первой строки, а после этого пытается снова прочитать первую строку.

1 Ответ

2 голосов
/ 25 октября 2011

Ваша реализация bufferedReader выглядит нормально, поэтому я подозреваю, что в вашем методе handleDataFromSync что-то происходит.Из кода я бы сделал вывод, что каждый responseBody является строкой неопределенной длины, но с повторяющимися шаблонами значений в известных позициях.Потенциальными виновниками могут быть ваш packageFieldSizes [], который мы не можем проверить, и значение dataSize.

Проверьте, что зарегистрированные значения индекса - это то, что вы ожидаете от них, и что вы фактически делаете это из вашего handleDataFromSync.Если это так, то с вашим bufferedReader что-то не так, что я не видел, и вам нужно добавить дополнительную запись в журнал, чтобы определить причину сбоя на этом шаге.

...