Java批量操作文件小结

时间:2024-05-21 20:30:31

近来实现的某些功能需要对文件进行批量操作,为方便以后查找阅读,作以下总结。

如需要对文件进行批量重命名、删除文件夹中的所有文件等。

例:删除指定文件夹中的所有文件:(批量删除文件是文件操作经常用到的)

先创建一个文件批量管理工具类,关键代码如下

    //删除文件夹及其中内容

    public  void deleteDictionary(File fileIn) {

        if (fileIn.isFile()) {

            deleteFiles.add(fileIn); //将删除的文件保存到集合中,

            fileIn.delete();//如果是文件就删除

        } else {//如果是一个文件夹

            File[] files = fileIn.listFiles();

            for (File file : files) {

            deleteDictionary(file);//如果不是空文件夹则就迭代 deleteDictionary()方法

            }

            fileIn.delete();//空文件夹就删除

        }

    }

//删除文件夹下的内容(不删除指定的文件夹)

    public  void deleteFiles(File FileList) {

        if (FileList.listFiles().length == 0) {//如果是空文件夹return

            return;

        } else {

            File[] files = FileList.listFiles();//获取FileList的文件列表

            for (File file : files) {//遍历

                if (file.isFile()) {

                   deleteFiles.add(file); //添加到删除到集合,以便显示删除记录

                   file.delete();//删除指定所有文件

                } else {

                   if (file.listFiles().length == 0) {

                       file.delete();//删除所有空的文件夹

                   } else {

                       deleteDictionary(file);//删除所有非空的文件夹

                   }}

            }

        }

}

上面代码的两个方法主要是使用递归来实现对文件的删除,其中需要注意的是使用File类对文件操作时,要注意文件的类型(是否为空的文件夹等),对不同的文件类型需要进行不同的判断以及不同的操作。

Servlet关键代码(doPost方法)

    List<File> delFiles = null;

    request.setCharacterEncoding("UTF-8");

    String filePaths = request.getParameter("filePath");//获取文件路径   

    FilesUtil util = new FilesUtil();

        if(filePaths!=null&&!filePaths.equals("")){

            File files = new File(filePaths);

            util.deleteFiles(files);//调用方法删除文件夹中的所有子文件

            delFiles = util.getDeleteFiles();//获取删除列表

             //省略了部分代码

        }

上面代码主要是从获取文件路径,然后调用FilesUtil类的deleteFiles方法对指定文件夹进行删除,删除后,调用getDeleteFiles方法获取到删除文件列表,将该集合以及文件路径保存到域中,转发到index.jsp

index.jsp关键代码

将从Servlet传过来的集合进行遍历输出到table

<center>

<form action="${path}/FileServlet" method="post" >

<input type="hidden" name="driverPath" id="driverPath" />

<h1>删除指定文件夹中的文件</h1>

        <tr height="30">

            <td  colspan="2">文件夹路径:

                <input type="text" name="filePath" value="<%if(filePaths!=null&&!filePaths.equals("")){out.println(filePaths);} %>"/>

                <input type="submit"  value="删除"/>          

            </td></tr><tr >

            <td align="left" colspan="2">

            <p>删除记录</p>

                <textarea rows="6" cols="50"><%

                   if(delFiles!=null&&delFiles.size()>0){

                       for(File file:delFiles){

                           out.println(file.getAbsolutePath());

                       }

                   }

                 %></textarea>

            </td>   </tr></table></form></center>

结果:

Java批量操作文件小结

:在指定目录下搜索文件(类似文件管理器的文件搜索,在指定文件路径搜索指定类型的文件)

index.jsp关键代码 主要是将传过来的结果files集合遍历输出

<form action="${path}/FileDemoServlet" method="post" id="form1">

<input type="hidden" name="typeString" id="typeString" />

    <table border="0" width="500">

        <tr><td  align="right">文件路径:</td>

            <td ><input type="text" name="filePath" id="filePath" />

&nbsp;&nbsp; <input type="submit" name="submit"  onclick="serach()" value="搜索"/>

