搜索特定行的文本文件

问题描述:

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

到目前为止,我有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); 
      */ 
     } 
    } 
} 
+0

如果您不想在某个时间段阅读一行文字,扫描仪是一种很好的替代品。在你的情况下,我怀疑能够一次读出一个单词是有用的,例如'Scanner.next()'这样注释就不必和它后面的单词在同一行上。 –

+0

'charAt'? 'indexOf'(用于搜索';')和'substring'都是你需要的String方法。另外,这是作业还是现实世界?因为真实世界的解析要比这更复杂(发生在'@ virtual'后面的新行)? – SJuan76

+0

@ SJuan76这是一个爱好项目。 – OmniOwl

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

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

这给你从标签的端部(在这种情况下是公共的)进入一字符串,然后以分号之前的字符,然后修剪掉两端的空白。

+0

所以'@ public'将不会被包含在字符串中,对吗? – OmniOwl

+0

正确,子串从字符串中的“位置”开始。例如。如果我们有String s =“cat”,则cat.substring(1,2)产生“a”。 http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#substring(int,int) – HJM

+0

但是,如果字符串以例子开始,这不会成为问题4个空格?或者'startsWith()'会忽略空格? – OmniOwl

我可能会误解你..但你只是想找String.contains()

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

真的那么简单吗?当我查看解决方案时,他们只是开始讨论正则表达式包。 – OmniOwl

+0

@Vipar你也可以使用正则表达式。这将在你的情况下变得更方便 – Smit

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

如果您允许使用开源库,我建议使用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); 
    } 
}