Java 替换文件夹下所有文件中指定的内容

我的上一篇博客提到了找到文件中的中文。之前的代码还可以做一个扩展。可以作为一个强大的查询功能使用。关键字查询,这个功能大家可以思考一下,今后我的博客也会去贴上这样的关键字查询的功能的代码,能跟大家讨论分析一下。
今天的替换的功能也是基于上篇博客的代码做的一个修改,谈不上什么强大,这个功能性的需求也不是很常见。今天也是跟大家做一个分享吧!

public static void main(String[] args) {
        //读取指定文件夹下的所有文件
        String filepath = "F:/wk/";//给我你的目录文件夹路径
        File file = new File(filepath);
        if (!file.isDirectory()) {
            System.out.println("请输入一个目录文件路径");
        } else if (file.isDirectory()) {
            try {
                refreshFileList(filepath);
            } catch (IOException e) {
                e.printStackTrace();
            }  
        }
    }

    //递归查找文件  
    private static void refreshFileList(String strPath) throws IOException { 
        File files = new File(strPath);  
        File[] filelist = files.listFiles();
        if (filelist == null)  
            return;
        for (int i = 0; i < filelist.length; i++) {
            if (filelist[i].isDirectory()) {  
                refreshFileList(filelist[i].getAbsolutePath());  
            } else {
                String filename = files.getName();//读到的文件名
                String strFileName = filelist[i].getAbsolutePath().toLowerCase();  
                String FileNamePath = strFileName.substring(6, strFileName.length());
                //截取文件格式  
                String  SufName = strFileName.substring(strFileName.lastIndexOf(".")+1,strFileName.length());  
                //排除不需要扫描的文件
                if(SufName.equals("rar") || SufName.equals("jpg") || SufName.equals("png") || SufName.equals("jar") || SufName.equals("doc") || SufName.equals("xls") || SufName.equals("gif") || SufName.equals("wmz")){
                    continue;
                }
                //不知为何  两种方法判断的时候都会吧class文件和jar文件当做是含有中文字符的文件  
                //所以此处排除掉这class文件和jar文件不参与判断  
                if(!"class".equals(SufName.toLowerCase())){  
                    //开始输入文件流,检查文件  
                    String enCode = getFileEncode(filelist[i].getAbsolutePath());  
                    if("void".equals(enCode)){  
                        enCode="UTF-8";  
                    }if("windows-1252".equals(enCode)){  
                        enCode="GBK";  
                    }  
                    FileInputStream fis = new FileInputStream(filelist[i].getAbsolutePath());  
                    InputStreamReader in = new InputStreamReader(fis,enCode);  
                    BufferedReader br = new BufferedReader(in); 

                    StringBuffer strBuffer = new StringBuffer();
                    String line = null;  
                     while((line = br.readLine())!=null){  
                         Pattern p = Pattern.compile("([\u4e00-\u9fa5]+)");   
                          String mv = "";
                      //正则判断
                      Matcher m = p.matcher(line); 
                      //遍历含有中文的行。并取出中文
                      while (m.find()) {    
                         mv += m.group(0);    
                      } 
                        Map<String, String> map = new HashMap<String, String>();

                        map.put("小康", "xk");
                        Set<Entry<String, String>> entries = map.entrySet();
                        for (Entry<String, String> mapKey : entries) {  
                            if(line.indexOf(mapKey.getKey()) != -1){ //判断当前行是否存在想要替换掉的字符 -1表示存在
                                line = line.replace(mv, mapKey.getValue());//替换为你想替换的内容
                            }
                        }
                        strBuffer.append(line);
                        strBuffer.append(System.getProperty("line.separator"));//行与行之间的分割
                     }
                     br.close();
                     //判断文件夹是否存在。没有就新建文件夹
                     File file=new File("F:/wangkang/"+filename);    
                     if(!file.exists())    
                     {    
                         file.mkdirs();   
                     } 
                     PrintWriter printWriter = new PrintWriter("F:/xiaokang/"+FileNamePath);//替换后输出的文件位置
                     printWriter.write(strBuffer.toString().toCharArray());
                     printWriter.flush();
                     printWriter.close();
                     System.out.println("ok 第 " + (i+1) +" 个文件操作成功!");
                }
            }
        }
    }   

    //检查文件类型  
    public static String getFileEncode(String path) {  
        /* 
         * detector是探测器,它把探测任务交给具体的探测实现类的实例完成。 
         * cpDetector内置了一些常用的探测实现类,这些探测实现类的实例可以通过add方法 加进来,如ParsingDetector、 
         * JChardetFacade、ASCIIDetector、UnicodeDetector。 
         * detector按照“谁最先返回非空的探测结果,就以该结果为准”的原则返回探测到的 
         * 字符集编码。使用需要用到三个第三方JAR包:antlr.jar、chardet.jar和cpdetector.jar 
         * cpDetector是基于统计学原理的,不保证完全正确。 
         */  
        CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();  
        /* 
         * ParsingDetector可用于检查HTML、XML等文件或字符流的编码,构造方法中的参数用于 
         * 指示是否显示探测过程的详细信息,为false不显示。 
         */  
        detector.add(new ParsingDetector(false));  
        /* 
         * JChardetFacade封装了由Mozilla组织提供的JChardet,它可以完成大多数文件的编码 
         * 测定。所以,一般有了这个探测器就可满足大多数项目的要求,如果你还不放心,可以 
         * 再多加几个探测器,比如下面的ASCIIDetector、UnicodeDetector等。 
         */  
        detector.add(JChardetFacade.getInstance());// 用到antlr.jar、chardet.jar  
        // ASCIIDetector用于ASCII编码测定  
        detector.add(ASCIIDetector.getInstance());  
        // UnicodeDetector用于Unicode家族编码的测定  
        detector.add(UnicodeDetector.getInstance());  
        java.nio.charset.Charset charset = null;  
        File f = new File(path);  
        try {  
            charset = detector.detectCodepage(f.toURI().toURL());  
        } catch (Exception ex) {  
            ex.printStackTrace();  
        }  
        if (charset != null)  
            return charset.name();  
        else  
            return null;  
    }  

在结尾在加一句,这里运用了Java基础的小知识。Map的循环。
最开始做Map的循环是将Map的Key给取出来。然后在从Key中找Value,最近才发现Map里面还有一个Entry接口。这个接口很好的完成一个Map集合的循环以及对Key-Value的取值工作。
本文中所需的Jar包在我的上一篇博客评论中有链接。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值