</td></tr><tr>

            <td  align="right">文件名称:</td>

            <td ><input type="text" name="fileName" id="fileName" /></td>

        </tr><tr>

            <td  align="right">后缀:</td>

            <td ><select id="typeName">

                   <option value=".txt">.txt</option>

                   <option value=".zip">.zip</option>

                   <option value=".gif">.dll</option>

                   <option value=".jpg">.jpg</option>

                   <option value=".bmp">.bmp</option>

                   <option value=".xls">.xls</option>

                   <option value=".doc">.doc</option>

                   <option value=".xml">.xml</option>

                   <option value=".rar">.rar</option>

                </select></td></tr>

        <tr height="100">

            <td colspan="2" align="center">

                <textarea rows="6" cols="45"><%

                   if(files!=null){

                       for(File file:files){

                           out.println(file.getAbsolutePath());

                       }

                   }

                 %></textarea>

            </td>

        </tr>

</table>

serach函数 获取到后缀下拉框的值并赋给隐藏的input传递到Servlet

function serach(){

        var typeName = document.getElementById("typeName");

        document.getElementById("typeString").value= typeName.value

}

FileDemoServlet关键代码 获取传过来的文件路径,文件名关键字、扩展名,不为空则调用搜索文件的方法,将方法返回的集合保存到域中后转发到index.jsp

List<File> files = null;

request.setCharacterEncoding("UTF-8");       

String filePath = request.getParameter("filePath");      //获取文件路径

String fileName = request.getParameter("fileName");      //获取文件名关键字

String extendName = request.getParameter("typeString");  //文件扩展名

if(filePath!=null&&!filePath.equals("")&&

fileName!=null&&!fileName.equals("")&&

            extendName!=null&&!extendName.equals("")){   

files= FileUtil.findFiles(filePath,fileName,extendName);//调用的方法

//省略了部分代码

        }

定义一个返回值为List<File>的方法,用于实现文件搜索功能,该方法三个参数分别是指定搜索目录路径,搜索文件名称,文件的扩展名,获取到文件数组后遍历文件数组,再调用findFileName方法(文件匹配方法),符合匹配就添加到集合中

    public static List<File> findFiles(String baseName, String tarFileName,String exStr) {

       List<File> fileList = new ArrayList<File>();//定义保存返回值的List对象

        File baseDir = new File(baseName); //创建File对象,参数为baseName

        if (!baseDir.exists() || !baseDir.isDirectory()) {//不是目录或不存在

            return fileList;                           //返回

        }

        String tempName = null;

        File[] files = baseDir.listFiles(new ExtendFileNameFilter(exStr));       //获取参数目录下的文件数组

        for (File file:files) {    //循环遍历文件数组

            if (!file.isDirectory()) {    //如果数组中的文件不是一个目录

                tempName = file.getName();         //获取该数组的名称

                if (findFileName(tarFileName, tempName)) { //调用文件匹配方法

            fileList.add(file.getAbsoluteFile()); //将指定的文件名添加到集合中

                }}}

        return fileList;

}

findFileName方法 这个方法用于查找匹配的文件,如果查找的文件名称和搜索的方式匹配,就返回true,否则false

public static boolean findFileName(String FileName, String name) {

        int length = FileName.length();    // 获取参数的长度

        int startLength = name.length();

        int strIndex = 0;

        char eleChar;

        for (int i = 0; i < length; i++) { // 遍历字符参数字符串的字符

        eleChar = FileName.charAt(i);     // 获取字符串中每个索引位置的字符

            if (eleChar == '*') {      // 如果是星号表示任意多个字符

                while (strIndex < startLength) {

                    if (findFileName(FileName.substring(i + 1), name

                            .substring(strIndex))) { // 如果文件名与搜索模型匹配

                        return true;

                    }

                    strIndex++; }

            } else if (eleChar == '?') {   // 如果包含问号 表示一个任意字符

                strIndex++;

                if (strIndex > startLength) { // 如果str中没有字符可以匹配“?”

                    return false;

                }

            } else {

                if ((strIndex >= startLength) || (eleChar != name.charAt(strIndex))) {      // 如果没有查找到匹配的文件

                    return false;

                }

                strIndex++;

            } }

        return (strIndex == startLength);    

}

ExtendFileNameFilter过滤器代码(用于判断是否文件的扩展名是否跟指定扩展名相同,相同返回true,反之false

public class ExtendFileNameFilter implements FileFilter {

     private String extendName;//过滤文件扩展名

     public ExtendFileNameFilter(String extend){

         this.extendName = extend;

     }

     @Override

     public boolean accept(File pathname) {

         if (pathname.getName().toLowerCase().endsWith(extendName.toLowerCase())

             ||pathname.isDirectory())//文件的扩展名是否跟指定扩展名一样

         {

         return true;

         } 

         else {

         }

         return false;

     }

}

效果

Java批量操作文件小结