Java&day10

回顾

线程池
	把多个线程放在线程池,用的时候拿出来使用,用完之后再放回线程池,可以反复使用线程对象,提高效率。
	
死锁产生的原因
	要有多个线程
	要有多个锁
	线程获取到了不同的锁
	(同步代码块的嵌套)
	
说出线程6个状态的名称
	新建状态
	可运行状态
	锁阻塞状态
	无限等待状态
	计时等待状态
	终止状态
	
理解等待唤醒案例
	wait()		:等待,调用这个方法之后线程会释放锁给别的线程使用
	notify()	:唤醒,唤醒正在等待这个锁的某个线程
	这两个方法必须使用锁对象来调用
	
Lambda表达式
	前提
		必须用于函数式接口,接口中抽象方法只有一个
	格式
		(方法的参数)->{方法的代码}
	简化
		(int a) ->{System.out.println(a);};
		
		a ->System.out.println(a);
		
掌握常用的流操作[可以忘]
	获取流:
		list.stream();
		set.stream();
		Stream.of(arr);
	常用操作:
		终结方法:
			count()	:获取元素的个数
			forEach():遍历元素
		非终结方法:
			filter()  :过滤元素
			limit()	  :选取前几个
			skip()    :跳过前几个
			map()     :映射,把一种类型转成另一种类型
			concat()  :合并两个流的元素
	收集:
		stream.collect(Collectors.toList());
		stream.collect(Collectors.toSet());
		stream.toArray();

1.File类

1.概述

​ File表示文件或文件夹的抽象路径。

​ 注意:抽象路径的意思是路径可以存在也可以不存在。

2.构造方法
方法说明
public File(String pathname)给定路径名称创建File对象
public File(String parent, String child)给定父路径和子路径创建File对象
public File(File parent, String child)给定父路径的File类型和子路径创建File对象
  • 代码演示

    package com.itheima_01;
    import java.io.File;
    
    //在java语言中 ""里面的\必须写成\\
    //   \本身是转义字符的意思
    public class Test01 {
        public static void main(String[] args) {
            //File的构造方法
            //public File(String pathname)
            //给定路径名称创建File对象
    
            File f = new File("C:\\Users\\jin\\Desktop\\day10");
            //File f = new File("C:/Users/jin/Desktop/day10");
            System.out.println(f);
    
    
    
            //public File(String parent, String child)
            //给定父路径和子路径创建File对象
            //File f2 = new File("C:\\Users\\jin\\Desktop","day10");
            File f2 = new File("C:\\Users\\jin","Desktop\\day10");
            System.out.println(f2);
    
    
            //public File(File parent, String child)
            //给定父路径的File类型和子路径创建File对象
            File f3 = new File("C:\\Users\\jin\\Desktop");
            File f4 = new File(f3,"day10");
            System.out.println(f4);
    
    
        }
    }
    
3.获取方法
  • 方法介绍

    方法说明
    getAbsolutePath()获取绝对路径
    getPath()获取创建对象时的路径
    getName()获取文件名
    length()获取文件大小(不能获取目录的大小)
  • 代码演示

    package com.itheima_01;
    import java.io.File;
    
    public class Test02 {
        public static void main(String[] args) {
            //获取方法
            File f = new File("C:\\Users\\jin\\Desktop\\123.txt");
    
            //getAbsolutePath()
            //获取绝对路径(从盘符开始的路径就是绝对路径)
            System.out.println(f.getAbsolutePath());
    
            //getPath()
            //获取创建对象时的路径
            System.out.println(f.getPath());
    
            //getName()
            //获取文件名(获取最后一级名字)
            System.out.println(f.getName());
    
            //length()
            //获取文件大小,不能获取目录的大小
            //文件大小就是文件的字节数
            System.out.println(f.length());   //435字节
        }
    }
    
4.绝对路径和相对路径

​ 绝对路径:从盘符开始的路径叫绝对路径。

​ 相对路径:不以盘符开始写的路径就是相对路径。

