繁体   English   中英

提前阅读BufferedReader(Java)

[英]Reading ahead with BufferedReader (Java)

我正在为以下文件编写解析器:

LOCUS       SCU49845     5028 bp    DNA             PLN       21-JUN-1999
DEFINITION  Saccharomyces cerevisiae TCP1-beta gene, partial cds, and Axl2p
            (AXL2) and Rev7p (REV7) genes, complete cds.
ACCESSION   U49845
VERSION     U49845.1  GI:1293613

我想获取某些标签(DEFINITION,VERSION等)之前的信息,但是一些描述涉及多行,因此我确实需要所有这些信息。 使用BufferdReader读取我的文件时,这是一个问题。 我几乎是通过使用mark()和reset()来弄清楚的,但是在执行程序时,我注意到它仅适用于一个标签,而其他标签则被跳过了。 这是我到目前为止的代码:

Pattern pTag = Pattern.compile("^[A-Z]{2,}");//regex: 2 or more uppercase letters is a tag

Matcher mTagCurr = pTag.matcher(line);                

if (mTagCurr.find()) {
    reader.mark(1000);

    String nextLine = reader.readLine();
    Matcher mTagNext = pTag.matcher(nextLine);                    
    if (mTagNext.find()){
        reader.reset();
        continue;
    }

    Pattern pWhite = Pattern.compile("^\\s{6,}");
    Matcher mWhite = pWhite.matcher(nextLine);
    while (mWhite.find()) {
        line  = line.concat(nextLine);
    }                    
    System.out.println(line);
}

这段代码应该查找覆盖多行的标记和连接描述。 我在这里找到的一些答案建议使用Scanner。 这不是我的选择。 我使用的文件可能很大(我遇到的最大文件大小是> 50GB),通过使用BufferedReader,我希望减轻系统负担。

我建议您在一次通过解析器中累积阅读时所获得的信息。 我怀疑在这种情况下这将更简单,更快。

顺便说一句,您要缓存模式,因为创建它们非常昂贵。 在某些情况下,您可能会希望完全避免使用它们。

该代码从找到一条连续行开始,如果找不到它,则调用reset() ,但是读取其他行的代码似乎没有做到这一点。 难道是正在读取Genbank文件中另一部分的开头而不是将其放回原处? 我在这里看不到所有的循环控制代码,但是我看到的似乎是正确的。

如果所有其他方法都失败了,并且您需要轻松解决问题,那么总会有BioJava(请参阅如何使用Biojava3读取Genbank文件并查看是否有帮助)。 我曾尝试将BioJava用于我自己的项目,但它总是有点不足。

当我写完FASTA和FASTQ解析器后,我读入一个bytechar缓冲区并以这种方式处理它,但是还有更多的缓冲区管理代码要写。 这样,我不必担心将字节放回缓冲区中。 这也可以避免使用正则表达式,而正则表达式在时间紧迫的应用程序中可能会很昂贵。 当然,这需要更多的时间来实施。

提示:如果要自己管理缓冲区,则为实现最快速度,请查看NIO( Java NIO教程 )。 我已经看到在某些情况下(写入数据)放弃了10倍的加速。 唯一的缺点是我还没有找到一种使用NIO读取压缩序列数据的简便方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM