Читать специальную строку из TXT-файла в J2ME - PullRequest
0 голосов
/ 26 апреля 2011

У меня есть текстовый файл, например: file.txt, я хочу прочитать строку, например, строку 7, есть ли способ прочитать непосредственно строку 7 без чтения других строк? Я хочу сохранить память от этой работы.

Ответы [ 4 ]

0 голосов
/ 03 декабря 2012

Я бы хотел еще больше упростить задачу чтения символов без необходимости сопоставления символов с номерами строк.

...
                  Form form=new Form("filename");
                  InputStream fin=fconn.openDataInputStream();
                  StringBuffer buf =new StringBuffer();
                  int c;
                  int counter=-1;
                  while((c=fin.read())!=-1)
                  {   
                      counter++;
                      if(counter==23)
                      {
                          form.append(buf.toString());
                          buf=null;counter=0;
                          continue;
                      }

                      buf.append((char)c);
                  }
                  if(counter<23 && counter>=0) // write the skipped chars between the last number read and the end of file
                  {
                    form.append(buf.toString());
                    buf=null;counter=0;
                  }
                  fin.close();
                  ...

Надеюсь, это поможет другим.

0 голосов
/ 09 декабря 2011

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

В любом случае, во-первых, содержимое текстового файла должно храниться в массиве символов. Затем, во-вторых, содержимое массива char должно быть перемещено в хеш-таблицу.

Каждая строка в текстовом файле отделена новой строкой. В массиве char новая строка (возможно) переводится в '\ n'. Объединять символы в массиве, пока не будет достигнут символ новой строки. Объединенные символы (минус '\ n') сформируют строку в первой строке. Здесь также должен быть счетчик, который должен быть инициализирован в 0 (или 1, что вы предпочитаете). Сохраните текст в хеш-таблицу; Значением будет созданная строка, а ключом будет счетчик. Увеличьте счетчик впоследствии. Повторите этот процесс для оставшейся части массива, пока не будет достигнут конец файла.

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

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

[И, кстати, извините за очень поздний ответ. Это мой первый раз здесь (я имею в виду, я только что зарегистрировался и ответил на этот вопрос): D]

0 голосов
/ 10 декабря 2011

Общий код

private String readLine(InputStream _inStream, int lineNum) 
            throws IOException {
    if (null == _inStream) {
        throw new IOException("Inputstream null.");
    }
    if (lineNum < 0) {
        return ("Cannot read line a number " + lineNum);
    }

    final StringBuffer buf = new StringBuffer();
    byte c;

    int curLine = 1;
    while (((c = (byte) _inStream.read()) != -1)) {
        //System.out.println((char)c);
        if (c == '\n') {
            ++curLine;
            if (curLine > lineNum) {
                break;
            } else if (curLine < lineNum) {
                continue;
            }
        } else if (curLine != lineNum) {
            continue;
        }
        buf.append((char) c);
    }

    if (0 == buf.length()) {
        return null;
    } else {
        return buf.toString().trim();
    }
}

.

private String readLineWithSkip(InputStream _inStream, long skipCharacters) 
            throws IOException {
    if (null == _inStream) {
        throw new IOException("Inputstream null.");
    }
    if (skipCharacters < 1) {
        return ("Cannot skip stream of " + skipCharacters + " characters");
    }

    final StringBuffer buf = new StringBuffer();
    byte c;

    _inStream.skip(skipCharacters);
    while ((c = (byte) _inStream.read()) != '\n') {
        //System.out.println((char)c);
        buf.append((char) c);
    }

    if (0 == buf.length()) {
        return null;
    } else {
        return buf.toString().trim();
    }
}

.

InputStream inStream = null;
int fileLength = 39;
int skipCharacters = 10;
int lineNumber = 3;
String myLine = "No line read.";
try {
    inStream = Class.class.getResourceAsStream("/test.txt");
    if (null != inStream) {
        inStream.mark(fileLength);

    //For Approach II
        myLine = readLine(inStream, lineNumber);

        inStream.reset();
    //For Approach I
        myLine = readLineWithSkip(inStream, skipCharacters);
    }
} catch (SecurityException se) {
    se.printStackTrace();

} catch (IOException ioe) {
    ioe.printStackTrace();

} finally {
    try {
        inStream.close();
    } catch (IOException ex) {
        ex.printStackTrace();
    } catch (NullPointerException e) {
        e.printStackTrace();
    }
    inStream = null;

    System.out.println(myLine);
}

.

Подход I: Сопоставить номер строки без кумулятивных символов

  1. Выполнить файл с помощью кода, который сопоставляет номер строки с последним символом в этой строке из0-я позиция файла (для использования в качестве значения skip ()) все +2 ('\ r \ n \') для каждой строки.Вы можете хранить эту таблицу сопоставления либо в начале, либо в конце того же файла.
  2. Запустите приведенный выше общий код с методом readLineWithSkip (inStream, skipCharacters);ТОЛЬКО и разумно комментируйте вызовы других методов.

Следует учитывать:

  1. Переход к нужной позиции во входном потоке
  2. Затраты на синтаксический анализ файла и сохранение таблицы сопоставления.

.

Подход II: Читать каждую строку, пока не будет прочитана N-ая строка.

  1. Запустите приведенный выше общий код с методом readLine (inStream, lineNumber);ТОЛЬКО и разумно комментируйте вызовы других методов.

Обращает на себя внимание:

  1. Медленно, так как он должен читать каждый символ, пока не достигнет нужной строки.
  2. Нет затрат на синтаксический анализ файла и сохранение таблицы сопоставления.
0 голосов
/ 27 апреля 2011

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

...