有些时候我们可能需要批量修改一些文件中所有文档的数据(例如txt文档),这个时候使用一些文本编辑器中自带的ctrl+h来进行编辑或许会很不方便,这个时候就可以用代码来解决这个问题,而且用代码解决时可以实现一些逻辑,
例如我们要修改一个这样的数据,需要将change标签后中括号里第三列中大于0的数据乘以二,小于0的数据改为0,等于0的数据不变
change 4152
{
-2.30889 -1.42482 -0.653673
-2.33079 -1.48122 -0.465242
-2.30889 -1.42482 -0.653671
-1.39385 -0.589268 1.07442
-1.52996 -0.589268 1.05734
-1.47875 -1.14866 1.04295
-1.47875 -1.14866 1.04296
-1.35333 -1.16983 1.07397
-1.39385 -0.589268 1.07448
}
下面是一个小demo
package demo;
import java.io.BufferedReader;
import java.io.CharArrayWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.math.BigDecimal;
public class LookFile {
public static void main(String[] args) throws Exception {
//可以做成从配置文件中获取修改文件的目录,后面将程序导成jar包后就可以重复使用了
File file = new File("config");
FileInputStream fis = new FileInputStream(file);
InputStreamReader in = new InputStreamReader(fis,"UTF-8");
BufferedReader buf=new BufferedReader(in);
String conf=buf.readLine();
gainFile(conf);
System.out.println(conf+"双层子目录下的全部.txt文件修改成功");
}
//获取config所有双层目录下所有txt结尾的文件(为什么是双层子目录呢?因为我懒得改了=.=)
public static void gainFile(String fn) throws Exception{
File bigFile=new File(fn);
File[] files = bigFile.listFiles();
for (File sunfile : files) {
File[] smallFiles = sunfile.listFiles();
for (File smallFile : smallFiles) {
if(smallFile.isDirectory()) {
File[] docs = smallFile.listFiles();
for (File doc : docs) {
if(doc.toString().endsWith(".txt")&&doc.isFile()) {
getTxt(doc);
//提示文件修改成功
System.out.println(doc.toString()+"--修改成功");
}
}
}
}
}
}
//寻找change字符串后面第一个{}
public static void getTxt (File file) throws Exception{
FileReader in=new FileReader(file);
BufferedReader buf=new BufferedReader(in);
CharArrayWriter tempStream = new CharArrayWriter();
String line=null;
while ( (line = buf.readLine()) != null) {
tempStream.write(line);
//每次返回某行数据后加一个换行符
tempStream.append(System.getProperty("line.separator"));
//判断是否是需要修改的部分
if(line.trim().startsWith("change")) {
A:while((line = buf.readLine()) != null) {
tempStream.write(line);
tempStream.append(System.getProperty("line.separator"));
//判断从何处开始修改
if(line.trim().startsWith("{")) {
while((line = buf.readLine()) != null) {
//判断何时停止修改
if(line.trim().startsWith("}")){
tempStream.write(line);
tempStream.append(System.getProperty("line.separator"));
break A;
}
// System.out.println(line);
line=count(line.trim());
tempStream.write(line);
tempStream.append(System.getProperty("line.separator"));
}
}
}
}
}
buf.close();
FileWriter out = new FileWriter(file);
tempStream.writeTo(out);
out.close();
}
//计算
public static String count(String str) {
String[] nums = str.split("\\s");
Double num=null;
//用BigDecimal来避免double丢失精度的问题
BigDecimal bdnum = null;
if((num=Double.valueOf(nums[2]))>0) {
bdnum = new BigDecimal(num+"");
bdnum = bdnum.add(bdnum);
}else if((num=Double.valueOf(nums[2]))<0) {
num=0.0;
bdnum = new BigDecimal(num+"");
}else{
bdnum = new BigDecimal(nums[2]+"");
}
// 根据原有数据格式返回数据
return " "+nums[0]+" "+nums[1]+" "+bdnum;
}
}
这样就可以用来修改我们需要修改的文件了,这里只是做一个小范例,具体使用的时候可以根据需要进行逻辑的修改和功能的添加.鉴于本人水平有限,也希望大家不吝赐教,指出代码中的不足之处,万分感谢0.0。