关于在文件开头添加一行内容的Java编程

首先这个问题是由于我要导入《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;
    }

最终代码就是如此,虽然复用性还不是很强,但是可以解决我的问题了,哈哈~~~

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值