Могу ли я прочитать локальный текстовый файл построчно в массив строк?

Вопрос "Как прочитать локальный (res/raw) файл построчно?" имеет дело с аналогичной проблемой, но мне не удалось построить решение на основе ответов, представленных там. Я получил очень полезную информацию (класс DataInputStream, у которого есть метод readLine), и я исследовал это на веб-сайте разработчика и попытался заставить его работать.

То, что я пытаюсь сделать, это прочитать информацию, хранящуюся в последовательных строках текстового файла, в массив строк, так что первая строка является первым элементом массива, вторая строка является следующим элементом массива и т. д.... а затем эта строка Массив будет использоваться для заполнения текстовых полей в следующем открытом действии. Все это происходит внутри переключателя (в зависимости от случая, т.е. какой элемент списка выбран, загружается другой текстовый файл). Вот что у меня есть до сих пор:

//Retrieve necessary text file for inputstream
InputStream buildinginfo = getResources().openRawResource(R.raw.testbuilding);
class DataInputStream extends FilterInputStream{
    protected DataInputStream(InputStream buildinginfo) {
        super(buildinginfo);
        // TODO Auto-generated constructor stub
        int i;  
        String[] building_info;
        //Assign lines of text to array
        for(i=0; i<5; i++){
            building_info[i] = buildinginfo.readLine();
        }
    }
}

Пока с редактором все в порядке, за исключением этих ошибок, а у меня недостаточно опыта, чтобы в них разобраться. Я понимаю, что они говорят, но не знаю, как их исправить. Ошибки находятся в разделе внутри корпуса переключателя, где я пытаюсь настроить входной поток и присвоить значения. Самое главное, в строке, где происходит команда readLine, я получаю: "- Метод readLine не определен для типа DataInputStream" "- Метод readLine не определен для типа InputStream"

Этого я не понимаю, потому что, если я не ошибаюсь, здесь написано (http://developer.android.com/reference/java/io/DataInputStream.html), что в классе DataInputStream доступен метод readLine (я узнал об этом из вопроса, упомянутого выше). Очевидно, я неправильно использовал DataInputStream, но я не могу понять, как это сделать. Я просмотрел несколько вопросов здесь и несколько раз ссылался на страницу, указанную выше.

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


person Yak Attack    schedule 19.02.2013    source источник
comment
Взгляните на 2 лучших ответа здесь для получения дополнительной помощи: stackoverflow.com/questions/4087674/   -  person dymmeh    schedule 20.02.2013
comment
Огромное спасибо! Я поиграю с этим и дам вам знать, если у меня это получится.   -  person Yak Attack    schedule 20.02.2013
comment
Но почему вы не можете просто добавить текст как строковую переменную в файл ресурсов strings xml? вот документация для него: developer.android.com/guide/topics /ресурсы/   -  person Cata    schedule 20.02.2013
comment
Первые несколько строк текста короткие, но последняя потенциально может быть довольно длинной строкой символов. Я полагаю, что это сработает, я просто подумал, что это может быть немного более элегантным решением, чем простое определение строк в XML. Может быть до 100 текстовых файлов, определяющих определенную информацию о различных зданиях. В зависимости от выбора из списка зданий загружается соответствующий текстовый файл. Я все еще вижу, что ваше более простое решение будет работать, но другая проблема заключается в том, что не все участники проекта знают, как работать в редакторе.   -  person Yak Attack    schedule 20.02.2013
comment
продолжение... и я надеялся заставить их сделать все текстовые файлы, тогда мне не придется делать всю эту работу в редакторе. Спасибо, что упомянули об этом... На самом деле я не рассматривал этот вариант, но если ничего не помогает, полагаю, я могу вернуться к этому.   -  person Yak Attack    schedule 20.02.2013


Ответы (1)


Ладно, значит, никто другой тебе здесь не помог... вот и все.

По сути, вы ошиблись в своем понимании того, как использовать классы API.

Ваш код пытается определить класс DataInputStream. Вместо этого вы хотите использовать тот, который уже предоставлен API. Переопределяя класс, вы фактически маскируете класс API (вы определенно этого не хотите).

Итак, если вы посмотрите документацию для DataInputStream, вы увидите конструктор. Это позволяет вам создать экземпляр класса. Это то, что вы хотите вместо этого :)

InputStream buildinginfo = getResources().openRawResource(R.raw.testbuilding);
DataInputStream myDIS = new DataInputStream(buildinginfo);

//you've now got an instance of DataInputStream called myDIS

String firstString = myDIS.readLine();

//voila ... your firstString variable should contain some text

Также есть проблема с вашим кодом массива... но я бы не стал использовать массив таким образом.

Вы должны использовать ArrayList, а затем читать строки в цикле while, поэтому вам не нужно возиться с размером.

Сначала давайте избавимся от этой строки (я ее закомментирую:

//String firstString = myDIS.readLine();

И создайте экземпляр ArrayList, который является классом шаблона, поэтому обратите внимание, что String в угловых скобках обозначает, какие элементы мы хотим в нашем массиве:

ArrayList<String> list = new ArrayList<String>();

Вы можете использовать метод add для добавления элементов в список массивов. Мы собираемся сделать все за один раз, не волнуйтесь, я объясню позже...

String myLine; //declare a variable

//now loop through and check if we have input, if so append it to list

while((myLine=myDIS.readline())!=null) list.add(myLine);

Последняя строка немного корявая, но когда вы назначаете переменную myLine, она возвращает результат, который вы можете сравнить с NULL... как только последняя строка будет прочитана, функция readline вернет null. Условие цикла while равно false и выпадает из цикла.

Существует простая вспомогательная функция toArray, которая превращает ваш список массивов в простой массив.

String[] myStringArray = list.toArray(new String[list.size()])

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

person Moog    schedule 19.02.2013
comment
Чувак... бомбический ответ! Я знал, что здесь должно быть что-то принципиально неправильное, но даже когда я пытаюсь читать о решениях, язык иногда выходит за пределы моей головы. Ты обалденный. - person Yak Attack; 21.02.2013