假設我有一個名爲Sample.text的文本文件。 我需要就如何實現這一目標的建議是:運行程序前在不替換文本文件的中間插入字符串
Sample.txt的: ABCD
運行程序時,用戶將輸入的字符串將開始在中間 例如增加:用戶輸入是XXX
Sample.txt的運行某個程序後: ABXXXCD
假設我有一個名爲Sample.text的文本文件。 我需要就如何實現這一目標的建議是:運行程序前在不替換文本文件的中間插入字符串
Sample.txt的: ABCD
運行程序時,用戶將輸入的字符串將開始在中間 例如增加:用戶輸入是XXX
Sample.txt的運行某個程序後: ABXXXCD
基本上你已經了從中間改寫文件,至少。這不是Java的問題 - 這是文件系統支持的問題。
通常要做到這一點的方法是打開兩個輸入文件和輸出文件,然後:
其實我不喜歡的東西,你想,在這裏試試這個代碼,它不是一個完整的東西,但它應該給你一個明確的概念:
public void addString(String fileContent, String insertData) throws IOException {
String firstPart = getFirstPart(fileContent);
Pattern p = Pattern.compile(firstPart);
Matcher matcher = p.matcher(fileContent);
int end = 0;
boolean matched = matcher.find();
if (matched) {
end = matcher.end();
}
if(matched) {
String secondPart = fileContent.substring(end);
StringBuilder newFileContent = new StringBuilder();
newFileContent.append(firstPart);
newFileContent.append(insertData);
newFileContent.append(secondPart);
writeNewFileContent(newFileContent.toString());
}
}
的基本思想是讀取文件內容到內存中,在程序開始時說,根據需要操作字符串,然後將整個事件寫回文件。
如果您擔心腐敗或其他問題,可以將其保存爲輔助文件,然後驗證其內容,刪除原始文件,並將新文件重命名爲與原文相同。
原文:ABCD 我希望它在運行程序之後能像這樣:ABXXXCD 但是我的代碼真的發生了什麼:ABXXX CD被替換了 – user3224040
通常會創建一個新文件,但以下可能就足夠了(對於非千兆字節文件)。注意顯式編碼UTF-8;您可以省略操作系統的編碼。
public static void insertInMidstOfFile(File file, String textToInsert)
throws IOException {
if (!file.exists()) {
throw new FileNotFoundException("File not found: " + file.getPath());
// Because file open mode "rw" would create it.
}
if (textToInsert.isEmpty()) {
return;
}
long fileLength = file.length();
long startPosition = fileLength/2;
long remainingLength = fileLength - startPosition;
if (remainingLength > Integer.MAX_VALUE) {
throw new IllegalStateException("File too large");
}
byte[] bytesToInsert = textToInsert.getBytes(StandardCharsets.UTF_8);
try (RandomAccessFile fh = new RandomAccessFile(file, "rw")) {
fh.seek(startPosition);
byte[] remainder = new byte[(int)remainingLength];
fh.readFully(remainder);
fh.seek(startPosition);
fh.write(bytesToInsert);
fh.write(remainder);
}
}
Java 7或更高版本。
你是什麼意思的中間和'sample.txt'如何與這個字符串操作? – anubhava
如果沒有將文件的「尾部」「移動」較遠以便爲新數據騰出空間,則無法插入文件。 –