java-递归,FileFilter过滤器,字节流,字符流

递归

方法自己调用自己
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

递归累加求和:计算1~n的和

在这里插入图片描述
开头和末尾也就是最大值和最小值他是固定不变的.真正变化的也就递归内容,就是中间部分,也就是我们写代码的部分**.最大值我们固定,让程序递归到最小值返回结束**
中间部分无外乎两种情况:1递增(n+1)+(n+2)+(n+3)… 规律就是n每一次都多减1 =>return sum(n+1)
2递减(n-1)+(n-2)+(n-3)… 规律就是n每一次都多减1 => return sum(n-1)

public class t1 {
    public static void main(String[] args) {
        
        System.out.println(show01(10));
    }
    private static int show01(int i){
       if (i==1){
           return 1;
       }
        return i+show01(i-1);//开头就是i,结尾递归到1.满足了开头末尾.
    }
}

在这里插入图片描述

递归求阶乘

在这里插入图片描述

public class t1 {
    public static void main(String[] args) {

        System.out.println(show01(3));
    }
    
    private static int show01(int i) {
        if (i==1){
            return 1;
        }

        return i*show01(i-1);
    }

}

递归打印多级目录

import java.io.File;

public class t1 {
    public static void main(String[] args) {
        File file = new File("D:\\");
        getAllFile(file);
    }

    private static void getAllFile(File dir) {
        System.out.println(dir);//打印被遍历的目录名称
        File[] files = dir.listFiles();
        for (File f : files) {
            if (f.isDirectory()){
                getAllFile(f);
            }else{
                System.out.println(f);
            }
        }
    }

}

通过上述案例实现文件搜索功能

import java.io.File;

public class t1 {
    public static void main(String[] args) {
        File file = new File("D:\\");
        getAllFile(file);
    }

    private static void getAllFile(File dir) {
        File[] files = dir.listFiles();
        for (File f : files) {
            if (f.isDirectory()){
                getAllFile(f);//递归
            }else{
                if (f.getName().toLowerCase().endsWith(".java")){//链式编程
                    System.out.println(f);
                }
            }
        }
    }

}

FileFilter过滤器的原理和使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
当return false时数据就是空,return true时就是输出.等同于一个开关

创建FileFilter实现类FileFilterImple

import java.io.File;
import java.io.FileFilter;

public class FileFilterImple implements FileFilter {
    @Override
    public boolean accept(File pathname) {
        if (pathname.isDirectory()){
            return true;
        }
       return pathname.getName().toLowerCase().endsWith(".java");
    }
}

主程序

import java.io.File;

public class t1 {
    public static void main(String[] args) {
        File file = new File("D:\\");
        getAllFile(file);
    }

    private static void getAllFile(File dir) {
        File[] files = dir.listFiles(new FileFilterImple());//传递过滤器对象
        for (File file : files) {
            if (file.isDirectory()){
                getAllFile(file);
            }
            else {
                System.out.println(file);
            }
        }

    }
}

匿名内部类实现过滤接口FileFilter

import java.io.File;
import java.io.FileFilter;

public class t1 {
    public static void main(String[] args) {
        File file = new File("D:\\");
        getAllFile(file);
    }

    private static void getAllFile(File dir) {
        File[] files = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.getName().toLowerCase().endsWith(".java");
            }
        });//传递过滤器对象
        for (File file : files) {
            if (file.isDirectory()){
                getAllFile(file);
            }
            else {
                System.out.println(file);
            }
        }

    }
}

因为FileFilter接口中只有一个accept方法所以可以使用Lambda表达式

import java.io.File;
import java.io.FileFilter;


public class t1 {
    public static void main(String[] args) {
        File file = new File("D:\\");
        getAllFile(file);
    }

    private static void getAllFile(File dir) {
        File[] files = dir.listFiles((File d)->
            d.getName().toLowerCase().endsWith(".java"));//传递过滤器对象
        for (File file : files) {
            if (file.isDirectory()){
                getAllFile(file);
            }
            else {
                System.out.println(file);
            }
        }

    }
}

字符输出流OutputStream

在这里插入图片描述
在这里插入图片描述

使用场景:

实现把内存中的数据写入到硬盘文件中

代码实现数据由内存中写入到硬盘中

在这里插入图片描述

import java.io.*;

public class t1 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\BaiduNetdiskDownload\\【非常重要】课程资料\\b.txt"));
        fileOutputStream.write(49);
        fileOutputStream.write(48);
        fileOutputStream.write(48);

        //一次写多个字节
        byte[] bytes = {65,66,67,68,69};
        fileOutputStream.write(bytes);//ABCDE

        //释放资源
        fileOutputStream.close();
    }
}