public class Test03 {
    public static void main(String[] args) {
        //绝对路径
        File f1 = new File("C:\\User\\jin\\Desktop\\123.txt");

        File f2 = new File("C:\\soft\\IdeaProjects\\tjjavaSE05\\abc.txt");
        System.out.println(f2.length());

        //如果要表示当前项目下的路径
        //就可以使用相对路径,相对路径就是默认会在当前项目下寻找
        File f3 = new File("abc.txt");
        System.out.println(f3.length());

        File f4 = new File("day10\\aaa.txt");
        System.out.println(f4.length());
    }
}
5.判断方法
  • 方法介绍

    方法说明
    exists()判断路径是否存在
    isFile()判断是否是文件
    isDirectory()判断是否是文件夹(目录)
  • 代码演示

    package com.itheima_01;
    
    import java.io.File;
    
    public class Test04 {
        //判断方法
        public static void main(String[] args) {
    
            File f = new File("day10\\src");
            //exists()
            //判断路径是否存在
            System.out.println(f.exists());
    
            //isFile()
            //判断是否是文件,如果不是文件或不存在false
            System.out.println(f.isFile());
    
            //isDirectory()
            //判断是否是文件夹(目录),如果不是文件夹或不存在false
            System.out.println(f.isDirectory());
        }
    }
    
5.创建删除方法
  • 方法介绍

    方法说明
    createNewFile()创建一个文件
    delete()删除一个文件或空文件夹(不能删除有文件的文件夹)
    mkdir()创建单层文件夹
    mkdirs()创建任意层文件夹
  • 代码演示

    package com.itheima_01;
    
    import java.io.File;
    import java.io.IOException;
    
    public class Test05 {
        //创建删除方法
        public static void main(String[] args) throws IOException {
    
            File f0 = new File("day10\\aaa\\sfsd.txt");
            File f = new File("day10\\aaa");
    
            //createNewFile()
            //创建一个文件
            f.createNewFile();
    
            //delete()
            //删除一个文件或空文件夹(不能删除有文件的文件夹)
            //删除方法不走回收站,你别删除有用的文件
            f0.delete();
            f.delete();
    
            //mkdir()
            //创建单层文件夹
            File f2 = new File("day10\\aaa");
            f2.mkdir();
            
            //mkdirs()
            //创建任意层文件夹
            File f3 = new File("day10\\bbb\\ccc");
            f3.mkdirs();
        }
    }
    
6.遍历目录方法
  • 方法介绍

    方法说明
    list()获取目录下所有内容的名称
    listFiles()获取目录下所有内容的File对象形式
  • 代码演示

    package com.itheima_01;
    
    import java.io.File;
    
    public class Test06 {
        public static void main(String[] args) {
    
            File f = new File("C:\\Users\\jin\\Desktop\\day10");
            //list()
            //获取目录下所有内容的名称
            String[] list = f.list();
            //遍历
            for (String s : list) {
                System.out.println(s);
            }
    
            System.out.println("---------------------------");
    
            //listFiles()
            //获取目录下所有内容的File对象形式
            File[] files = f.listFiles();
            //遍历
            for (File file : files) {
                System.out.println(file);
            }
        }
    }
    
  • 练习

    • 统计文件夹下java文件的个数
    package com.itheima_01;
    
    import java.io.File;
    
    public class Test07 {
        //统计文件夹下java文件的个数
        public static void main(String[] args) {
    
            File f = new File("C:\\Users\\jin\\Desktop\\新建文件夹");
    
            //获取文件夹下内容的名称
            File[] files = f.listFiles();
            //遍历
            for (File file : files) {
                if(file.isFile()&&file.getName().endsWith(".java")){
                    System.out.println(file.getName());
                }
            }
        }
    }
    

2.递归

1.概述

​ 递归就是把一个大问题拆分成同类型的小问题去解决。

​ 在java中递归就是方法自己调用自己。

​ 不能无限递归,递归要有尽头。

从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,他讲的故事是
	从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,他讲的故事是
		从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,他讲的故事是
2.求5的阶乘
5! =  4! * 5;
4! =  3! * 4;
3! =  2! * 3;
2! =  1! * 2;
1! =  1;

n! = (n-1)! * n;

package com.itheima_02;

public class Test01 {
    //虚拟机调用
    public static void main(String[] args) {

        int result = jieCheng(5);

        System.out.println("5的阶乘是" + result);

    }

    //递归方法
    //求n的阶乘
    public static int jieCheng(int n){
        if(n == 1){
            return 1;
        }

        //n的阶乘 =  n-1的阶乘 * n;
        return jieCheng(n-1) * n;

    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oYY5XuVl-1598452316941)(img\递归求阶乘.png)]

3.查找文件夹下所有的.java文件
package com.itheima_02;
import java.io.File;

public class Test02 {
    //递归打印文件夹下所有.java文件
    public static void main(String[] args) {
        //调用
        print(new File("C:\\Users\\jin\\Desktop\\新建文件夹"));

    }


