java - 如何读取两个分隔符之间的文件并将内容保存到字符串数组
问题描述
我正在做一个项目,该项目需要我在我的 Java 代码中读取 Java 文件。我只对提取main
所述文件中的内容感兴趣。我最初的想法是检测main
关键字并阅读,直到找到}
,但我无法将其放置到位。
我正在阅读的内容将始终具有以下形式:
package abc;
public class something {
public static main void(String[] args) {
//The information I want to save
}
}
我注意到有一个主要建议使用扫描仪来执行此操作,但我没有看到如何正确有效地执行此操作。
解决方案
如何读取两个分隔符之间的文件并将内容保存到字符串数组
实现它的简单方法是:
- 将整个文件内容读入字符串。
使用模式提取你想要的字符串;例如像这样的东西
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 { ... }
(这纯粹是为了说明这种方法......不是一个可行的解决方案。)
我应该警告你,这种方法是不可靠的。
搜索这个词
main
会找到该词的各种其他出现;例如在注释、字符串文字、变量名等中。搜索该字符
}
将在注释和文字中找到该字符。第一个
}
aftermain
可能是 main 方法中嵌套块的结尾。
正确的方法是实现一个 JAVA 解析器。
我注意到有一个主要建议使用扫描仪来执行此操作。
这个建议是错误的。Scanner
没有提供任何有助于解决这个问题的方法。
您说您认为编写 Java 解析器不值得。您不需要编写解析器。您可以生成一个,或使用现有的解析器库来生成内存中的 AST。
但我想,如果这段代码只需要为一组严格控制的输入工作,它可能是可行的。例如,如果源代码main
方法在方法块内从来没有main
块。
最后,你还没有说你为什么要这样做。根据您要对提取的源代码片段执行的操作,您可能能够以不同的方式实现这一点。例如,您可能能够通过 BCEL 或类似main
方式在字节码级别查找和挑选方法。
推荐阅读
- scala - Redis 中的“空回复”到底是什么?
- android - AysncTask vs ExecutorService?
- ios - 以编程方式添加时,rightAnchor 约束不适用 - swift
- python - 在具有多个外键 Django 的模型中创建记录
- python - 使用内置方法在python中将图像大小转换为二进制
- html - 如何始终保持我的父母为圆形?
- java - 适配器项目单击从片段
- kubernetes - 如何更新 StatefulSet 中的环境变量
- typo3 - TYPO3 PageLayoutView 从外部表中获取值
- python - 在 Jupyter 笔记本中的两个 df 显示之间添加空格