如何在Java中插入,替换和删除文件的区域?

问题描述 投票:2回答:1

我正在寻找一个实现的类(在Java中),它处理现有文件的文本插入,替换和删除,就像StringBuilder一样。

我不想使用StringBuilder的原因是我想避免将所有文件内容都放在内存中。

目的是将补丁应用于包含任何编程语言代码的文件。

java file static-code-analysis
1个回答
2
投票

一般来说,一个班级应该做一件事,做得好。

这意味着你不太可能找到一个读取代码的类,将其转换为内部表示(解析树),检测手头的问题,改变内部表示,并将内部表示写回磁盘。

考虑到这一点,您可以扩展许多项目以添加所需的功能。

Checkstyle解析Java代码,目的是报告样式错误。要做到这一点,它必须读取代码,将其转换为内部表示,并检测(格式化)问题。这可能是一个很好的起点,取决于你的目标。

PMD是一个静态代码分析工具。为了找到Java源代码中的问题,它必须:读取代码,将其转换为内部表示,并检测(结构)问题。

请注意,这些工具都不能满足您的所有需求;但是,他们很接近。您所要做的就是构建一个在解析树上运行的“修复程序”,修复检测到的问题。然后,您将需要查找该工具是否提供了“输出器”,该输出器从内部解析(树)表示重构代码文本,并使用它生成所需的文本,然后将其保存到磁盘。

如果树到文本模块不存在,则可能必须编写它。

源代码受规则约束,虽然您可能觉得自己不需要这些额外的步骤,但是通过跳过这些步骤,您的代码的生命周期将远远超过它。简单地粘贴一行代码可能对意外输入没有意义。例如,假设您将@Overrides标记添加到Java方法,此伪代码将失败

currentLine = next();
if (currentLine.detectMethod() and isAnOverride(currentLine().getMethod())) {
    code.insertBefore(currentline, "@Overrides");
}

因为有人会提供你的代码

public
void
myMethod(
  String one,
  String two,
  String three)
{
  System.out.println("Haha!  I broke you!");
}

可能导致

public
void
@Overrides
myMethod(
  String one,
  String two,
  String three)
{
  System.out.println("Haha!  I broke you!");
}

你可以说“好吧,没人应该这样做!”但是,如果语言允许,那么你将与语言本身不一致。

如果您不相信我,逐行处理器不会将“public”检测为方法,也不会将“void”视为方法,但会检测到“myMethod”(作为(错误标识)包私有的开头)多线方法。

© www.soinside.com 2019 - 2024. All rights reserved.