首页 > 解决方案 > 如何读取两个分隔符之间的文件并将内容保存到字符串数组

问题描述

我正在做一个项目,该项目需要我在我的 Java 代码中读取 Java 文件。我只对提取main所述文件中的内容感兴趣。我最初的想法是检测main关键字并阅读,直到找到},但我无法将其放置到位。

我正在阅读的内容将始终具有以下形式:

package abc;
public class something {
    public static main void(String[] args) {
        //The information I want to save
    }
}

我注意到有一个主要建议使用扫描仪来执行此操作,但我没有看到如何正确有效地执行此操作。

标签: javastringfileextract

解决方案


如何读取两个分隔符之间的文件并将内容保存到字符串数组

实现它的简单方法是:

  1. 将整个文件内容读入字符串。
  2. 使用模式提取你想要的字符串;例如像这样的东西

       String contents = ...
       Pattern p = Pattern.compile("\\wmain\\w([^}]*)}",
                                   Pattern.MULTILINE | Pattern.DOTALL);
       Matcher m = p.matcher(content);
       if (m.find()) {
           String matched = m.group(1);
           ...
       } else {
           ...
       }
    

    (这纯粹是为了说明这种方法......不是一个可行的解决方案。)

我应该警告你,这种方法是不可靠的。

  1. 搜索这个词main会找到该词的各种其他出现;例如在注释、字符串文字、变量名等中。

  2. 搜索该字符}将在注释和文字中找到该字符。

  3. 第一个}aftermain可能是 main 方法中嵌套块的结尾。

正确的方法是实现一个 JAVA 解析器。


我注意到有一个主要建议使用扫描仪来执行此操作。

这个建议是错误的。Scanner没有提供任何有助于解决这个问题的方法。


您说您认为编写 Java 解析器不值得。您不需要编写解析器。您可以生成一个,或使用现有的解析器库来生成内存中的 AST。

但我想,如果这段代码只需要为一组严格控制的输入工作,它可能是可行的。例如,如果源代码main方法在方法块内从来没有main块。

最后,你还没有说你为什么要这样做。根据您要对提取的源代码片段执行的操作,您可能能够以不同的方式实现这一点。例如,您可能能够通过 BCEL 或类似main方式在字节码级别查找和挑选方法。


推荐阅读