递归练习, 计算文件夹大小

import java.io.File;
import java.util.Scanner;

public class Demo1_FolderSize {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String strFolder = null;
        long size = 0;
        while (true){
            if( sc.hasNext()){
                strFolder = sc.nextLine();
                break;
            }
        }
        if( strFolder.equals(null)){
            System.out.println("不能为空");
        } else {
            File folder = new File(strFolder);
            if(folder.isFile()){
                size = folder.length();
            } else if(folder.isDirectory()){
                size = getSize(folder);
            } else if(! folder.exists()){
                System.out.println("文件夹不存在");

            }
        }
        System.out.println(size);
    }
    public static long getSize(File folder){
        long len = 0;
        File [] files = folder.listFiles();
        for(File subFile:files){
            if(subFile.isFile()){
                len = len + subFile.length();
            } else{
                len = len + getSize(subFile);
            }
        }
        return len;
    }
}

递归删除文件夹

  • 删除文件内的文件
  • 删除文件夹本身
import java.io.File;
import java.util.Scanner;

public class Demo2_DeleteFolder {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String strFolder = null;
        strFolder = getDir(sc);

        if( strFolder.equals(null)){
            System.out.println("不能为空");
        } else {
            File folder = new File(strFolder);
            if(folder.isFile()){
                folder.delete();
            } else if(folder.isDirectory()){
                deleteFolder(folder);
            } else if(! folder.exists()){
                System.out.println("文件夹不存在");
            }
        }
    }
    private static void deleteFolder(File folder) {
        File[] files = folder.listFiles();
        for (File f : files){
            if(f.isFile()){
                f.delete();
            } else if(f.isDirectory()){
                deleteFolder(f);
                f.delete();
            }
        }
        folder.delete();
    }

    public static String getDir(Scanner sc) {
        String strFolder;
        while (true){
            if( sc.hasNext()){
                strFolder = sc.nextLine();
                break;
            }
        }
        return strFolder;
    }
}

复制文件到指定文件夹下

  • 源文件夹, 目标文件夹
  • 在目标文件夹中创建源文件夹
  • 遍历源文件夹, 文件则调用stream 复制到目标文件夹/源文件夹, 文件夹则递归调用
import java.io.*;

public class Demo3_MvFolder {
    public static void main(String[] args) throws IOException {
        File folderSrc = new File("test");
        File folderDes = new File("des");
        copyFile3(folderSrc, folderDes);
    }
    public static void copyFile3(File folderSrc, File folderDes) throws IOException {
        if(! folderDes.isDirectory()){
            System.out.println("请复制到文件夹中");
            return;
        }
        File newFolder = new File(folderDes, folderSrc.getName());
        newFolder.mkdir();
        for(File f : folderSrc.listFiles()){
            if( f.isFile()){
                fileStream(f.getAbsolutePath(), newFolder.getAbsolutePath()+"/"+f.getName());
            } else{
                copyFile3(f, newFolder);
            }
        }
    }
    public static void copyFile2(File folderSrc, File folderDes) throws IOException{
        if(! folderDes.isDirectory()){
            System.out.println("请复制到文件夹中");
            return;
        }
        File tempFolder = new File(folderDes.getAbsolutePath()+"/"+folderSrc.getName());
        if( folderSrc.isDirectory()){
            tempFolder.mkdir();
        }

        for( File f : folderSrc.listFiles()){
            if( f.isFile()){
                fileStream(f.getAbsolutePath(), tempFolder.getAbsolutePath()+"/"+f.getName());
            } else {
                copyFile2(f, tempFolder);
            }
        }
    }

    public static void copyFile(File folderSrc, File folderDes) throws IOException {
        if(! folderDes.isDirectory()){
            System.out.println("请复制到文件夹中");
            return;
        }
        if( folderSrc.isDirectory()){
            new File(folderDes.getAbsolutePath()+"/"+folderSrc).mkdir();
        }
        for(File f: folderSrc.listFiles()){
            if ( f.isFile()){
                fileStream(f.getAbsolutePath(), (folderDes.getAbsolutePath()+"/"+f.getPath()));
            } else if( f.isDirectory()){
                copyFile(f, folderDes);
            }
        }
    }

    public static void fileStream(String src, String desc) throws IOException{
        FileInputStream fis = new FileInputStream(src);
        int len;
        byte[] arr = new byte[1024*100];

        FileOutputStream fos = new FileOutputStream(desc);
        while ( (len = fis.read(arr)) != -1){
            fos.write(arr,0,len);
        }
        fis.close();
        fos.close();
    }
}

打印文件夹的内文件, 保持层级

import java.io.File;

public class Demo4_PrintFolder {
    public static void main(String[] args) {
        File folder = new File("test");
        int lev = 0;
        printFolder(folder, lev);
    }
    public static void printFolder(File folder , int lev){
        System.out.println(folder.getPath());
        for ( File f : folder.listFiles()){
            for (int i=0;i<=lev;i++){
                System.out.print("\t");
            }
            if(f.isFile()){
                System.out.println(f.getPath());
            } else {
            // lev不能用lev++或++lev, 改变了lev值
                printFolder(f, lev+1);
            }
        }
    }
}

斐波那契数列

public class Demo5_TwoZi {
    public static void main(String[] args) {
        System.out.println(twoZi(6));
    }
    public static int twoZi(int month){
        int sum = 0;
        if(month > 2){
            sum = twoZi(month-1) + twoZi(month-2);
        } else if(month == 2){
            sum = 1;
        } else if(1 == month){
            sum = 1;
        }
        return sum;
    }
}

1000的阶乘, 其中所有0和尾部0的个数

import java.math.BigInteger;

public class Demo6_1000JieChen {
    public static void main(String[] args) {
        BigInteger bi = new BigInteger("1");
        for(int i=1;i<=1000;i++) {
            BigInteger tmepBi = new BigInteger(i + "");
            bi = bi.multiply(tmepBi);
        }
        int sum = 0;
        String str = String.valueOf(bi);
        for(int i=0;i<str.length();i++){
            if('0'== (str.charAt(i))){
                sum++;
            }
        }
        int num = 0;
        for(int j=str.length()-1;j>=0;j--){
            if( '0' == str.charAt(j)){
                num++;
            } else {
                break;
            }
        }
        System.out.println(sum);
        System.out.println(num);
    }
}

约瑟夫环

import java.util.ArrayList;
import java.util.Iterator;

public class Demo7_LuckYue {
    public static void main(String[] args) {
        int num = 8;
        System.out.println(getLuck(num));
        System.out.println(getLuck2(num));
    }
    public static int getLuck2(int num) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        for(int i=1;i<= num;i++){
            arrayList.add(i);
        }
        int sum = 1;
        for(int i=0; arrayList.size()!=1;i++){
            if( i == arrayList.size() ){
                i = 0;
            }
            if(0 == sum % 3){
                arrayList.remove(i--);
            }
            sum ++;
        }
        return arrayList.get(0);
    }
    public static int getLuck(int num){
        ArrayList<Integer> arrayList = new ArrayList<>();
        for(int i=1;i<= num;i++){
            arrayList.add(i);
        }
        int sum = 0;
        while (arrayList.size() > 1){
            Iterator<Integer> iterator = arrayList.iterator() ;
            while (iterator.hasNext()){
                Integer i = iterator.next();
                // next()和remove方法依赖关系
                sum++;
                if(0 == sum % 3){
                    iterator.remove();
                }
            }
        }
        return arrayList.get(0);
    }
}