#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 КБ, и это вызывало исключение. Спасибо за ответ! Я отмечаю это как принятое, потому что вы единственный, кто отвечает на мой вопрос
Спасибо!