【Java基础】关于IO流、File类结合的一些代码题

  • 概述
  • 按类型整理文件
  • 实现文件夹复制功能
  • 统计文本文件中各个字符出现的次数

概述

  • IO流在Java中的地位可谓是非常重要了。毕竟,一切本地文件,一切网络传输都是IO流,最近也遇到不少IO流的问题,发现IO流跟File类结合后能催生诸多有趣的需求,说不定自己写的一个小demo以后真的能帮自己整理一下烦乱的DEF盘呢。

按类型整理文件

  • 定义一个方法,实现文件整理功能,将不同的文件类型分类到对应的目录中,并且保留原始目录结构,分类目录名为原始文件的类型(扩展名);
public class SortFiles{
     String destDir = null;

     public void sortFiles(String srcPath) throws IOException {
         if(destDir==null){
             destDir = srcPath;
         }
         File[] files = new File(srcPath).listFiles();
         for (File file : files) {
             if(file.isFile()){
                 //获取文件扩展名
                 String etx = file.getName().substring(file.getName().lastIndexOf(".")+1);
                 //生成新路径
                 String newPath = srcPath.replace(destDir, destDir + "\\" + etx);
                 File newFile = new File(newPath);
                 //创建文件夹
                 newFile.mkdirs();
                 //开始拷贝,IOUtils详见文章“【Java基础】实用工具类IOUtils”
                 IOUtils.copyFile2Dir(file,newFile);
             }else {
                 //是文件夹,递归调用
                 sortFiles(srcPath+"\\"+file.getName());
             }
         }
     }
}

实现文件夹复制功能

  • 定义一个方法,不使用IOUtils工具类,实现文件夹拷贝功能(包括所有子文件夹或者子文件);
  • 这个题也是使用的方法递归,由于需要复制的文件夹内有多少文件和子文件夹都不确定,因此需要对文件夹中的每个FIle对象进行判断,如果是文件夹,继续递归当前方法,如果是文件,就进行复制,复制的时候保留源目录结构不变。
public class CopyDirs {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入需要拷贝的源路径:");
        //获取源路径
        File srcDir = new File(sc.nextLine());
        System.out.println("请输入复制的目标文件夹:");
        //获取目标路径
        File destDir = new File(sc.nextLine());
        copyDir(srcDir, destDir);
    }

    public static void copyDir(File srcDir, File destDir) throws IOException {
        File[] files = srcDir.listFiles();
        //创建主目录文件夹
        (destDir = new File(destDir + "\\" + srcDir.getName())).mkdirs();
        for (File file : files) {
            File newDir = new File(destDir + "\\" + file.getName());
            if (file.isFile()) {
                destDir.mkdirs();
                //newDir.createNewFile();
                FileInputStream fis = new FileInputStream(srcDir + "\\" + file.getName());
                FileOutputStream fos = new FileOutputStream(newDir);

                byte[] b = new byte[1024];
                int len = 0;
                while ((len = fis.read(b)) != -1) {
                    fos.write(b, 0, len);
                }
            } else if (file.isDirectory()) {
                copyDir(file, newDir);
            }
        }
    }
}

统计文本文件中各个字符出现的次数

  • 做这个需求之前呢,一定要确定好了字符编码格式哦,毕竟Windows一般采用GBK编码保存文本文件,而Java的世界里我们都是用的UTF-8;
public static void count() throws Exception {
        FileReader fis = new FileReader("Maoway\\File\\1234.txt");
        //结果存储在Map集合中
        Map map = new HashMap<>();
        int a;
        while ((a = fis.read()) != -1) {
            if (map.keySet().contains((char)a)) {
                map.put((char)a, map.get((char)a) + 1);
            } else {
                map.put((char)a, 1);
            }
        }
        //JDK1.8引入了lambda表达式,屡试不爽
        map.keySet().forEach(q -> System.out.println("字符" + q + "出现了" + map.get(q) + "次"));
    }

注意:本文归作者所有,未经作者允许,不得转载

你可能感兴趣的:(Java基础,java,文件整理,IO流,面试,代码规范)