作为一个软件工程师,有一个优势就是有些工作,普通人只能用重复的Ctrl+C和C+V来做,而你则可以用for循环来做。
而java真的比C要好的多,当然用C也能写一个可执行程序去帮你做这种重复劳动,但java显然更加便利,因为只有使用过才体会得到。
事情是这样的,最近要改写一个代码,用自动生成的definition去实现一套嵌入式软件的功能定制,有兴趣请参看我另外一篇博文http://blog.csdn.net/johnny_nass_hu/article/details/25103891
要实现自动化定制,原本的代码有一个地方的改动量比较大,那就是用户开机画面的选择,由于历史的原因,这款软件定制的用户界面有200多个画面,也就是头文件里面有200多个include的语句,鉴于用文字无法讲得清楚,我还是贴一部分代码出来吧:
Code 1:
//#include "F:\logo\fuzheng\155audi.c"
//#include "F:\logo\fuzheng\155benz.c"
//#include "F:\logo\fuzheng\155bmw.c"
//#include "F:\logo\fuzheng\155chery.c"
//#include "F:\logo\fuzheng\155honda.c"
//#include "F:\logo\fuzheng\155hyundai.c"
//#include "F:\logo\fuzheng\155infiniti.c"
我们要把这些代码改造成这样:
#if(CUSTOM_LOGO == logo_fuzhen_game32dvd)
#include "F:\logo\fuzheng\fuzhen_game32dvd.c"
#elif(CUSTOM_LOGO == logo_fuzhen_dpf2 )
#include "F:\logo\fuzheng\fuzhen_dpf2.c"
#elif(CUSTOM_LOGO == logo_155audi)
#include "F:\logo\fuzheng\155audi.c"
另外还要生成一个这样的文件:
#define logo_155chery (6)
#define logo_155honda (7)
#define logo_155hyundai (8)
#define logo_155infiniti (9)
#define logo_155kia (10)
#define logo_155lexus (11)
像这些地方,都会反复地用到一些子字符串,然后用到一些固定的模块。
上面列出仅仅是文件的片段,整个完整的代码有200多项,如果用C+C和C+V来做,会让人想发疯,所以我想到用java来做。
首先第一步就是把Code1里面的代码提炼出里面最核心的信息,也就是类似于这样:
logo_fuzhen_game32dvd,
logo_fuzhen_dpf2,
logo_155audi,
logo_155benz,
logo_155bmw,
JAVA的代码实现是这样的:
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileReader fis = new FileReader("E://workspace//java//src//title.txt");
FileWriter fos = new FileWriter("E://workspace//java//src//def1.txt");
BufferedReader bufRead = new BufferedReader(fis);
BufferedWriter bufWr = new BufferedWriter(fos);
String line = null;
while ((line = bufRead.readLine()) != null) {
// line = bufRead.readLine();
line = line.replace("//#include ", "");
line = line.replace("F:\\logo\\fuzheng\\", "logo_");
line = line.replace("\"", "");
line = line.replace('-', '_');
line = line.replace(".c", ",");
System.out.println(line);
bufWr.write(line);
bufWr.newLine();
bufWr.flush();
};
bufRead.close();
bufWr.close();
}
首先创建一个文件的缓冲流,然后读取一行,接下来就是用String的replace方法对输入的字符串进行修改,重要的是要把里面的'-' 改为'_',因为C语言不支持‘-’做变量,然后还要在前面加上logo_这个子字符串,是为了避免某些以数字开头的变量。
对于实现Code 2的形式的代码,我使用一个模板字符串,然后也是用replace方法对这个模板进行改造,代码如下:
String line = null;
String line_opt = "<option>logo</option>";
while ((line = bufRead2.readLine()) != null) {
//读取一行进来,然后把'-'号改为'_'
line = line.replace(",", "");
line = line.replace('-', '_');
//再重新构造 <option>结构
line = line_opt.replace("logo", line);
System.out.println(line);
bufWr.write(line);
bufWr.newLine();
bufWr.flush();
};
其余另外2个文件,也是用类似的模板的方式,构造出想要的格式。