    //递归方法
    public static void print(File file){
        //调用获取文件夹下的内容
        File[] files = file.listFiles();
        //遍历
        for (File f : files) {
            //对f做一个判断
            if(f.isFile()){
                if(f.getName().endsWith(".java")){
                    System.out.println(f);
                }
            }else if(f.isDirectory()){
                //判断是文件夹
                print(f);
            }
        }
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7wclHppm-1598452316944)(img\递归查文件.png)]

3.IO流

1.什么是IO

​ I是In的意思,O是Out的意思。IO是对于数据的输入和输出。

2.IO的分类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vujnyA7A-1598452316946)(img\IO流分类.png)]

4.字节流

​ 其实在计算机中任何数据都是以字节的方式保存的。字节流可以以字节的方式来操作数据。

1.输出流父类OutputStream
  • 常用方法

    方法说明
    close()关闭流资源
    write(byte[] b)输出字节数组
    write(byte[] b, int off, int len)输出字节数组的一部分。off表示开始索引,len表示个数
    write(int b)输出一个字节
2.输出流子类FileOutputStream
  • 构造方法

    方法说明
    public FileOutputStream(File file)向指定文件位置输出数据
    public FileOutputStream(String name)*向指定字符串路径输出数据
    public FileOutputStream(File file,boolean b)创建对象的同时指定是否续写true表示是
    public FileOutputStream(String name,boolean b)*创建对象的同时指定是否续写true表示是
  • 代码演示

    • 构造方法演示
    package com.itheima_03;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    
    public class Test01 {
        public static void main(String[] args) throws FileNotFoundException {
            //字节输出流的构造方法
    
            /*
                注意事项:
                    如果文件不存在构造方法会创建文件
                    如果文件已存在构造方法会覆盖文件
                    构造方法只能指向文件,不能指向文件夹(报错:拒绝访问。)
                    true表示续写,如果文件存在不会覆盖之前的内容,在原来内容的基础上续写
             */
            //new FileOutputStream(String pathname) :参数表示路径名称
            //FileOutputStream fos = new FileOutputStream("day10\\123.txt");
    
            //new FileOutputStream(File file) :参数表示路径名称
            //FileOutputStream fos2 = new FileOutputStream(new File("day10\\123.txt"));
    
            //new FileOutputStream(String pathname,boolean b) 
           //					:参数表示路径名称,第二个参数表示是否续写
            FileOutputStream fos = new FileOutputStream("day10\\123.txt",true);
    
            //new FileOutputStream(File file,boolean b) 
            //					:参数表示路径名称,第二个参数表示是否续写
            //FileOutputStream fos2 = 
            //  				new FileOutputStream(new File("day10\\123.txt"),true);
        }
    }
    
    • 常用方法的演示
    package com.itheima_03;
    
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class Test02 {
        //FileOutputStream的方法
        public static void main(String[] args) throws IOException {
            //创建对象
            FileOutputStream fos = new FileOutputStream("day10\\123.txt");
    
            //write(int b)  byte -128 ~ 127
            //输出一个字节,保存的是对应的字符
            fos.write(97);
    
            //write(byte[] b)
            //输出字节数组
            byte[] arr = {65,66,68,100,102};
            fos.write(arr);
    
            //write(byte[] b, int off, int len)
            //输出字节数组的一部分。off表示开始索引,len表示个数
            fos.write(arr,2,3);
    
            //close()
            //关闭流资源,关闭之后就不能用了
            fos.close();
    
    
        }
    }
    
    • 输出换行
    //输出
    for (int i = 48; i < 58; i++) {
        //换行
        fos.write('\r');
        fos.write('\n');
        fos.write(i);
    }
    
3.输入流父类InputStream
  • 常用方法

    方法说明
    close()关闭流资源
    read()每次读取一个字节,返回值代表的是字节
    read(byte[] b)每次读取一个数组的字节,返回值代表读取到的字节个数
