替换文件中某个字符串并写入新内容(Java代码实现)

  1. import java.io.BufferedReader;  
  2. import java.io.BufferedWriter;  
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.io.FileWriter;  
  6. import java.io.InputStream;  
  7. import java.io.InputStreamReader;  
  8.   
  9. /* 
  10.  * 替换文件(如果该文件含有子目录,则包括子目录所有文件)中某个字符串并写入新内容(Java代码实现). 
  11.  *  
  12.  *原理:逐行读取源文件的内容,一边读取一边同时写一个*.tmp的文件。 
  13.  *当读取的行中发现有需要被替换和改写的目标内容‘行’时候,用新的内容‘行’替换之。  
  14.  *最终,删掉源文件,把*.tmp的文件重命名为源文件名字。 
  15.  * 
  16.  *注意!代码功能是逐行读取一个字符串,然后检测该字符串‘行’中是否含有替换的内容,有则用新的字符串‘行’替换源文件中该处整个字符串‘行’。没有则继续读。 
  17.  *注意!替换是基于‘行’,逐行逐行的替换! 
  18.  * 
  19.  * */  
  20. public class Modify {  
  21.   
  22.     private String path;  
  23.     private final String target;  
  24.     private final String newContent;  
  25.   
  26.     public Modify(String path, String target, String newContent) {  
  27.         // 操作目录。从该目录开始。该文件目录下及其所有子目录的文件都将被替换。  
  28.         this.path = path;  
  29.         // target:需要被替换、改写的内容。  
  30.         this.target = target;  
  31.         // newContent:需要新写入的内容。  
  32.         this.newContent = newContent;  
  33.   
  34.         operation();  
  35.     }  
  36.   
  37.     private void operation() {  
  38.         File file = new File(path);  
  39.         opeationDirectory(file);  
  40.     }  
  41.   
  42.     public void opeationDirectory(File dir) {  
  43.   
  44.         File[] files = dir.listFiles();  
  45.         for (int i = 0; i < files.length; i++) {  
  46.             File f = files[i];  
  47.             if (f.isDirectory())  
  48.                 // 如果是目录,则递归。  
  49.                 opeationDirectory(f);  
  50.             if (f.isFile())  
  51.                 operationFile(f);  
  52.         }  
  53.     }  
  54.   
  55.     public void operationFile(File file) {  
  56.   
  57.         try {  
  58.             InputStream is = new FileInputStream(file);  
  59.             BufferedReader reader = new BufferedReader(  
  60.                     new InputStreamReader(is));  
  61.   
  62.             String filename = file.getName();  
  63.             // tmpfile为缓存文件,代码运行完毕后此文件将重命名为源文件名字。  
  64.             File tmpfile = new File(file.getParentFile().getAbsolutePath()  
  65.                     + "\\" + filename + ".tmp");  
  66.   
  67.             BufferedWriter writer = new BufferedWriter(new FileWriter(tmpfile));  
  68.   
  69.             boolean flag = false;  
  70.             String str = null;  
  71.             while (true) {  
  72.                 str = reader.readLine();  
  73.   
  74.                 if (str == null)  
  75.                     break;  
  76.   
  77.                 if (str.contains(target)) {  
  78.                     writer.write(newContent + "\n");  
  79.   
  80.                     flag = true;  
  81.                 } else  
  82.                     writer.write(str + "\n");  
  83.             }  
  84.   
  85.             is.close();  
  86.   
  87.             writer.flush();  
  88.             writer.close();  
  89.   
  90.             if (flag) {  
  91.                 file.delete();  
  92.                 tmpfile.renameTo(new File(file.getAbsolutePath()));  
  93.             } else  
  94.                 tmpfile.delete();  
  95.         } catch (Exception e) {  
  96.             e.printStackTrace();  
  97.         }  
  98.     }  
  99.   
  100.     public static void main(String[] args) {  
  101.         //代码测试:假设有一个test文件夹,test文件夹下含有若干文件或者若干子目录,子目录下可能也含有若干文件或者若干子目录(意味着可以递归操作)。  
  102.         //把test目录下以及所有子目录下(如果有)中文件含有"hi"的字符串行替换成新的"hello,world!"字符串行。  
  103.         new Modify(".\\test""hi""hello,world!");  
  104.     }  
  105. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值