Android читает большой файл построчно

#android #file #readfile

#Android #файл #readfile

Вопрос:

Я работаю над приложением, которое подключается к веб-серверу и получает ответ. Я сохраняю этот ответ в текстовом файле во внутренней памяти устройства. Теперь мне нужно прочитать весь файл построчно, потому что, если я попытаюсь прочитать весь файл, он выдает 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:

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

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

Комментарии:

1. На самом деле я обнаружил, что проблема заключается в чтении файла. Если мой ответ меньше 30 КБ, он добавляет некоторые символы в конец ответа, чтобы достичь 30 КБ, и это вызывало исключение. Спасибо за ответ! Я отмечаю это как принятое, потому что вы единственный, кто отвечает на мой вопрос 🙂 Спасибо!