解释:
基于面向对象的思想,代码的可扩展性强;
利于嫁接其他代码,实现更为强大的功能;
思路:
将"旧的字符串"和"新的字符串"记录到一个文本文件中;
- 新旧字符串记录在一行,以特殊字符分割开来;
- 用行读的方式读取每行,将新旧字符信息保留;
以行读的方式读取要修改文本文件,替换后保存起来;
- 每行都与所有旧字符串进行比对,并存新文件;
- 完成后删除旧文件后修改新文件名为旧文件名;
诉求:
给个关注,随时都能更新,希望给出意见和建议;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* 文本文件内容替换工具
*
* @author SUNxRUN
*/
public class TextReplacement {
// 要操作的文件
public File sourceFile = new File("E:\\1.txt");
// 替换文本文件
public File textFile = new File("E:\\textReplacement.txt");
/**
* 新文本和老文本的获取方法
* 用"新文本"来代替"老文本"
* 通过在文本文件中输入的方式获取
* 可以定义任意对的替换内容
*
* @param textFile 存替换文本的文件
* @return 返回的是"新老文本"键值对
*/
public Map<String, String> replacementText(File textFile) {
// 文件输入相关流的创建
FileInputStream fis;
InputStreamReader isr;
BufferedReader br = null;
// 容器,用来存放替换文本信息
Map<String, String> str = new HashMap<>();
try {
fis = new FileInputStream(textFile);
isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
br = new BufferedReader(isr);
// 从文本文件中获取到替换文本的相关信息
String line;
while ((line = br.readLine()) != null) {
// 判定读取到的文本行是否是要替换的文本
if (line.contains("---") && line.trim().length() > 4) {
// 将老文本和文本以键值对的形式存入Map容器中
// 新老文本的分割符号是:"---"
str.put(line.split("---")[0], line.split("---")[1]);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return str;
}
/**
* 单个文件内容的替换
* 读取要操作的文本文件
* 实现文本替换功能
* 并创建新文件替代
* 修改成原文件名即可
*
* @param sourceFile 要操作的文本文件
*/
public void operationDocument(File sourceFile) {
// 用于临时周转的文本文件
File temporaryFile = new File("E:\\temporaryFile");
// 文件输入相关流的创建
FileInputStream fis;
InputStreamReader isr;
BufferedReader br = null;
// 文件输出相关流的创建
FileOutputStream fos;
OutputStreamWriter osw;
BufferedWriter bw;
PrintWriter pw = null;
try {
fis = new FileInputStream(sourceFile);
isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
br = new BufferedReader(isr);
fos = new FileOutputStream(temporaryFile, true);
osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
bw = new BufferedWriter(osw);
pw = new PrintWriter(bw, true);
// 从文本文件中获取到替换文本的相关信息
String line;
while ((line = br.readLine()) != null) {
Map<String, String> str = replacementText(textFile);
Set<String> oldStrs = str.keySet();
// 每一行都与所有替换文本比对
for (String oldStr : oldStrs) {
if (line.contains(oldStr)) {
line = line.replace(oldStr, str.get(oldStr));
}
}
pw.println(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
sourceFile.delete();
temporaryFile.renameTo(sourceFile);
}
public static void main(String[] args) {
TextReplacement textReplacement = new TextReplacement();
textReplacement.operationDocument(textReplacement.sourceFile);
}
}
解释:
基于
代码A
进行了优化和完善,可扩展性更强;每个方法都可以独立存在,不存在嵌套和黏连;
做了方法的重载,适用的情况更加多,更明了;
思路:
将"旧的字符串"和"新的字符串"记录到一个文本文件中;
- 新旧字符串记录在一行,以特殊字符分割开来;
- 用行读的方式读取每行,将新旧字符信息保留;
也可以通过其他的方式来设置"新旧字符串"键值对内容;
- 最终是将其存放到一个"Map"中进行返回和使用的;
以行读的方式读取要修改文本文件,替换后保存起来;
- 每行都与所有旧字符串进行比对,并存新文件;
- 完成后删除旧文件后修改新文件名为旧文件名;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* 单个文本文件的多项内容实现修改
*
* @author SUNxRUN
*/
public class TextReplacement {
/**
* 要修改内容的文本文件
*
* 默认设置,用于测试
*/
public File sourceFile = new File("E:\\1.txt");
/**
* 用来存"老-新"字符键值对的文件
*
* 用于快速设置的目的
*/
private File textFile = new File("E:\\textReplacement.txt");
/**
* 替换内容相关信息的获取操作
* 分隔符是固定的"---"的情况
*
* 通过在文本文件中输入
* "老-新"字符对的方式
* 完成要修改内容的编辑
*
* @param textFile 存"老-新"字符键值对的文件
* @return 一个容器, 包含"老-新"字符键值对内容
*/
public Map<String, String> replacementText(File textFile) {
/* 文件输入流的创建*/
FileInputStream fis;
InputStreamReader isr;
BufferedReader br = null;
// 容器,用来存放"老-新"字符键值对
Map<String, String> str = new HashMap<>();
try {
/* 文件输入相关流的使用*/
fis = new FileInputStream(textFile);
isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
br = new BufferedReader(isr);
// 用来存放读取到的每行的文本信息
String line;
/* 按照行读的方式,读完终止*/
while ((line = br.readLine()) != null) {
// 判定读取到的文本行是否是"老-新"键值对信息
if (line.contains("---") && line.trim().length() > 4) {
// 将老文本和文本以键值对的形式存入Map容器中
// 新老文本的分割符号是:"---"
str.put(line.split("---")[0].trim(), line.split("---")[1].trim());
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
// 关闭输入流
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return str;
}
/**
* 替换内容相关信息的获取操作
* 分隔符是自己来设定的情况
*
* 通过在文本文件中输入
* "老-新"字符对的方式
* 完成要修改内容的编辑
*
* @param textFile 用来存"老-新"字符键值对的文件
* @param separator 用来设定"老-新"字符键值对的分隔符
* @return 一个容器, 包含"老-新"字符键值对内容
*/
public Map<String, String> replacementText(File textFile, String separator) {
// 在外声明,以便于关闭输入流
BufferedReader br = null;
// 容器,用来存放"老-新"字符键值对
Map<String, String> str = new HashMap<>();
try {
/* 文件输入相关流的使用*/
FileInputStream fis = new FileInputStream(textFile);
InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
br = new BufferedReader(isr);
// 用来存放读取到的每行的文本信息
String line;
/* 按照行读的方式,读完终止*/
while ((line = br.readLine()) != null) {
// 判定读取到的文本行是否是"老-新"键值对信息
if (line.contains(separator) && line.trim().length() > 4) {
// 将老文本和文本以键值对的形式存入Map容器中
// 新老文本的分割符号是:"---"
str.put(line.split(separator)[0].trim(), line.split(separator)[1].trim());
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 关闭输入流
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return str;
}
/**
* 文件内容的修改具体操作
* 通过文件复制的方式来完成
*
* 原文件一行一行的比对后
* 修改内容并传入周转文件
* 删原文件修改周转文件名
*
* @param sourceFile 要进行修改的文本文件
* @param strs 要修改内容的"老-新"字符键值对
*/
public void operationDocument(File sourceFile, Map<String, String> strs) {
// 用于临时周转的文本文件
File temporaryFile = new File("E:\\temporaryFile");
/* 文件输入相关流的创建*/
FileInputStream fis;
InputStreamReader isr;
BufferedReader br = null;
/* 文件输出相关流的创建*/
FileOutputStream fos;
OutputStreamWriter osw;
BufferedWriter bw;
PrintWriter pw = null;
try {
/* 文件输入流的使用*/
fis = new FileInputStream(sourceFile);
isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
br = new BufferedReader(isr);
/* 文件输出流的使用*/
fos = new FileOutputStream(temporaryFile);
osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
bw = new BufferedWriter(osw);
pw = new PrintWriter(bw, true);
// 每行的内容
String line;
/* 读完为主*/
while ((line = br.readLine()) != null) {
// "老"字符所有的值的获取
Set<String> oldStrs = strs.keySet();
/* 每一行都与所有的"老"字符值进行比对*/
for (String oldStr : oldStrs) {
/* 如果包含,就换掉*/
if (line.contains(oldStr)) {
line = line.replace(oldStr, strs.get(oldStr));
}
}
// 到此就说明这一行都ok了,进行写入操作
pw.println(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
/* 关闭输入和输出流*/
br.close();
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/* 完成后,删除原文件,周转文件改名为原文件名,表面看就是完成了修改内容的操作*/
sourceFile.delete();
temporaryFile.renameTo(sourceFile);
}
/**
* 文本文件复制的具体操作
*
* @param sourceFile 要复制的源文件
* @param targetFile 复制后目标文件
*/
public void operationDocument(File sourceFile, File targetFile) {
// 放在外面,便于关闭输入流
BufferedReader br = null;
// 放在外面,便于关闭输出流
PrintWriter pw = null;
try {
/* 文件输入流的使用*/
FileInputStream fis = new FileInputStream(sourceFile);
InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
br = new BufferedReader(isr);
/* 文件输出流的使用*/
FileOutputStream fos = new FileOutputStream(targetFile);
OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
BufferedWriter bw = new BufferedWriter(osw);
pw = new PrintWriter(bw, true);
// 每行的内容
String line;
/* 读完为主*/
while ((line = br.readLine()) != null) {
pw.println(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
/* 关闭输入和输出流*/
br.close();
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 文本文件另存为的具体操作
* 修改完毕后保存为新的文件
*
* @param sourceFile 要复制的源文件
* @param targetFile 复制后目标文件
* @param strs 要修改内容的"老-新"字符键值对
*/
public void operationDocument(File sourceFile, File targetFile, Map<String, String> strs) {
// 放在外面,便于关闭输入流
BufferedReader br = null;
// 放在外面,便于关闭输出流
PrintWriter pw = null;
try {
/* 文件输入流的使用*/
FileInputStream fis = new FileInputStream(sourceFile);
InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
br = new BufferedReader(isr);
/* 文件输出流的使用*/
FileOutputStream fos = new FileOutputStream(targetFile);
OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);
BufferedWriter bw = new BufferedWriter(osw);
pw = new PrintWriter(bw, true);
// 每行的内容
String line;
/* 读完为主*/
while ((line = br.readLine()) != null) {
/* 如果设置了替换内容,则开始替换工作,否则跳过*/
if (strs != null && strs.size() > 0) {
// "老"字符所有的值的获取
Set<String> oldStrs = strs.keySet();
/* 每一行都与所有的"老"字符值进行比对*/
for (String oldStr : oldStrs) {
/* 如果包含,就换掉*/
if (line.contains(oldStr)) {
line = line.replace(oldStr, strs.get(oldStr));
}
}
}
// 到此就说明这一行都ok了,进行写入操作
pw.println(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
/* 关闭输入和输出流*/
br.close();
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
TextReplacement tr = new TextReplacement();
tr.operationDocument(tr.sourceFile, tr.replacementText(tr.textFile));
}
}