2019-09-18 关键字匹配文件内容--搜索文件

一、程序描述

  1、搜索出某个路径下的所有文件夹。

  2、获取文件夹中的内容,与关键字进行匹配。

  3、可以只查包含某后缀文件。

  4、只能有效执行能被记事本打开不乱码的文件。

二、程序代码

/*
获取某文件夹中所有的文件,
获取文件中的内容,在文件的内容上进行相关搜索
 */
public class SearchFileText {
    private ByteBuffer buffer;

    public static void main(String[] args) throws Exception{
        //只支持记事本能打开不乱码的文件
        setCond("D:\\工作日记\\2019年\\OA新通用移动模板\\work",".php","edit.php");
        //setCond("D:\\工作日记\\2019年\\OA新通用移动模板\\work","[all]","edit.php");
      
    }
    /*
    filePath 从哪个文件夹开始查,
    sufStr 只查哪些文件,
    searchStr 查询的内容
     */
    public static void setCond(String filePath,String sufStr,String searchStr) throws  Exception{
        File file = new File(filePath);
        File[] files = file.listFiles();
        List<File> fileList=new ArrayList<>();//所有要查询的文件
        getAllFile(files,fileList,sufStr);

        System.out.println("-------开始查询文件--------");
        ByteBuffer byteBuffer= ByteBuffer.allocate(1024000);//这里可以调高
        FileChannel channel=null;
        String fileStr;
        List<String> resultFileNameList=new ArrayList<>();//有该内容的文件
        for(File f:fileList){
            //FileChannel channel = new RandomAccessFile(file1,"rw").getChannel();
            channel= new FileInputStream(f.getAbsolutePath()).getChannel();
            int read = channel.read(byteBuffer);
            fileStr = byteBufferToString2(byteBuffer);
            byteBuffer.clear();//读写完要重置
            if(fileStr.indexOf(searchStr)!=-1){
                System.out.println(f.getAbsolutePath());
                resultFileNameList.add(f.getAbsolutePath());

            }
        }
        if(channel!=null){
            channel.close();
        }
        System.out.println("-------结束查询文件--------");
        //System.out.println(file.getName());
    }
    public static void getAllFile(File[] files, List<File> allFile,String sufStr){
        if(files==null || files.length<1){
            return ;
        }
        for(File f:files){
            if(f.isDirectory()){
                getAllFile(f.listFiles(),allFile,sufStr);
            }
            else{
                if(sufStr.equals("[all]")){
                    allFile.add(f);
                }
                //后缀包含sufstr的文件,才加入数组
                else if(f.getName().endsWith(sufStr)){
                    allFile.add(f);
                }

            }
        }
    }

    public static String byteBufferToString(ByteBuffer buffer)throws  Exception{
        buffer.flip();
        Charset charset = Charset.forName("gbk");
        CharsetDecoder charsetDecoder = charset.newDecoder();
        CharBuffer cb = CharBuffer.allocate(1024);
        charsetDecoder.decode(buffer,cb,true);
        cb.flip();
        char[] a = new char[cb.length()];
        while(cb.hasRemaining()){
            cb.get(a);
            System.out.println("1"+new String(a));
        }
        return "";
    }
    //这种转换比较容易看
    public static String byteBufferToString2(ByteBuffer buffer)throws  Exception{
        buffer.flip();
        byte[] bs=new byte[buffer.limit()];
        buffer.get(bs);
        String str=new String(bs,0,bs.length,"gbk");
        //String str=new String(bs,0,bs.length,"utf-8");
        //System.out.println(str);
        return str;
    }
}

 

posted @ 2019-09-18 13:58  math_lin  阅读(412)  评论(0编辑  收藏  举报