关于在文件开头添加一行内容的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
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,我可以为你提供一个Java程序,以实现你所描述的功能。以下是程序代码: ```java import java.io.*; import java.util.*; public class IdiomProcessor { public static void main(String[] args) { String inputFilePath = "idioms.txt"; String outputFilePath = "output.txt"; try (BufferedReader reader = new BufferedReader(new FileReader(inputFilePath)); BufferedWriter writer = new BufferedWriter(new FileWriter(outputFilePath))) { // 读取所有成语,并将它们按照末尾字分类 Map<Character, List<String>> idiomMap = new HashMap<>(); String line; while ((line = reader.readLine()) != null) { String[] parts = line.split("\\s+", 2); if (parts.length != 2) { continue; // 忽略格式不正确的行 } String idiom = parts[0]; char lastChar = idiom.charAt(idiom.length() - 1); List<String> idiomList = idiomMap.getOrDefault(lastChar, new ArrayList<>()); idiomList.add(idiom); idiomMap.put(lastChar, idiomList); } // 遍历每一个成语,并计算它的接龙数 reader.close(); reader = new BufferedReader(new FileReader(inputFilePath)); while ((line = reader.readLine()) != null) { String[] parts = line.split("\\s+", 2); if (parts.length != 2) { continue; // 忽略格式不正确的行 } String idiom = parts[0]; char lastChar = idiom.charAt(idiom.length() - 1); List<String> idiomList = idiomMap.getOrDefault(lastChar, new ArrayList<>()); int count = 0; for (String nextIdiom : idiomList) { if (nextIdiom.charAt(0) == lastChar) { count++; } } // 将接龙数添加到行末 String processedLine = line + " " + count; // 将处理后的行写入到输出文件中 writer.write(processedLine); writer.newLine(); } } catch (IOException e) { e.printStackTrace(); } } } ``` 在以上程序代码中,我们首先使用BufferedReader类和FileReader类打开输入文件,并遍历每一行,将成语及其释义按照末尾字分类,保存到一个Map对象中。然后,我们再次遍历每一行,计算每个成语末尾字在获得的成语列表中有多少成语开头与它接上,并将结果添加到行末,最终输出到一个新的文本文件中。 请注意,以上程序代码只是一个示例,你需要根据自己的实际需求进行修改。例如,如果你需要处理的文件内容格式与示例不同,你需要修改程序中的分割逻辑和计算逻辑,以适应不同的文本格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值