developer.android.com/training/basics/network-ops/xml.html

таю, что чтение одной строки за раз из текстового файла на SD-карте происходит довольно медленно. Я полагаю, что это может быть быстрее, если файл находится во внутренней памяти, поэтому я хочу скопировать файлы с SD-карты во внутреннюю память.

Примеры копирования файлов, которые я могу найти в Интернете, похоже, включают в себя копирование одного байта за раз из InputStream в OutputStream или из FileReader в FileWriter. Это действительно самый быстрый и самый эффективный метод?

 prepbgg08 янв. 2011 г., 12:28
Благодарю. (На самом деле, я понял, что скорость ввода-вывода не была для меня большой проблемой ... оказалось, что метод, который я использовал для отображения текста в формате HTML, был очень неэффективным и вызывал большую задержку. обсуждается в другой ветке.)
 fadden08 янв. 2011 г., 00:00
FWIW, на некоторых устройствах SD-карта быстрее, чем внутренняя Flash. Вы можете попробовать несколько тестов ввода / вывода.

Ответы на вопрос(2)

который становится все более верным со временем, когда процессоры становятся быстрее:Ввод / вывод медленный.

Если вы хотите скорость, как правило, лучше всегоделайте как можно меньше операций ввода / вывода, В идеале выясните, насколько велик этот файл, выделите столько памяти, а затемпрочитайте все это в одном большом вводе / выводе, Тогда вы можете просто получить доступ к данным из памяти программы. Если у вас может не хватить ОЗУ для каждого приемлемого размера файла, вам, возможно, придется проделать немного больше работы, но это то, к чему вы должны стремиться.

 prepbgg06 янв. 2011 г., 16:12
Спасибо за ваш очень быстрый ответ. Мой максимальный размер текстового файла, вероятно, составляет менее 2 мегабайт, а «строки» текста могут быть размером до нескольких килобайт. Я использовал BufferedReader для чтения с SD-карты строки за один раз. Можете ли вы порекомендовать наиболее подходящую структуру данных для хранения файла и методы, которые я должен использовать для массового чтения с SD, а затем для чтения из памяти программ по одной строке за раз, пожалуйста?
 iHearGeoff13 дек. 2012 г., 20:25
Если ваша цель заключается в обработке данных HTML, возможно, вам следует обратиться к потоковому анализатору. Я считаю, что библиотеки Apache и / или Xerces могут достичь этого. Кроме того, я нашел эту страницу в документации разработчика Android.developer.android.com/training/basics/network-ops/xml.html
Решение Вопроса

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

Вот пример того, что я обычно делаю:

// Assumption: I already have the file object I want to read
// Note: I'm not doing any error handling.
InputStream input = new FileInputStream(file);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int bytesRead = 0;
while( (bytesRead = input.read(buffer)) > 0){
    baos.write(buffer, 0, bytesRead);
}
StringReader stringReader = new StringReader( new String(baos.toByteArray()) );
BufferedReader bufferedReader = new BufferedReader( stringReader );
for(String line : bufferedReader.readLine()){
    // TODO: Handle each line appropriately or something
    Log.d("Reading Data Example", line);
}
 prepbgg06 янв. 2011 г., 19:40
Спасибо за предложение. Тем не менее, я боюсь, что многопоточность слишком сложна для меня. Кроме того, нет никаких других задач, с которыми приложение может справиться, ожидая отображения текста.
 csaunders06 янв. 2011 г., 19:31
Я думаю, что это может быть уместно, как другой вопрос. Чтобы сделать быстрое предложение, возможно, нужно выполнить некоторые AsyncTasks, чтобы разгрузить работу из потока пользовательского интерфейса, а затем просто обновить пользовательский интерфейс при поступлении данных.
 prepbgg06 янв. 2011 г., 17:00
Благодарю. Это выглядит как раз то, что мне нужно (при условии, что у меня может быть достаточно большой ByteArray, чтобы вместить до 2 мегабайт).
 prepbgg06 янв. 2011 г., 18:28
... большая проблема - время, необходимое для отображения извлеченного текста. Мой код читает выбранные строки из входного файла в объект StringBuilder sb, а затем отображает это в TextView, используяtv.setText(Html.fromHtml(sb.toString())); Для 50 «строк» ​​(или абзацев) в среднем около 1 КБ на строку 3 строки кода: `setContentView (R.layout.displaytext); TextView tv = (TextView) findViewById (R.id.display_text); tv.setText (Html.fromHtml (text.toString ())); `займет 5 секунд или больше для обработки. Есть ли у вас какие-либо предложения о том, как ускорить этот дисплей? Стоит ли задавать это как новый вопрос?
 prepbgg06 янв. 2011 г., 18:23
ХОРОШО. Я следовал вашему примеру кода, и он, кажется, работает хорошо. Тем не менее, результат заключается в том, что чтение через BAOS и StringReader кажется немного медленнее, чем простое использованиеBufferedReader br = new BufferedReader(new FileReader(file));, Это заставило меня использовать LogCat для более тщательного изучения времени, и я вижу, что процесс чтения текста из файла происходит довольно быстро, даже чтение с SD-карты. Теперь я вижу, что задал не тот вопрос. ...

Ваш ответ на вопрос