我正在尋找一個實現類(Java),它處理現有文件的插入,替換和刪除文本,就像StringBuilder一樣。如何在Java中插入,替換和刪除文件的區域?
我不想使用StringBuilder的原因是我想避免在內存中擁有所有文件內容。
目的是將補丁應用於包含任何編程語言代碼的文件。
我正在尋找一個實現類(Java),它處理現有文件的插入,替換和刪除文本,就像StringBuilder一樣。如何在Java中插入,替換和刪除文件的區域?
我不想使用StringBuilder的原因是我想避免在內存中擁有所有文件內容。
目的是將補丁應用於包含任何編程語言代碼的文件。
一般來說,一個班級應該做一件事,做得很好。
這意味着您不太可能會找到一個讀取代碼的類,將其轉換爲內部表示(解析樹),檢測手頭的問題,更改內部表示並將內部表示寫回出到磁盤。
考慮到這一點,有很多項目可以擴展以添加所需的功能。
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)包私有多行方法
Bravo!仍然閱讀這樣好的和教育的答案是很好的。 – gtgaxiola
@gtgaxiola謝謝你的補充。 –
這篇文章是教育,但我認爲所有的OP所尋找的是一個類,讓你打開一個名爲abcde.fgh的文件,去字節偏移12345,並用「你好世界」替換接下來的6個字符。 – DodgyCodeException
什麼樣的文件?其中很多格式可能無法處理隨機插入 –
要更改的文件包含編程代碼,這將用於靜態代碼分析工具在代碼上修補錯誤。 – gibarsin
沒有允許您以文件大小更改的方式刪除或替換文件區域的類。但看看[RandomAccessFile](https://docs.oracle.com/javase/9/docs/api/java/io/RandomAccessFile.html)。或者只需從舊文件創建一個新文件,根據需要替換區域。 – DodgyCodeException