posts - 495,comments - 227,trackbacks - 0
在网上找了好半天都没有找到相关的小工具,最后没有办法了,自己动手写了一个,留作以后用。

package com.duxiu.app;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.nio.channels.FileChannel;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FileUtil {

    
private String fileName;// 要检索的文件名称,可以是正则表达式
    private String path;// 源文件(要检索的)路径
    private String copyToPath;// 检索后,要复制到目的路径
    private String fileEncode;// 要检索文件的编码
    private String searchContent;// 要检索文件的内容,可以是正则表达式

    
public FileUtil(String fileName, String fileEncode, String searchContent, String path, String copyToPath) {
        
this.fileName = fileName;
        
this.fileEncode = fileEncode;
        
this.path = path;
        
this.searchContent = searchContent;
        
if (!copyToPath.endsWith("\\"&& !copyToPath.endsWith("/")) {
            copyToPath 
+= "\\";
        }
        
this.copyToPath = copyToPath;
    }

    
public void DrawFiles() {
        File file 
= new File(path);
        
if (!file.exists()) {
            
return;
        }

        File[] fileLists 
= file.listFiles();
        searchFile(fileLists);
    }

    
/**
     * 递归检索文件
     * 
     * 
@param fileLists
     
*/
    
protected void searchFile(File[] fileLists) {
        
if (fileLists == null || fileLists.length < 1) {
            
return;
        }

        
for (File file : fileLists) {
            
if (file.isDirectory()) {// 是目录,进行递归循环
                File[] files = file.listFiles();
                searchFile(files);
            }

            
if (file.isFile()) {// 是文件,匹配要检索的文件名
                String fn = file.getName();
                Pattern pattern 
= Pattern.compile(fileName, Pattern.CASE_INSENSITIVE);
                Matcher matcher 
= pattern.matcher(fn);
                
if (matcher.find()) {
                    
if (findFileContent(file)) {
                        String srcPath 
= file.getAbsolutePath();
                        srcPath 
= srcPath.substring(srcPath.indexOf("\\"+ 1, srcPath.lastIndexOf("\\"+ 1);
                        File dstFile 
= new File(copyToPath + srcPath);
                        
if (!dstFile.exists()) {
                            dstFile.mkdirs();
                        }
                        dstFile 
= new File(copyToPath + srcPath + file.getName());
                        copyFile2(file, dstFile);
                    }
                }
            }
        }
    }

    
/**
     * 检索文件内容
     * 
     * 
@param file
     * 
@return
     
*/
    
protected boolean findFileContent(File file) {
        
boolean isFind = false;
        
try {
            FileInputStream fileInput 
= new FileInputStream(file);
            InputStreamReader inputStrReader 
= new InputStreamReader(fileInput, fileEncode);
            BufferedReader buffereReader 
= new BufferedReader(inputStrReader);
            StringBuilder sb 
= new StringBuilder();
            String line 
= "";
            
while ((line = buffereReader.readLine()) != null) {
                sb.append(line).append(
"\r\n");
            }
            buffereReader.close();
            inputStrReader.close();
            fileInput.close();

            Pattern pattern 
= Pattern.compile(searchContent, Pattern.CASE_INSENSITIVE);
            Matcher matcher 
= pattern.matcher(sb);
            
if (matcher.find()) {
                isFind 
= true;
            }
        } 
catch (Exception e) {
            System.out.println(file.getAbsolutePath() 
+ "/" + file.getName() + "  read error:" + e.getMessage());
        }

        
return isFind;
    }

    
/**
     * 拷贝文件
     * 
     * 
@param src
     * 
@param dest
     
*/
    
public void copyFile2(File src, File dest) {
        
try {
            
// Create channel on the source
            FileChannel srcChannel = new FileInputStream(src).getChannel();

            
// Create channel on the destination
            FileChannel dstChannel = new FileOutputStream(dest).getChannel();

            
// Copy file contents from source to destination
            dstChannel.transferFrom(srcChannel, 0, srcChannel.size());

            
// Close the channels
            srcChannel.close();
            dstChannel.close();
        } 
catch (IOException e) {
            e.printStackTrace();
        }

    }

    
/**
     * 对UTF-8编辑的文件拷贝有问题
     * 
     * 
@param src
     * 
@param dst
     
*/
    @Deprecated
    
public void copyFile(File src, File dst) {
        
int BUFFER_SIZE = 1024 * 2;
        
try {
            InputStream in 
= null;
            OutputStream out 
= null;
            
try {
                in 
= new BufferedInputStream(new FileInputStream(src), BUFFER_SIZE);
                out 
= new BufferedOutputStream(new FileOutputStream(dst), BUFFER_SIZE);
                
byte[] buffer = new byte[BUFFER_SIZE];
                
while (in.read(buffer) > 0) {
                    out.write(buffer);
                }
            } 
finally {
                
if (null != in) {
                    in.close();
                }
                
if (null != out) {
                    out.close();
                }
            }
        } 
catch (Exception e) {
            e.printStackTrace();
        }
    }

    
public String getFileName() {
        
return fileName;
    }

    
public void setFileName(String fileName) {
        
this.fileName = fileName;
    }

    
public String getPath() {
        
return path;
    }

    
public void setPath(String path) {
        
this.path = path;
    }

    
public String getCopyToPath() {
        
return copyToPath;
    }

    
public void setCopyToPath(String copyToPath) {
        
this.copyToPath = copyToPath;
    }

    
public static void main(String[] args) {
        String fileName 
= "index.jsp";
        String path 
= "F:\\project\\eclipse33workspace\\DuxiuAbo\\ROOT\\areas";
        String copyToPath 
= "D:\\simone";
        String fileEncode 
= "utf-8";
        String searchContent 
= "/javascript/area/inc.js";
        FileUtil fileUtil 
= new FileUtil(fileName, fileEncode, searchContent, path, copyToPath);
        fileUtil.DrawFiles();

    }
}

posted on 2009-11-11 17:59 SIMONE 阅读(910) 评论(1)  编辑  收藏 所属分类: JAVA

FeedBack:
# re: 检索文件内容,并将含有要检索内容的文件及目录结构拷贝到指定目录下(源代码)
2009-12-21 19:31 | 冰河快狼
这些操作java来做,感觉性能不太好,建议用shell脚本搞定  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: