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

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileWriter;

import java.io.InputStream;

import java.io.InputStreamReader;

/*

* 替换文件(如果该文件含有子目录,则包括子目录所有文件)中某个字符串并写入新内容(Java代码实现).

*

*原理:逐行读取源文件的内容,一边读取一边同时写一个*.tmp的文件。

*当读取的行中发现有需要被替换和改写的目标内容‘行’时候,用新的内容‘行’替换之。

*最终,删掉源文件,把*.tmp的文件重命名为源文件名字。

*

*注意!代码功能是逐行读取一个字符串,然后检测该字符串‘行’中是否含有替换的内容,有则用新的字符串‘行’替换源文件中该处整个字符串‘行’。没有则继续读。

*注意!替换是基于‘行’,逐行逐行的替换!

*

* */

public class Modify {

private String path;

private final String target;

private final String newContent;

public Modify(String path, String target, String newContent) {

// 操作目录。从该目录开始。该文件目录下及其所有子目录的文件都将被替换。

this.path = path;

// target:需要被替换、改写的内容。

this.target = target;

// newContent:需要新写入的内容。

this.newContent = newContent;

operation();

}

private void operation() {

File file = new File(path);

opeationDirectory(file);

}

public void opeationDirectory(File dir) {

File[] files = dir.listFiles();

for (int i = 0; i < files.length; i++) {

File f = files[i];

if (f.isDirectory())

// 如果是目录,则递归。

opeationDirectory(f);

if (f.isFile())

operationFile(f);

}

}

public void operationFile(File file) {

try {

InputStream is = new FileInputStream(file);

BufferedReader reader = new BufferedReader(

new InputStreamReader(is));

String filename = file.getName();

// tmpfile为缓存文件,代码运行完毕后此文件将重命名为源文件名字。

File tmpfile = new File(file.getParentFile().getAbsolutePath()

+ "\\" + filename + ".tmp");

BufferedWriter writer = new BufferedWriter(new FileWriter(tmpfile));

boolean flag = false;

String str = null;

while (true) {

str = reader.readLine();

if (str == null)

break;

if (str.contains(target)) {

writer.write(newContent + "\n");

flag = true;

} else

writer.write(str + "\n");

}

is.close();

writer.flush();

writer.close();

if (flag) {

file.delete();

tmpfile.renameTo(new File(file.getAbsolutePath()));

} else

tmpfile.delete();

} catch (Exception e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

//代码测试:假设有一个test文件夹,test文件夹下含有若干文件或者若干子目录,子目录下可能也含有若干文件或者若干子目录(意味着可以递归操作)。

//把test目录下以及所有子目录下(如果有)中文件含有"hi"的字符串行替换成新的"hello,world!"字符串行。

new Modify(".\\test", "hi", "hello,world!");

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值