搜索特定行的文本文件

时间:2012-12-19 22:49:57

标签: java parsing java.util.scanner

我想在文本文件中搜索特定的文本行。如果我要查找的文本在特定行上,我想在该行上进一步阅读以获得更多输入。

到目前为止,我有3个我正在寻找的标签。

@public
@private
@virtual

如果我发现其中任何一行,我想阅读接下来的内容,例如我可以有这样的一行:

@public double getHeight();

如果我确定我找到的标签是@public,那么我必须在白色空格之后采取以下部分,直到我到达分号。问题是,我不能真正想到一种有效的方法来做到这一点,而不过度使用charAt(..),这看起来既不漂亮,但从长远来看大型文件或多个文件可能都不好文件连续。

我想帮助有效地解决这个问题,因为我目前无法理解我将如何做到这一点。代码本身用于解析C ++文件中的注释,以便稍后生成Header文件。伪代码部分是我被卡住的地方。有人建议BufferedReader,其他人说Scanner。我选择了Scanner,因为它似乎是BufferedReader的替代品。

public void run() {
    Scanner scanner = null;
    String filename, path;
    StringBuilder puBuilder, prBuilder, viBuilder;
    puBuilder = new StringBuilder();
    prBuilder = new StringBuilder();
    viBuilder = new StringBuilder();
    for(File f : files) {
        try {
            filename = f.getName();
            path = f.getCanonicalPath();
            scanner = new Scanner(new FileReader(f));
        } catch (FileNotFoundException ex) {
            System.out.println("FileNotFoundException: " + ex.getMessage());
        } catch (IOException ex) {
            System.out.println("IOException: " + ex.getMessage());
        }
        String line;
        while((line = scanner.nextLine()) != null) {
            /**
             * Pseudo Code
             * if @public then
             *      puBuilder.append(line.substring(after white space) 
             *      + line.substring(until and including the semicolon);
             */
        }
    }
}

4 个答案:

答案 0 :(得分:2)

我可能会误解你......但你只是在寻找String.contains()吗?

if(line.contains("@public")){}

答案 1 :(得分:1)

if (line.startsWith("@public")) {
    ...
}

答案 2 :(得分:1)

String tag = "";
if(line.startsWith("@public")){
   tag = "@public";
}else if{....other tags....}

line = line.substring(tag.length(), line.indexOf(";")).trim();

这将为您提供一个字符串,该字符串从标记的末尾(在本例中为public),然后到分号前面的字符,然后修剪两端的空白。

答案 3 :(得分:0)

如果您允许使用开源库,我建议使用apache common-io和common-lang库。这些都是广泛使用的java图书馆,这将使你的生活更加简单。

String text = null;
InputStream in = null;
List<String> lines = null;
for(File f : files) {
    try{
        in = new FileInputStream(f);
        lines = IOUtils.readLines(in);
        for (String line: lines){
            if (line.contains("@public"){
                text = StringUtils.substringBetween("@public", ";");
                ...
            }
        }

    }
    catch (Exception e){
        ...
    }
    finally{
        // alway remember to close the resource 
        IOUtils.closeQuietly(in);
    }
}