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

如何在Java中插入、替换和删除文件区域?,java,file,static-code-analysis,Java,File,Static Code Analysis,我正在寻找一个实现的类(在Java中),它处理现有文件文本的插入、替换和删除,就像它一样 我不想使用StringBuilder的原因是我想避免将所有文件内容都存储在内存中 其目的是对包含任何编程语言代码的文件应用修补程序。一般来说,类应该做一件事,并且做得很好 这意味着不太可能找到一个类来读取代码,将其转换为内部表示(解析树),检测手头的问题,更改内部表示,并将内部表示写回磁盘 考虑到这一点,您可以扩展许多项目以添加所需的功能 解析Java代码,以报告风格错误。为此,它必须读取代码,将其转换为内

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

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


其目的是对包含任何编程语言代码的文件应用修补程序。

一般来说,类应该做一件事,并且做得很好

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

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

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

是一个静态代码分析工具。为了在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”(“myMethod”)检测为(错误识别)的开头打包专用多行方法。

什么类型的文件?其中许多文件的格式可能无法处理随机插入。要更改的文件包含编程代码。这将用于静态代码分析工具,以修补代码错误。没有任何类允许您删除或替换文件区域,从而使文件大小改变。但请看一看。或者只是从旧文件创建一个新文件,根据需要替换区域。@DodgyCodeException当前我从旧文件创建了一个新文件,根据需要替换区域,最后用临时文件跨过原始文件,只是觉得奇怪,这种类型的文件没有处理程序情境。好极了!很高兴仍然能读到这么好的教育性答案。@gtgaxiola感谢你的补充。这篇文章是教育性的,但我认为OP所寻找的是一个类,它允许你打开一个名为abcde.fgh的文件,转到字节偏移量12345,并用“hello world”替换接下来的6个字符.I目前是PMD自动修复功能的开发人员之一。正如@DodgyCodeException提到的,支持的操作之一应该是替换,但也可以在文件的任意位置添加字符串,而不删除以下字节,以及从文件的任意位置删除字节。@gibarsin Thanks用于维护PMD。过去我对它很感兴趣。我甚至(一次)扩展了它来处理PLSQL以检测一些常见的PLSQL问题。现在有了自动修复工具,我将再看一眼。