首先这个问题是由于我要导入《Java编程思想》的源码所引入的。我尝试用mindview.net上所叙述的方式去build,没能成功;就先把代码直接导入项目中,然后调错。遇到的错误大都是package没有写,类比较多,批处理文件的方式也没查,既然学了Java 就想着自己写一个得了!
所以问题就出现了,怎么在多个文件的开头加上“package XXX;”。
刚开始,我是这么想的:
1.需要读出某个目录下的所有Java文件列表;
2.遍历文件,在开头添加所需字符串;
第一步很简单:
// 1.获取路径下所有Java文件
File file = new File(path);
File[] files = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
});
但是,我卡在了第二步,怎么在开头添加的,io操作有追加在文件末尾的方法,但怎么在开头添加呢?突然想起来Java类库里面的RandomAccessFile,里面有一个seek(long pos)方法。可以在任意指定位置读取或写入内容。就立马行动起来了。
天不遂人愿,虽然在文件开头添加了所需的内容,但是也把原有的内容飞覆盖了。没办法,这个方法就放弃了。天无绝人之路,又想到一个方法,我可以先把原有的内容给复制出来,然后:先把所需的内容添加到开头,最后再把先前复制出来的内容给追加回去。这样应该就能完成我的目的了;
public static boolean write(String content, String path) throws IOException {
// 1.获取路径下所有Java文件
File file = new File(path);
File[] files = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
});
// 2.读取Java文件,然后在第一行加上package信息
for (File f : files) {
File tmp = File.createTempFile("tmp", null);
FileOutputStream tmpOut = new FileOutputStream(tmp);
FileInputStream tmpIn = new FileInputStream(tmp);
RandomAccessFile raf = null;
try {
raf = new RandomAccessFile(f, "rw");
byte[] buf = new byte[64];
int hasRead = 0;
while ((hasRead = raf.read(buf)) > 0) {
// 把原有内容读入临时文件
tmpOut.write(buf, 0, hasRead);
}
raf.seek(0L);
raf.write(content.getBytes());
// 追加临时文件内容
while ((hasRead = tmpIn.read(buf)) > 0) {
raf.write(buf, 0, hasRead);
}
} catch (IOException e) {
System.out.println("写入失败!");
e.printStackTrace();
return false;
} finally {
try {
raf.close();
} catch (IOException e) {
System.out.println("写入失败,关闭流失败!");
e.printStackTrace();
return false;
}
}
}
return true;
}
最终代码就是如此,虽然复用性还不是很强,但是可以解决我的问题了,哈哈~~~