2014-01-22 115 views
1

假設我有一個名爲Sample.text的文本文件。 我需要就如何實現這一目標的建議是:運行程序前在不替換文本文件的中間插入字符串

Sample.txt的: ABCD

運行程序時,用戶將輸入的字符串將開始在中間 例如增加:用戶輸入是XXX

Sample.txt的運行某個程序後: ABXXXCD

+0

你是什麼意思的中間和'sample.txt'如何與這個字符串操作? – anubhava

+0

如果沒有將文件的「尾部」「移動」較遠以便爲新數據騰出空間,則無法插入文件。 –

回答

5

基本上你已經從中間改寫文件,至少。這不是Java的問題 - 這是文件系統支持的問題。

通常要做到這一點的方法是打開兩個輸入文件和輸出文件,然後:

  • 複製第一部分從輸入文件到輸出文件
  • 寫中間部分輸出文件
  • 複製輸入文件的剩餘部分到輸出文件
  • 可選的執行文件,如果你想在新的文件具有相同的最終名稱與原始文件重命名
0

其實我不喜歡的東西,你想,在這裏試試這個代碼,它不是一個完整的東西,但它應該給你一個明確的概念:

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()); 
     } 
    } 
1

的基本思想是讀取文件內容到內存中,在程序開始時說,根據需要操作字符串,然後將整個事件寫回文件。

  1. 所以你會打開並閱讀Sample.txt。在內存中,你的程序執行時有一個字符串=「ABCD」
  2. ,接受XXX的用戶輸入。用你喜歡的字符串操作方法將它插入到你的字符串中。現在string =「ABXXXCD」
  3. 最後你會用你更新的字符串覆蓋Sample.txt並關閉它。

如果您擔心腐敗或其他問題,可以將其保存爲輔助文件,然後驗證其內容,刪除原始文件,並將新文件重命名爲與原文相同。

+0

原文:ABCD 我希望它在運行程序之後能像這樣:ABXXXCD 但是我的代碼真的發生了什麼:ABXXX CD被替換了 – user3224040

0

通常會創建一個新文件,但以下可能就足夠了(對於非千兆字節文件)。注意顯式編碼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或更高版本。