JavaIO操作

一、删除

1、参数是File,删除文件或者目录

/** * 删除文件, 删除当前目录即里面的所有文件(利用递归) * * @param file * 文件或者目录 */
    public static boolean deleteFileDir(File fileOrDir) {
        // 1、先判断文件是否存在
        if (!fileOrDir.exists()) {
            return false;
        }

        // 2、如果是文件则直接删除
        if (fileOrDir.isFile()) {
            if (fileOrDir.delete()) {
                return false;
            }

            // 3、如果是目录,递归删除
        } else if (fileOrDir.isDirectory()) {
            // listFiles() 返回一个抽象路径名数组,存放文件的绝对路径
            File[] files = fileOrDir.listFiles();

            if (files == null) {
                return false;
            }

            // 递归删除子目录
            for (File oneFile : files) {
                if (deleteFileDir(oneFile)) {
                    return false;
                }
            }

            // 删除目录失败,或者删除当前目录失败
            return fileOrDir.delete();
        }

        return true;
    }

2、参数是String类型, 删除单个文件,删除当前目录及里面所有文件

/** * 删除单个文件,删除当前目录及里面所有文件 * * @param filePath * 文件的路径 * @return 删除成功返回true */
    public static boolean deleteFileDir(String fileOrDirPath) {
        File fileOrDir = new File(fileOrDirPath);

         if (fileOrDir.isFile()) {
            //这里不用考虑文件的异常情况,在deleteFileDir里已经分析过
            return deleteFileDir(fileOrDir);

        } else
            return fileOrDir.isDirectory() && deleteFileDir(fileOrDir);

    }

二、复制

1、文件复制

======

