2017-12-27 294 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

相關問題