4.输入流子类FileInputStream
  • 构造方法

    方法说明
    FileInputStream(File file)从指定的File文件读取数据
    FileInputStream(String name)从指定字符串路径位置读取数据
  • 代码演示

    • 构造方法演示
    package com.itheima_03;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    
    public class Test04 {
        public static void main(String[] args) throws FileNotFoundException {
            //字节输入流FileInputStream的构造方法
            /*
                注意事项:
                    如果文件不存在,构造方法会报错 (报错:系统找不到指定的文件。)
                    构造方法只能指向文件,不能指向文件夹(报错:拒绝访问。)
             */
            //FileInputStream(File file)
            //从指定的File文件读取数据
            FileInputStream fis = new FileInputStream(new File("day10\\123.txt"));
    
            //FileInputStream(String name)
            //从指定字符串路径位置读取数据
            //FileInputStream fis2 = new FileInputStream("day10\\123.txt");
        }
    }
    
    • 输入流的常用方法演示

      • 一次读取一个字节
      package com.itheima_03;
      
      import java.io.FileInputStream;
      import java.io.FileNotFoundException;
      import java.io.IOException;
      
      public class Test05 {
          public static void main(String[] args) throws IOException {
              //创建对象
              FileInputStream fis = new FileInputStream("day10\\123.txt");
      
      
              //read()
              //每次读取一个字节,返回值代表的是字节的值
              /*
              System.out.println(fis.read());    //97
              System.out.println(fis.read());    //98
              System.out.println(fis.read());    //13
              System.out.println(fis.read());    //10
              System.out.println(fis.read());    //99
              System.out.println(fis.read());    //如果读取到了文件的末尾,方法会返回-1代表没有了
              */
      
              /*
                  fis.read()   执行一次读取方法
                  i=fis.read() 把结果赋值给i
                  i != -1      判断i的值是否是-1
               */
              int i;
              while((i=fis.read()) != -1){
                  System.out.println(i);
              }
      
              //close()
              //关闭流资源
              fis.close();
          }
      }
      
      • 一次读取一个字节数组
      package com.itheima_03;
      
      import java.io.FileInputStream;
      import java.io.IOException;
      import java.util.Arrays;
      
      public class Test06 {
          public static void main(String[] args) throws IOException {
              //创建对象
              FileInputStream fis = new FileInputStream("day10\\123.txt");
              //read(byte[] b)
              //每次读取一个数组的字节,返回值代表读取到的字节个数
              //把数据放到数组中,返回的是字节个数
      /*
              byte[] arr = new byte[5];
              //第一次读取
              System.out.println(fis.read(arr));  //字节个数:5
              System.out.println(Arrays.toString(arr)); //[97, 98, 99, 100, 101]
      //
      //        //第二次读取
              System.out.println(fis.read(arr));  //字节个数:2
              System.out.println(Arrays.toString(arr)); //[102, 103, 99, 100, 101]
      //
      //        //第三次读取
              System.out.println(fis.read(arr));  //字节个数:-1文件读取到最后,会返回-1表示没有了
              System.out.println(Arrays.toString(arr)); //[102, 103, 99, 100, 101]
      */
      
              //循环
              byte[] arr = new byte[5];
              int len;
              while((len=fis.read(arr)) != -1){
                  System.out.print(new String(arr,0,len));
              }
      
              //close()
              //关闭流资源
              fis.close();
          }
      }
      
5.案例:图片复制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PCPmXACe-1598452316949)(img\文件复制.png)]

5.字符流

​ 字符流专门用来操作中文文本,因为一个中文占用多个字节。

1.字符输入流父类Reader
方法说明
close()关闭流资源
read()读取一个字符
read(char[] chs)读取一个字符数组的内容
2.FileReader类
  • 构造方法

    方法说明
    FileReader(File file)使用File对象的路径创建输入流
    FileReader(String fileName)使用字符串路径创建输入流
  • 代码演示

    • 构造方法演示
    package com.itheima_04;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    
    public class Test04 {
        //FileReader的构造方法
        public static void main(String[] args) throws FileNotFoundException {
    
            /*
                注意事项:
                    如果文件不存在,会抛出异常(报错:系统找不到指定的文件)
                    构造方法只能写文件,不能写文件夹(报错:拒绝访问)
             */
            FileReader fr = new FileReader("day10\\123.txt");
    
            //FileReader f2 = new FileReader(new File("day10\\123.txt"));
        }
    }
    
    • 常用读取方法演示

      • 一次读取一个字符
      package com.itheima_04;
      
      import java.io.FileNotFoundException;
      import java.io.FileReader;
      import java.io.IOException;
      
      public class Test05 {
          public static void main(String[] args) throws IOException {
              //创建对象
              FileReader fr = new FileReader("day10\\123.txt");
      
              //read()
              //读取一个字符,返回的是字符的值,如果读到了末尾,会返回-1表示没有了
              /*
              System.out.println(fr.read());  //97
              System.out.println(fr.read());  //98
              System.out.println(fr.read());  //25105
              System.out.println(fr.read());  //20320
              System.out.println(fr.read());  //-1
              */
              int ch;
              while((ch=fr.read()) != -1){
                  System.out.println((char)ch);
              }
      
              //close()
              //关闭流资源
              fr.close();
          }
      }
      
      • 一次读取字符数组
      package com.itheima_04;
      
      import java.io.FileReader;
      import java.io.IOException;
      import java.util.Arrays;
      
      public class Test06 {
          public static void main(String[] args) throws IOException {
              //创建对象
              FileReader fr = new FileReader("day10\\123.txt");
      
              //read(char[] arr)
              //每次读取多个字符,返回值表示读到的字符个数,如果读到了末尾返回-1
              /*
              char[] arr = new char[5];
      
              //第一次读取
              System.out.println(fr.read(arr));           //读到的个数5
              System.out.println(Arrays.toString(arr));   //[a, b, c, d, e]
      
              //第二次读取
              System.out.println(fr.read(arr));           //读到的个数4
              System.out.println(Arrays.toString(arr));   //[f, 我, 爱, 你, e]
      
              //第三次读取
              System.out.println(fr.read(arr));           //-1
              System.out.println(Arrays.toString(arr));   //[f, 我, 爱, 你, e]
      
              */
      
              //循环
              char[] chs = new char[5];
              int len;
              while((len=fr.read(chs)) != -1){
                  System.out.println(new String(chs,0,len));
              }
      
              //close()
              //关闭流资源
              fr.close();
          }
      }
      