先了解如何创建单个文件

    /** * 创建单个文件及其父目录 * * @param filePath * 要创建文件的路径 * @return 文件存在或者创建文件成功返回true */
    public static boolean createFile(String filePath) {
        File file = new File(filePath);
        if (file.exists() && file.isFile()) {
            return true;
        }

        // 创建文件的目录结构
        if (!file.getParentFile().exists()) {
            if (!file.getParentFile().mkdirs()) {
                return false;
            }
        }

        try {
            //创建文件
            return file.createNewFile();

        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

复制单个文件,采用的字节缓冲流,可以复制任何形式的文件,如图片,视频

    /** * 利用缓冲流对文件进行复制 * * @param sourceFilePath * 准备复制的文件路径 * @param copyFilePath * 复制后的文件路径 */
    public static boolean copyFile(String sourceFilePath, String copyFilePath) {
        BufferedInputStream bufferedInputStream = null;
        BufferedOutputStream bufferedOutputStream = null;

        File sourceFile = new File(sourceFilePath);
        if (!sourceFile.exists() || !sourceFile.isFile()) {
            return false;
        }

        try {
            bufferedInputStream = new BufferedInputStream(new FileInputStream(sourceFile));

            if (!createFile(copyFilePath)) {
                return false;
            }

            int len;
            byte[] buffer = new byte[1024 * 10];
            // 必须放在createFile(copyFilePath)的文件创建好的后面,,不然出异常,因为copyPath对应的文件可能没有
            bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(new File(copyFilePath)));
            while ((len = bufferedInputStream.read(buffer)) != -1) {
                bufferedOutputStream.write(buffer, 0, len);
            }

            return true;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return false;

        } catch (IOException e) {
            e.printStackTrace();
            return false;

        } catch (Exception e) {
            e.printStackTrace();
            return false;

        } finally {
            // 关闭输入输出流
            if (null != bufferedOutputStream) {
                try {
                    bufferedOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (null != bufferedInputStream) {
                try {
                    bufferedInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }

    }

2、目录复制

利用栈复制目录,也需要用到上面的单个文件复制的文件

    /** * 利用栈复制目录 * * @param sourDirPath 准备复制的目录的绝对路径 * @param targetDirPath 复制后的文件绝对路径 */
    public static boolean copyDirectory(final String sourDirPath, final String targetDirPath) {
        final Stack<String> dirStack = new Stack<String>();
        //主要是为了获取目录结构长度,便于后面获取其目录下的目录结构
        final int sourDirLength = sourDirPath.split("/|\\\\").length;

        File dirOrFile = new File(sourDirPath);
        if (!dirOrFile.isDirectory() && !dirOrFile.exists()) {
            return false;
        }

        //进栈
        dirStack.push(sourDirPath);

        while (dirStack.size() > 0) {
            //每次出栈都是一个目录
            File directory = new File(dirStack.pop());

            // FilenameFilter是文件名过滤器,用来过滤不符合规格的文件名,并返回合格的文件
            directory.listFiles(new FilenameFilter() {
                // dir表示文件的当前目录,name表示当前目录下的文件名或目录名;
                @Override
                public boolean accept(File dir, String name) {
                    File findFile = new File(dir, name);
                    if (findFile.isDirectory()) {
                        dirStack.push(findFile.getAbsoluteFile().toString());
                        return false;

                    } else {
                        String targetFilePath = targetDirPath + spiltString(findFile.getAbsolutePath(), sourDirLength);
                        copyFile(findFile.getAbsolutePath(), targetFilePath);

                    }
                    return false;
                }
            });
        }

        return true;
    }

拆分字符串并组装:用于获取相对路径

        /** * 拆分字符串并组装:用于获取相对路径 * * @param string * 要拆分的字符串 * @param cutNum * 拆分时要去掉前面字符的个数 * @return 返回值是相对路径 */
    private String spiltString(String string, int cutNum) {
        String relativePath = "";
        // 正则表达式判断是/(linux)还是\(windows)
        int len = string.split("/|\\\\").length;
        String[] array = new String[len - cutNum];

        for (int i = cutNum, j = 0; i < len; i++, j++) {
            array[j] = string.split("/|\\\\")[i];
        }

        for (String character : array) {
            relativePath += File.separator + character;
        }
        return relativePath;
    }

3、获取当前目录下(包括子目录)的所有文件

    /** * 利用栈获取当前目录下(包括子目录)的所有文件 * * @param directoryPath 目录路径 * @param excelRegularExp 能判断文件是Excel文件的正则表达式 * @return 返回只有Excel文件的绝对路径的列表 */
    public static List<String> enumFiles(String directoryPath) {
        final Stack<String> stack = new Stack<String>();
        //用来存放目录下的所有文件的集合
        final List<String> allFiles = new ArrayList<String>();

        File dirOrFile = new File(directoryPath);
        if (!dirOrFile.isDirectory() || !dirOrFile.exists()) {
            return allFiles;

        } else {
            stack.push(directoryPath);

            while (stack.size() > 0) {
                File directory = new File(stack.pop());
                //FilenameFilter是文件名过滤器,用来过滤不符合规格的文件名,并返回合格的文件
                directory.listFiles(new FilenameFilter() {
                    // dir表示文件的当前目录,name表示当前目录下的文件名或目录名;
                    @Override
                    public boolean accept(File dir, String name) {
                        File findFile = new File(dir, name);
                        if (findFile.isDirectory()) {
                            stack.push(findFile.getAbsoluteFile().toString());
                            return false;

                        } else {
                            //这里如果加name.matches(regularExp)含有正则表达式的的条件,则可以获取指定的文件
                            if ( findFile.isFile()) {
                                allFiles.add(findFile.getAbsolutePath());
                            }
                        }
                        return false;
                    }
                });
            }
        }

        return allFiles;
    }

4、将结果写到文件中

需要注意的是1、中文可能会乱码。2、新增的数据要添加在文件里数据的后面

    /** * 将结果写入文件中 * * @param data * 要写入的到文件的数据 * @param filePath * 输出文件路径,即要写入的文件路径 * @return 成功返回true */
    public static boolean writeToFile(String data, String filePath) {
        File file = new File(filePath);
        if (!file.exists() || !file.isFile()) {
            try {
                if (!file.createNewFile()) {
                    return false;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        BufferedWriter writer = null;
        try {
            // 这里的true表示新增的数据,是添加在文件数据的后面,gbk或者utf-8是防止中文乱码
            OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(file, true), "gbk");

            // 将字符串写到文件里,对应一行。\n 新行(换行)符
            writer = new BufferedWriter(out);
            writer.write((data + "\n"));
            return true;

        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return false;

        } catch (IOException e) {
            e.printStackTrace();
            return false;

        } finally {
            if (null != writer) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

5、读文件

 public static void readTxtFile(String filePath) {
            BufferedReader bufferedReader = null;
            try {
                File in = new File(filePath);

                //解决得到的中文乱码问题
                InputStreamReader read = new InputStreamReader(new FileInputStream(in),"gbk");
                bufferedReader = new BufferedReader(read);

                String str = null;
                while ((str = bufferedReader.readLine()) != null) {

                    System.out.println(str);
                }

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                try {
                    if (bufferedReader != null){
                        bufferedReader.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }

你可能感兴趣的:(java,IO,文件操作)