Android / Java - строка произвольного чтения не меняется - PullRequest
1 голос
/ 26 января 2011

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

Как видно из названия, это приложение для Android.textbox - это область вывода, testbox - для отладки (в этом коде она отображает случайное число - чтобы проверить, изменилось ли оно), а r - это Random

Этот пример кодаonClick для единственной кнопки в приложении.

           String fileName = "\\sdcard\\Q's.txt";
   try {
       BufferedReader br = new BufferedReader(
               new InputStreamReader(
                       new DataInputStream(
                               new FileInputStream(fileName))));

       // Get the number of lines in the text file
       numLines = Integer.parseInt(br.readLine().toString().trim());

       // get a random number and write it to the test text box
       int rnd = r.nextInt(numLines);
       String tmp = Integer.toString(rnd);
       testBox.setText(tmp);

       // get random number - go to line - save in String "text"
       LineNumberReader rdr = new LineNumberReader(br);
       rdr.setLineNumber(r.nextInt(numLines));
       textBox.setText(rdr.readLine());

    } catch (FileNotFoundException e) {
        textBox.setText("FileNotFound");
        e.printStackTrace();
    } catch (IOException e) {
        textBox.setText("IOException");
        e.printStackTrace();
    } catch (NumberFormatException nfe){
        textBox.setText("Number Formated Wrong");
    } finally {}

Что я делаю не так?Я попытался закрыть и переустановить br и rdr и не могу заставить его работать.

Ответы [ 3 ]

3 голосов
/ 26 января 2011

Номер строки не влияет на то, что возвращается строка , только номер строки, который будет сообщен для него.

Весь смысл LineNumberReader не в том, чтобы автоматическиискать конкретную строку, это отслеживать текущий номер строки, не беспокоясь об этом.

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

С этой целью setLineNumber() просто меняет сообщенный номер строки для текущей строки.Он не перемещает указатель файла на эту строку в файле.

Чтобы получить конкретную строку rnd, самое простое решение - просто прочитать rnd строки в цикле.Последний прочитанный - тот, который вы хотите.В псевдокоде:

open bufferedreader br
get limit from first line of br
set rnd to number from 1 to limit
while limit > 0:
    set line to next line of br
    decrement limit
use line

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

2 голосов
/ 26 января 2011

Из Javadoc для LineNumberReader :

Обратите внимание, однако, что setLineNumber (int) фактически не меняет текущую позицию в потоке;он только изменяет значение, которое будет возвращено getLineNumber ().

Этот класс не дает вам функции, которую вы хотите.Похоже, вам нужно разобраться с этим самостоятельно - прочитать содержимое файла в какую-то структуру (возможно, Map<Integer, String> от номера строки до содержимого строки) и разобрать его самостоятельно.

0 голосов
/ 26 января 2011

Считать количество строк в файле.Выберите случайное число n, которое не больше этого.Читайте и отбрасывайте n-1 строки.Верните следующую строку, которую вы прочитали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...