Чтение файла возвращает длинную строку без "пробелов, переносов" - PullRequest
0 голосов
/ 19 июня 2011

Хорошо все;

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

вывод будет: firstlinesecondlinethirdline

код:

public void onItemSelected(AdapterView parent, View v,
int position, long id) {

    String filename = getFileName(position);
    InputStreamReader ls = null;

    try {
        AssetManager am = getResources().getAssets();
         ls = new InputStreamReader(am.open(filename), "UTF-8");


            StringBuffer sb = new StringBuffer();
            while( true ) {
                int c = ls.read();
                if( c < 0 )
                    break;
                if( c >= 32 )
                    sb.append( (char)c );       
        selection.setText(new String(sb));
            }

    } catch(IOException e) {
        Log.e(LOG_APP_TAG, e.getMessage());
    } finally {
        if (ls != null) {
            try {
                ls.close();
            } catch (IOException e) {
                Log.e(LOG_APP_TAG, e.getMessage());
            }
        }
    }


}

Ответы [ 2 ]

1 голос
/ 19 июня 2011

Ваш код имеет несколько проблем:

  • не рекомендуется использовать ключевое слово break
  • использование цикла с условием (true) и его прерывание в случае чего-то очень близко к "переходу к программированию" и его следует избегать

вы можете иметь что-то вроде

boolean finished = true;
while( !finished )
{
   if( c < 0 ) 
      finished = true;
}//while

Этот тип цикла более приятен для чтения и не «шокирует», поскольку при его прочтении не существует «бесконечного цикла».

Более того, вам следует рассмотреть возможность использования BufferedReader для чтения текстовых файлов. Этот класс предоставит вам строки символов, которые дадут более простой код:

BufferedReader bfr = new BufferedReader( new InputStreamReader(am.open(filename), "UTF-8"); );
StringBuffer sb = new StringBuffer();
String read = "";
while( (read=bfr.readLine()) != null )
  sb.apennd( read );

BuffereReader будет использовать буфер для чтения более одного байта за раз из вашего файла, что намного эффективнее.

Кстати, вы пытаетесь / ловить / наконец структура довольно хорошо сделана.

С уважением, Stéphane

0 голосов
/ 19 июня 2011

Новая строка имеет символьное значение 10 (<32), поэтому она не добавляется, поэтому рассмотрите добавление всех символов со значением> 0, поэтому измените на

 if( c <= 0 )
    break;
  else
    sb.append( (char)c );  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...