在这里插入图片描述

import java.io.*;

public class t1 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\BaiduNetdiskDownload\\【非常重要】课程资料\\b.txt"));
        fileOutputStream.write(49);
        fileOutputStream.write(48);
        fileOutputStream.write(48);


        byte[] bytes = {65,66,67,68,69};
        fileOutputStream.write(bytes,1,2);//BC
        
        //释放资源
        fileOutputStream.close();
    }
}

在这里插入图片描述
utf8是三个字节是一个中文
gbk是两个字节是一个中文

import java.io.*;
import java.util.Arrays;

public class t1 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream(new File("D:\\BaiduNetdiskDownload\\【非常重要】课程资料\\b.txt"));
        fileOutputStream.write(49);
        fileOutputStream.write(48);
        fileOutputStream.write(48);

        byte[] bytes2 = "你好".getBytes();
        System.out.println(Arrays.toString(bytes2));//[-28, -67, -96, -27, -91, -67]
        fileOutputStream.write(bytes2);

        //释放资源
        fileOutputStream.close();
    }
}

续写和换行

在这里插入图片描述

import java.io.*;


public class t1 {
    public static void main(String[] args) throws IOException {
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\BaiduNetdiskDownload\\【非常重要】课程资料\\b.txt");
        for (int i = 0; i < 10; i++) {
            fileOutputStream.write("你好".getBytes());
            fileOutputStream.write("\r\n".getBytes());
        }
        fileOutputStream.close();

    }
}

字节输入流FileInputStream

在这里插入图片描述
在这里插入图片描述

使用场景:

在这里插入图片描述
可以实现把硬盘文件中的数据,读取到内存中使用

代码实现字节输入流read()一次读取一个字节

在这里插入图片描述

import java.io.FileInputStream;
import java.io.IOException;

public class t1 {
    public static void main(String[] args) throws IOException {
        FileInputStream fileInputStream = new FileInputStream("D:\\BaiduNetdiskDownload\\【非常重要】课程资料\\a.txt");
        int read = fileInputStream.read();//每读一次指针向后移动一位
        System.out.println(read);
        fileInputStream.close();
    }
}

在这里插入图片描述

import java.io.FileInputStream;
import java.io.IOException;

public class t1 {
    public static void main(String[] args) throws IOException {
        FileInputStream fileInputStream = new FileInputStream("D:\\BaiduNetdiskDownload\\【非常重要】课程资料\\a.txt");
       int len = 0;
       while ((len = fileInputStream.read())!=-1){
            System.out.println(len);
       }
    }
}

代码实现字节输入流read(byte[] b),一次读取多个字节

在这里插入图片描述
在这里插入图片描述

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;

public class t1 {
    public static void main(String[] args) throws IOException {
        FileInputStream fileInputStream = new FileInputStream("D:\\BaiduNetdiskDownload\\【非常重要】课程资料\\a.txt");
        byte[] bytes = new byte[2];
        int read = fileInputStream.read(bytes);
        System.out.println(read);//2
        System.out.println(Arrays.toString(bytes));//[97,98]
        fileInputStream.close();
    }
}

案例文件复制

一次读取1个字节

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;


public class t1 {
    public static void main(String[] args) throws IOException {
        FileInputStream fileInputStream = new FileInputStream("C:\\1.png");
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\1.png");

        int len = 0;
        while ((len=fileInputStream.read())!=-1){
            fileOutputStream.write(len);
        }
    }
    fileInputStream.close();
    fileOutputStream.close();
}

一次读取多个字节

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;


public class t1 {
    public static void main(String[] args) throws IOException {
        FileInputStream fileInputStream = new FileInputStream("C:\\1.png");
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\1.png");

        byte[] bytes = new byte[1024];
        int len = 0;
        while ((len=fileInputStream.read(bytes))!=-1){
            fileOutputStream.write(bytes,0,len);

        }
        fileInputStream.close();
        fileOutputStream.close();
    }
}

使用字节流读取中文的问题

产生原因:因为一个中文会占用多个字节,而字节流一次只能读取一个,这时就会产生问题
解决办法:java为我们提供了字符流,字符流一次可以读取一个字符,这样就避免了上述的问题了.

发布了33 篇原创文章 · 获赞 9 · 访问量 3862

猜你喜欢

转载自blog.csdn.net/weixin_45154559/article/details/105338037