3.字符输出流父类Writer
  • 常用方法
方法说明
close()关闭流资源
flush()刷新
write(int c)写出一个字符
write(char[] cbuf)写出一个字符数组的内容
write(char[] b, int off, int len)写出一个字符数组的一部分
write(String str)写出一个字符串
4.FileWriter类
  • 构造方法

    方法说明
    FileWriter(File file)用File对象所表示的路径创建输出流对象
    FileWriter(String fileName)File字符串所表示的路径创建输出流对象
    FileWriter(File file,boolean b)用File对象所表示的路径创建输出流对象,true表示续写
    FileWriter(String fileName,boolean b)File字符串所表示的路径创建输出流对象,true表示续写
  • 代码演示

    • 构造方法演示
    package com.itheima_04;
    
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    
    public class Test01 {
        public static void main(String[] args) throws IOException {
            //字符输出流FileWriter构造方法
            /*
                注意事项:
                    如果文件不存在,会自动创建文件
                    如果文件已存在,会覆盖原有文件
                    构造方法中只能写文件,不能写文件夹(报错:拒绝访问。)
                    如果加上一个true,表示在原有文件内容上续写
             */
            //new FileWriter(String name)
            //FileWriter fw = new FileWriter("day10\\123.txt");
    
            //new FileWriter(File file)
            //FileWriter fw2 = new FileWriter(new File("day10\\123.txt"));
    
    
            //new FileWriter(String name,boolean b)
            //FileWriter fw = new FileWriter("day10\\123.txt",true);
    
            //new FileWriter(File file,boolean b)
            FileWriter fw = new FileWriter(new File("day10\\123.txt"),true);
        }
    }
    
    • 常用方法演示

      • 关闭和刷新
      package com.itheima_04;
      import java.io.FileWriter;
      import java.io.IOException;
      
      public class Test02 {
          public static void main(String[] args) throws IOException {
              //字符输出流  关闭和刷新
              //创建对象
              FileWriter fw = new FileWriter("day10\\123.txt");
      
              //如果缓冲区满了或者调用了刷新方法数据才会真正进入文件
              fw.write(97);
              fw.write(98);
      
              //flush()
              //在输出数据时,会先存到缓冲区
              //刷新,刷新之后可以继续输出
              //fw.flush();
      
              //close()
              //关闭流资源
              //在关闭流的时候,会自动刷新缓冲区的剩余内容
              //只要最后调用了关闭方法,数据就一定都进到文件了
              fw.close();
      
          }
      }
      
      • 常用方法
      package com.itheima_04;
      
      import java.io.FileWriter;
      import java.io.IOException;
      
      public class Ttest03 {
          public static void main(String[] args) throws IOException {
      
              //FileWriter的输出方法
              FileWriter fw = new FileWriter("day10\\123.txt");
      
      
              //write(int c)
              //写出一个字符
              fw.write(97);
              fw.write('a');
              fw.write('我');
      
              //write(char[] cbuf)
              //写出一个字符数组的内容
              char[] arr = {'a','b','c','d'};
              fw.write(arr);
      
      
              //write(char[] b, int off, int len)
              //写出一个字符数组的一部分
              fw.write(arr,2,2);
      
      
              //write(String str)
              //写出一个字符串
              fw.write("柳岩瞎写");
      
              //关闭
              fw.close();
          }
      }
      
字节流和字符流的区别
字节流:
	操作文本文档以外的数据时一定使用字节流

字符流:
	操作文本文档就用字符流
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值