java编程思想中讲到了IO流的思想,以前对于java基础总是不够深入,浅尝辄止,如今碰到语句插桩的时候就感到书到用时方恨少啊!
文件的复制涉及到源文件和新文件(无需手动创建),给出源文件的路径和文件名,然后给出新文件放置的位置,并新任命一个名字。(java文件尽量目录不要放一块,以保证名字的相同,因为类名和java文件名要保持一样)。
方法一:(需要导入IO包)
在主方法写入:
File oldf=new File("F:\muce2\Triangle\src\Triangle.java"); //源文件路径
File newf=new File("F:\muce2\Triangle\Triangle.java"); //新文件路径(注意要用 \来代替,转义字符)
copyfile(oldf,newf); //调用以下方法
public static void copyfile(File oldfile,File newfile) throws IOException{
//复制文件
FileInputStream ins = new FileInputStream(oldfile);
FileOutputStream out = new FileOutputStream(newfile);
//自定义缓冲对象
byte[] b = new byte[1024];
int n=0;
while((n=ins.read(b))!=-1){
out.write(b, 0, b.length);
}
ins.close();
out.close();
System.out.println("copy success");
}
此方法直接用FileInputStream和FileOutputStream进行文件的读取和写入。需要创建一个自定义缓冲对象,以及最后关闭两个方法。(并不建议采用)
方法二:(导入IO包)
主方法写入:
int ln=0;
//复制文件
int ln2=copyfile2("F:\muce2\Triangle\src\Triangle.java","C:\Users\Administrator\Desktop\Tirangle.java",ln); //前面的是源文件,后面的是新文件路径,最后一个是行号
//line number
System.out.println(ln2);
public static void copyfile2(String from,String to) throws IOException{ BufferedReader in=new BufferedReader(new FileReader(from)); BufferedWriter out=new BufferedWriter(new FileWriter(to)); String line=null; int linenumber=0; while((line=in.readLine())!=null){ out.write(line+" "); linenumber++; } in.close(); out.close(); System.out.println("line number "+linenumber); }
此方法是对源文件进行逐行的写入,到readline()==null时截至迭代。
注意的是,代码中的空行不是什么都没有,而是换行,写入时有 ,并不是null。两者的区别就像, 是桌子上面什么都没有, null是根本没有这桌子。一个是空的,一个是不存在。
逐行写入复制的优点有很多,可以记录行数,可以在读取该行内容的时候进行判断该行是在方法体内还是体外之类。例如在 while(){}迭代里写入:
if(line.contains("public") || line.startsWith("}") ||
line.contains(null) || line.startsWith("//") ||
line.startsWith("/*") || line.startsWith("*") ||
line.startsWith("*/")){
continue;
}else{
}
这种类似的代码结合数组,就可以记录是否可以进行语句插桩。