2017-12-27 302 views
2

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

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

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

+0

什么样的文件?其中很多格式可能无法处理随机插入 –

+0

要更改的文件包含编程代码,这将用于静态代码分析工具在代码上修补错误。 – gibarsin

+0

没有允许您以文件大小更改的方式删除或替换文件区域的类。但看看[RandomAccessFile](https://docs.oracle.com/javase/9​​/docs/api/java/io/RandomAccessFile.html)。或者只需从旧文件创建一个新文件,根据需要替换区域。 – DodgyCodeException

回答

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(”作为( misidentified)包私有多行方法

+2

Bravo!仍然阅读这样好的和教育的答案是很好的。 – gtgaxiola

+0

@gtgaxiola谢谢你的补充。 –

+0

这篇文章是教育,但我认为所有的OP所寻找的是一个类,让你打开一个名为abcde.fgh的文件,去字节偏移12345,并用“你好世界”替换接下来的6个字符。 – DodgyCodeException