从j2me的文本文件中读取特殊行



我有一个文本文件,例如:file.txt,我想读取一行,例如第7行,有没有办法直接读取第7行而不读取其他行?我想从这个工作中节省内存。

由于JME被截断的方式,您不能这样做。你得阅读整个文件。唯一的另一种方法,但可能不太合适是读取文件,将其存储在RecordStore中每行新条目,但是它真的值得…

我认为这是可能的,但是你需要使用一个哈希表,这可能会导致更多的堆使用

无论如何,首先,文本文件的内容应该存储在一个字符数组中。然后,第二步,必须将字符数组的内容移动到哈希表中。

文本文件中的每一行用新行分隔。在字符数组中,新行(可能)被转换为'n'。连接数组中的字符,直到到达新的行字符。连接的字符(减去'n')将形成第一行的字符串。这里还应该有一个计数器,它应该初始化为0(或1,随你喜欢)。将文本保存到散列表中;值将是已创建的字符串,键将是计数器。之后增加计数器。对数组的其余部分重复此过程,直到到达文件的末尾。

使用哈希表,您现在可以在第7行获得字符串,而无需遍历其他行。基本上,每行都读了一次。但是,至少,一旦它们被存储在哈希表中,您就不必遍历每一行了。

就像我之前说的,这样做可能会增加堆的使用,特别是当文本文件非常大的时候。

顺便说一句,很抱歉这么晚才回复你。这是我第一次来这里(我的意思是我刚刚注册并回答了这个问题):D]

通用代码

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);
}

.

方法一:映射没有累计字符的行号

  1. 通过一段代码运行该文件,该代码将行号与该行中的最后一个字符从文件的第0个位置(用作skip()值)映射为每行all +2 ('rn')。您可以将此映射表存储在同一文件的开头或结尾。
  2. 使用readLineWithSkip(stream,skipCharacters);只有和明智地注释其他方法调用。

注意事项:

  1. 跳转到输入流中所需的位置
  2. 有解析文件和存储映射表的开销

.

方法II:读取每一行直到第n行

  1. 使用readLine(stream,lineNumber);只有和明智地注释其他方法调用。

注意事项:

  1. 慢,因为它必须读取每个字符,直到它到达所需的行
  2. 没有解析文件的开销,也不存储映射表。

我想进一步简化读取字符的问题,而不需要将字符与行号进行任何映射。

...
                  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();
                  ...

相关内容

  • 没有找到相关文章

最新更新