0

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

到目前为止,我正在寻找 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

4 回答 4

2

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

if(line.contains("@public")){}
于 2012-12-19T22:52:50.233 回答
1
if (line.startsWith("@public")) {
    ...
}
于 2012-12-19T22:55:39.143 回答
1
String tag = "";
if(line.startsWith("@public")){
   tag = "@public";
}else if{....other tags....}

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

这为您提供了一个字符串,该字符串从标记的末尾(在本例中是公共的)开始,然后到分号前面的字符,然后修剪掉末尾的空格。

于 2012-12-19T22:58:01.317 回答
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);
    }
}   
于 2012-12-20T00:10:31.157 回答