2011-01-06 1 views
2

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

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

+0

FWIW, на некоторых устройствах SD карта быстрее, чем внутренняя Flash. Вы можете попробовать несколько тестов ввода-вывода. – fadden

+0

Спасибо. (Фактически, я понял, что скорость ввода-вывода не была большой проблемой для меня ... оказалось, что метод, который я использовал для отображения текста в формате HTML, был очень неэффективным и вызывал большую задержку. обсуждается в другом потоке.) – prepbgg

ответ

7

Если вы вытаскиваете файл для использования в своем приложении, то, что я предлагаю вам сделать, читается в данных, а затем записывает в память данные, которые вы собрали в какой-то читатель (возможно, 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); 
} 
+0

Спасибо. Это похоже на то, что мне нужно (при условии, что у меня может быть ByteArray достаточно большой, чтобы вмещать до 2 мегабайт). – prepbgg

+0

ОК. Я следил за вашим примером кода, и, похоже, он работает хорошо. Тем не менее, результат заключается в том, что чтение через BAOS и StringReader кажется несколько медленнее, чем просто использование BufferedReader br = new BufferedReader (новый FileReader (файл)); '. Это заставило меня использовать LogCat для более тщательного изучения таймингов, и я вижу, что процесс чтения текста из файла довольно быстрый, даже чтение с SD-карты. Теперь я вижу, что задал неправильный вопрос. ... – prepbgg

+0

... Большая проблема - время, затраченное на отображение извлеченного текста. Мой код читает выбранные строки из входного файла в объект Stbbilder Sb, а затем отображает это в TextView с помощью 'tv.setText (Html.fromHtml (sb.toString()));' для 50 "строк" (или абзацев) усреднения около 1 КБ на строку 3 строки кода: '\t \t setContentView (R.layout.displaytext); \t \t TextView tv = (TextView) findViewById (R.id.display_text); \t \t tv.setText (Html.fromHtml (text.toString())); 'требуется 5 секунд или более для обработки. Есть ли у вас какие-либо предложения относительно того, как ускорить этот показ? Должен спросить об этом как о новом вопросе? – prepbgg

1

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

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

+0

Спасибо за ваш очень быстрый ответ. Максимальный размер текстового файла, вероятно, меньше 2 мегабайт, а «строки» текста могут составлять всего несколько килобайт. Я использовал BufferedReader для чтения с SD-карты по очереди за раз. Можете ли вы порекомендовать наиболее подходящую структуру данных для хранения файла и методов, которые я должен использовать для чтения в большом объеме из SD, а затем для чтения из памяти программ по одной строке за раз, пожалуйста? – prepbgg

+0

Если ваша цель - обрабатывать данные HTML, возможно, вам стоит взглянуть на потоковый анализатор. Я считаю, что библиотеки apache и/или xerces могут достичь этого. Кроме того, я нашел эту страницу в android dev docs. http://developer.android.com/training/basics/network-ops/xml.html – iHearGeoff

Смежные вопросы