2010-06-30 308 views
23

我正在尋找一種方法來替換文件中的字符串,而無需將整個文件讀入內存。通常我會用一個讀者與作者,也就是類似如下:替換文件中的字符串

public static void replace(String oldstring, String newstring, File in, File out) 
    throws IOException { 

    BufferedReader reader = new BufferedReader(new FileReader(in)); 
    PrintWriter writer = new PrintWriter(new FileWriter(out)); 
    String line = null; 
    while ((line = reader.readLine()) != null) 
     writer.println(line.replaceAll(oldstring,newstring)); 

    // I'm aware of the potential for resource leaks here. Proper resource 
    // handling has been omitted in the interest of brevity 
    reader.close(); 
    writer.close(); 
} 

然而,我想要做的就地更換,並且不認爲我可以在同一個開放的Reader和Writer文件併發。另外,我使用Java 1.4,所以dont't訪問NIO,掃描儀等

謝謝, 唐

+1

只是FYI,你知道'replaceAll'是基於正則表達式的,對吧?如果你只是想直接進行字符串替換(如你的形式參數名稱所示),你可以使用replace(CharSequence,CharSequence)方法。 – polygenelubricants 2010-06-30 08:40:26

+0

如何寫入臨時文件然後替換原文件? – InsertNickHere 2010-06-30 08:40:45

回答

31

「到位」代替通常是不可能的文件,除非更換與原始長度完全相同。否則,該文件將需要增長,從而將後面的所有字節「向右」移動或縮小。這樣做的常見方法是讀取文件,將替換文件寫入臨時文件,然後用臨時文件替換原始文件。

這也有一個好處,即所涉及的文件始終處於原始狀態或處於完全替換狀態,從不處於中間狀態。

+3

+1對於一個很好解釋的答案 – naikus 2010-06-30 10:24:49

2

替換文件或流中的內容需要一個Writer或OutputStream,它能夠在任何位置刪除和插入字節。替換操作可拆分爲刪除插入操作。

查看OutputStream和Writer的API我無法找到合適的方法。可以使用OutputStream來寫入偏移量的字節,但這會簡單地覆蓋現有的上下文。所以它可以適用於特殊情況,原始文件和替換文件具有相同的長度。

所以現在我認爲,將編輯過的行寫入臨時文件,然後用臨時文件替換原始文件仍然是最佳解決方案。