Day22(File,DiGui,FileOutputStream)

一、FileDemo1

package com.shujia.lhw.day22;

import java.io.File;

/*
    我们想要实现IO操作,就必须要知道硬盘上文件的表现形式
    java提供了一个类让我们操作硬盘上的文件:File
    File也就是文件表现形式

    File:文件和目录(文件夹)路径名的抽象表示

    构造方法:
      public File(String pathname)
        通过将给定的路径名字符串转换为抽象路径名来创建新的File实例,如果给定的字符串是空字符串,则结果是空的抽象路径名
      public File(String parent,String child)
        从父路径名字符串和子路径名字符串创建新的File实例
      public File(File parent,String child)
        从父抽象路径名和子路径名字符串创建新的File实例
 */
public class FileDemo1 {
    public static void main(String[] args) {
        //public File(String pathname)根据一个路径得到一个File对象
        //D:\a.txt封装成一个File对象
        File file = new File("D:\\a.txt");
        System.out.println(file);

        //public File(String parent,String child)
        //父的路径:D:\demo
        //子的路径:b.txt
        File file1 = new File("D:\\demo","b.txt");
        System.out.println(file1);

        //public File(File parent,String child)
        //父的路径:D:\demo
        //字的路径:b.txt
        File file2 = new File("D:\\demo");
        File file3 = new File(file2,"b.txt");
        System.out.println(file3);
    }
}

---------------------------------------------------------------------------------------------------------------------------------

二、FileDemo2

package com.shujia.lhw.day22;

import java.io.File;
import java.io.IOException;

/*
    创建功能:
      public boolean createNewFile()
      public boolean mkdir()
      public boolean mkdirs()
 */
public class FileDemo2 {
    public static void main(String[] args) {
        //需求:我想在D盘下创建一个文件夹demo2
        //封装成File对象,不需要文件或者目录是否已经存在,他只是将一个路径抽象的用File表示
        //将来你可以用File类中的一些方法,来进行创建或者删除
        File file = new File("D:\\demo2");
        //public boolean mkdir()创建由此抽象路径命名的目录,如果目标文件夹已经存在,就不创建了,返回false
        System.out.println(file.mkdir());

        //public boolean createNewFile()当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件
        try {
            System.out.println(file.createNewFile());
        } catch (IOException e) {
            e.printStackTrace();
        }

        //需求2:我想在D盘下面的demo2文件夹中创建一个文件b.txt
        //将目标文件封装成File对象
        File file1 = new File("D:\\demo2\\b.txt");
//        try {
//            System.out.println(file1.createNewFile());
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        System.out.println(file1.mkdir());

        //public boolean mkdirs()创建多级文件夹
        File file2 = new File("D:\\demo2\\demo3\\demo4\\demo5");
        System.out.println(file2.mkdirs());

        //注意1:要想在某个目录下创建文件,前提是该目录必须存在!!!
        File file3 = new File("D:\\demo3\\b.txt");
        try {
            System.out.println(file3.createNewFile());//系统找不到指定的路径
        } catch (IOException e) {
            e.printStackTrace();
        }
        //注意2:将来你要搞清楚是想要创建文件还是想创建文件夹,骑白马的不一定是王子,还有可能是唐僧
    }
}

---------------------------------------------------------------------------------------------------------------------------------

三、FileDemo3

package com.shujia.lhw.day22;

import java.io.File;
import java.io.IOException;

/*
    删除功能:
      public boolean delete()
 */
public class FileDemo3 {
    public static void main(String[] args) throws IOException {
        File file = new File("D:\\a.txt");
        System.out.println(file.delete());

        File file1 = new File("a.txt");
        System.out.println(file1.createNewFile());

        File file2 = new File("aaa\\bbb\\ccc");
        System.out.println(file2.mkdirs());
        System.out.println(file2.delete());

        File file4 = new File("aaa\\bbb");
        System.out.println(file4.delete());

        //需求:我想要删除aaa这个文件夹
        //注意:要删除的目录必须是为空
        File file3 = new File("aaa");
        System.out.println(file3.delete());
    }
}

--------------------------------------------------------------------------------------------------------------------------------

四、FileDemo4

package com.shujia.lhw.day22;

import java.io.File;

/*
    重命名功能:
      public boolean renameTo(File dest)
 */
public class FileDemo4 {
    public static void main(String[] args) {
        File file = new File("D:\\ftm.jpg");
        //现在我想重命名为冯提莫.jpg
        File file1 = new File("D:\\冯提莫.jpg");
        System.out.println(file.renameTo(file1));
    }
}

--------------------------------------------------------------------------------------------------------------------------------

五、FileDemo5

package com.shujia.lhw.day22;

import java.io.File;
import java.sql.SQLOutput;

/*
    判断功能:
      public boolean isDirectory()
      public boolean isFile()
      public boolean exists()
      public boolean canRead()
      public boolean canWrite()
      public boolean isHidden()
 */
public class FileDemo5 {
    public static void main(String[] args) {
        File file = new File("a.txt");
//        File file = new File("b.txt");

        //public boolean isDirectory()判断是否是文件夹
        System.out.println(file.isDirectory());

        //public boolean isFile()判断是否是文件
        System.out.println(file.isFile());

        //public boolean exits()判断目标文件或者文件夹是否存在
        System.out.println(file.exists());

        //public boolean canRead()判断是否可读
        System.out.println(file.canRead());

        //public boolean canWrite()判断是否可写
        System.out.println(file.canWrite());

        //public boolean isHidden()判断是否隐藏
        System.out.println(file.isHidden());
    }
}

---------------------------------------------------------------------------------------------------------------------------

六、FileDemo6

package com.shujia.lhw.day22;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
    基本获取功能:
      public String getAbsolutePath()
      public String getPath()
      public String getName()
      public long length()
      public long lastModified()
 */
public class FileDemo6 {
    public static void main(String[] args) {
        File file = new File("a.txt");

        //public String getAbsolutePath()获取绝对路径,或者说完整路径
        System.out.println(file.getAbsolutePath());

        //public String getName()获取名称
        System.out.println(file.getName());

        //public long length()获取的长度是字节数
        System.out.println(file.length());

        //public long lastModified()返回的是一个时间戳,精确到毫秒
        System.out.println(file.lastModified());

        //java将时间戳与日期进行转换
        //Date(long date)
        //分配一个Date对象,并将其初始化为表示自称为"时代"的标准基准时间以后的指定毫秒数,即1970年1月1日00:00:00 GMT
        Date date = new Date(file.lastModified());
        System.out.println(date);
        SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-ddHH:mm:ss");
        String format = sdf.format(date);
        System.out.println(format);
    }
}

--------------------------------------------------------------------------------------------------------------------------

七、FileDemo7

package com.shujia.lhw.day22;

import java.io.File;

/*
    高级获取功能
      public String[] list()
      public File[] listFiles()
 */
public class FileDemo7 {
    public static void main(String[] args) {
        File file = new File("D:\\数加科技\\十五期");

        //public String[] list()获取指定目录下的所有文件和文件夹的名称的组成数组
        String[] list = file.list();
        for(String s : list){
            System.out.println(s);
        }
        System.out.println("=======================================");
        //public File[] listFile()获取指定目录下的所有文件和文件夹形成的File对象数组
        File[] files = file.listFiles();
        for(File f : files){
            System.out.println(f);
        }
    }
}

---------------------------------------------------------------------------------------------------------------------------------

八、FileDemo8

package com.shujia.lhw.day22;

import java.io.File;

/*
    需求分析:判断D盘下有没有.jpg后的文件,如果有,就输出此文件名称
      1、将D盘根目录封装成一个File对象
      2、获取该目录下所有的文件或者文件夹组成的File对象数组
      3、遍历File数组,得到每一个File对象,然后判断是否是文件
        是:继续判断是否以.jpg后缀
          是:输出名称
            不是:不管他
        不是:不管他
 */
public class FileDemo8 {
    public static void main(String[] args) {
        File file = new File("D:\\");
        File[] files = file.listFiles();
        for(File f : files){
            if(f.isFile()){
                if (f.getName().endsWith(".jpg")){
                    System.out.println(f.getName());
                }
            }
        }
    }
}

-------------------------------------------------------------------------------------------------------------------------------

九、FileDemo9

package com.shujia.lhw.day22;

import java.io.File;
import java.io.FilenameFilter;

/*
    先判断D盘下面有没有.jpg后的文件,如果有就输出此文件名称
    1、先获取所有的文件和文件夹,然后在遍历的时候,再去判断是否是文件,是否是.jpg后缀的,最后再将满足条件的文件过滤出来获取到名称,
    2、在获取的时候,获取到的数据就是满足条件的,我们直接输出就可以了

    文件名称过滤器的实现思想及代码
    public String[] list(FilenameFilter filter)
    public File[] listFile(FilenameFilter filter)
 */
public class FileDemo9 {
    public static void main(String[] args) {
        //创建File对象
        File file = new File("D:\\");

        //public String[] list(FilenameFilter filter)
        String[] list = file.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
//                return false;
//                return true;
                //通过测试发现,目录下的文件或者文件夹该不该获取到,取决于这里的返回值
                //true,就获取到加到数组,如果是false,就不获取,不加到数组中
//                System.out.println(dir);
//                System.out.println(name);
                File file1 = new File(dir,name);
                boolean b = file.isFile();
                boolean b1 = name.endsWith(".jpg");
                return b && b1;
            }
        });

        for (String s : list){
            System.out.println(s);
        }
    }
}

-----------------------------------------------------------------------------------------------------------------------------

十、DiGuiDemo1

package com.shujia.lhw.day22;
/*
    递归:方法定义中调用方法本身的现象
    Math.max(Math.max(a,b)c)这样的现象仅仅是方法的嵌套不是方法的递规使用

    举例:
      1、从前有座山,山里有个庙,庙里有个老和尚,老和尚在给小和尚讲故事,故事的内容是:
         从前有座山,山里有个庙,庙里有个老和尚,老和尚在给小和尚讲故事,故事的内容是:
         从前有座山,山里有个庙,庙里有个老和尚,老和尚在给小和尚讲故事,故事的内容是:
         ...
         庙倒了,老和尚圆寂了

      2、学习大数据--高薪就业--挣钱--娶媳妇--生娃--挣学费:
         学习大数据--高薪就业--挣钱--娶媳妇--生娃--挣学费:
         学习大数据--高薪就业--挣钱--娶媳妇--生娃--挣学费:
         ...
         娶不到媳妇,生不了娃

    递归的注意事项:
      1、递归一定要有一个出口(结束条件),否则就成了死递归
      2、递归的次数不能太多,否则就会造成,栈内存溢出
      3、构造方法不能发生递归

 */
public class DiGuiDemo1 {
//    public DiGuiDemo1(){
//        new DiGuiDemo1();
//    }

    //死递归
    public void show(){
        show();
    }
}

-------------------------------------------------------------------------------------------------------------------------------

十一、DiGuiDemo2

package com.shujia.lhw.day22;
/*
    需求:用代码求出实现5的阶乘
    5!=5*4*3*2*1
      =5*4!
      =5*4*3!
      =5*4*3*2!
      =5*4*3*2*1!

    1、用循环解决
    2、用递归解决
 */
public class DiGuiDemo2 {
    public static void main(String[] args) {
        int i = 1;
        for (int x = 2;x <= 5;x++){
            i = i*x;
        }
        System.out.println("5的阶乘是:"+i);

        //用递归的方法去实现
        System.out.println("5的阶乘是:"+diGui(5));
    }

    /*
        递归方法的前提:
          返回值类型:int
          参数列表:int i
          出口条件:if(i==1){return 1}
          递归主题逻辑:
            if(i!=1){
              return i*deGui(i-1);
            }

     */
    public static int diGui(int i){
        if(i==1){
            return 1;
        }else {
            return i*diGui(i-1);
        }
    }
}

---------------------------------------------------------------------------------------------------------------------------------

十二、DiGuiDemo3

package com.shujia.lhw.day22;
/*
    不死神兔案例:
      假设有一对兔子,从出生的第三个月开始,每个月都生一对兔子,小兔子长到第三个月后,每个月又生一对兔子
      假设所有的兔子都不会死
      问题:二十个月后,兔子的对数是多少?

    找规律:
      月份     兔子的对数
      第一个月    1
      第二个月    1
      第三个月    2
      第四个月    3
      第五个月    5
      第六个月    8
      ...

      由此可见,兔子的对数的数据是:
        1,1,2,3,5,8,13,21,34...

      规律:
        1、从第三项开始,每一项都是前两项之和
        2、说明前两项的数据是已知的

      怎么去实现呢?
        1、数组实现
        2、基本变量实现
        3、递归实现

      定义两个变量为相邻的数据
        第1个相邻的数据:a=1,b=1
        第2个相邻的数据:a=1,b=2
        第3个相邻的数据:a=2,b=3
        第4个相邻的数据:a=3,b=5

      规律:下一次相邻的数据,a的值是上一次b的值,b的值是上一次相邻数据的和a+b

 */
public class DiGuiDemo3 {
    public static void main(String[] args) {
        //用数组实现
        int[] arr = new int[20];
        arr[0] = 1;
        arr[1] = 1;
//        arr[2] = arr[0] + arr[1];
//        arr[3] = arr[1] + arr[2];
//        //...
//        arr[19] = arr[17] + arr[18];
        for(int i = 2;i<arr.length;i++){
            arr[i] = arr[i-2] + arr[i-1];
        }
        System.out.println("第20个月后的兔子对数为:"+arr[19]);
        System.out.println("=============================================");

        //基本变量实现
        //下一次相邻的数据,a的值是上一次b的值,b的值是上一次相邻数据的和a+b
        int a = 1;
        int b = 1;
        for(int i = 1;i <= 18;i++){
            //定义一个临时变量,存储上一次a的值
            int tmp = a;
            a = b;
            b = tmp + b;
        }
        System.out.println("第二十个月后的兔子个数为:"+b);
        System.out.println("=============================================");
        //递归的形式
        System.out.println("第二十个月后的兔子对数为:"+Fibonacci(20));
    }

    /*
        返回值类型:int
        参数列表:int i 20
        <p>
        出口条件:第一个月是1,第二个月也是1
        递归的条件:从第三个月开始,每一个月的值是前两个月之和
     */
    public static int Fibonacci(int i){//4
        //第一个月是1,第二个月也是1
        if(i ==1 | i == 2){
            return 1;
        }else {
            //从第三个月开始,每个月的值都是前两个月之和
            return Fibonacci(i-1) + Fibonacci(i-2);
            //Fibonacci(3) + Fibonacci(2)
            //Fibonacci(2) + Fibonacci(1) + 1
            //1 + 1 + 1
            //3
        }
    }
}

---------------------------------------------------------------------------------------------------------------------------------

十三、DiGuiDemo4

package com.shujia.lhw.day22;

import java.io.File;

/*
    遍历指定目录下所有的指定后缀名文件名称D:\数加科技\十五期

    分析:
      1、将目录封装成File对象
      2、获取该目录下所有的File对象组成的数组
      3、遍历数组得到每一个File对象
      4、判断得到的File对象是一个文件还是一个文件夹
        1)如果他是一个文件夹,回到第二步
        2)如果他是一个文件,判断文件名称是否以.java后缀
          如果是,输出
          如果不是,跳过
 */
public class DiGuiDemo4 {
    public static void main(String[] args) {
        //将目录封装成File对象
        File file = new File("D:\\数加学院\\十五期");

        //递归实现
        getJavaFile(file);
    }

    public static void getJavaFile(File file){
        //获取该目录下所有的File对象组成的数组
        File[] files = file.listFiles();

        //遍历数组得到每一个File对象
        for (File f : files){
            //判断是否是一个文件夹
            if (f.isDirectory()){
                getJavaFile(f);
            }else{
                //判断文件名称是否以.java后缀
                if (f.getName().endsWith(".java")){
                    //如果是,输出
                    System.out.println(f.getName());
                }
            }
        }
    }
}

------------------------------------------------------------------------------------------------------------------------------

十四、DiGuiDemo5

package com.shujia.lhw.day22;

import java.io.File;

/*
    递归删除带内容的目录:

    分析:
      1、获取File对象
      2、获取该目录下所有的文件和文件夹组成的File对象数组
      3、遍历数组得到每一个File对象
      4、判断这个File对象是否是文件夹
        是:返回第二步
        不是:直接删除
 */
public class DiGuiDemo5 {
    public static void main(String[] args) {
        File file = new File("D:\\IdeaProjects\\bigdata15\\aaa");

        deleteFile(file);
    }
    public static void deleteFile(File file){
        //获取该目录下所有的文件和文件夹组成的File对象数组
        File[] files = file.listFiles();

        if(files!=null){
            //遍历数组得到每一个File对象
            for (File f : files){
                //判断这个File对象是否是文件夹
                if(f.isDirectory()){
                    deleteFile(f);
                }else{
                    System.out.println(f.getName()+"---"+f.delete());
                }
            }
            System.out.println(file.getName()+"---"+file.delete());
        }
    }
}

-------------------------------------------------------------------------------------------------------------------------------

十五、FileOutputStreamDemo1

package com.shujia.lhw.day22;

import java.io.File;
import java.io.FileOutputStream;

/*
    IO流的分类:
      流向:
        输入流 读取数据
        输出流 写出数据
      数据类型:
        字节流
          字节输入流 读取数据 InputStream
          字节输出流 写出数据 OutputStream
        字符流
          字符输入流 读取数据 Reader
          字符输出流 写出数据 Writer

    需求:往a.txt文件中写入一句话:"大数据,yyds"

    分析:
      1、由于是对文本文件进行操作的,最好是用字符流来做,但是今天重点讲字节流,字符流是建立在字节流基础之上诞生的,现在就用则节流实现
      2、我们要往文件中写入一句话,就要用到输出流,这里用的是字节输出流

    通过上面的分析,最终锁定OutputStream
    观察API后发现,OutputStream是一个抽象类,不能直接被实例化
    FileOutputStream:
      构造方法:
        FileOutputStream(File file)创建文件输出流以写入有指定的File对象表示的文件
        FileOutputStream(String name)创建文件输出流以指定的名称写入文件

      字节输出流的步骤:
        1、创建字节输出流对象
        2、调用方法,写数据
        3、释放资源
 */
public class FileOutputStreamDemo1 {
    public static void main(String[] args) throws Exception{
        //创建字节流输出对象
        //FileOutputStream(File file)创建文件输出流以写入由指定的File对象表示的文件
        File file = new File("b.txt");
        //如果目标文件不存在,自动创建
//        FileOutputStream fos = new FileOutputStream(file);
        //FileOutputStream(String name)创建文件输出流以指定的名称写入文件

        //如果目标文件不存在,自动创建
        FileOutputStream fos = new FileOutputStream("c.txt");
//        System.out.println(fos);

        //调用方法,写数据
        fos.write("大数据,yyds".getBytes());

        //释放资源
        //close()关闭此文件输出流并释放与此流相关联的任何系统资源
        fos.close();

        fos.write("继续写入".getBytes());
    }
}

-------------------------------------------------------------------------------------------------------------------------------

十六、FileOutputStreamDemo2

package com.shujia.lhw.day22;

import java.io.FileOutputStream;

/*
    字节输出流写数据的几种方法:
      public void write(int b)
      public void write(byte[] b)
      public void write(byte[] b,int off,int len)
 */
public class FileOutputStreamDemo2 {
    public static void main(String[] args) throws Exception{
        //创建字节输出流对象
        FileOutputStream fos = new FileOutputStream("d.txt");

        //public void write(int b)
        //97,底层存储的二进制,97对应的ASCII码的字符是a
        fos.write(97);
        fos.write(48);
        fos.write(65);

        //public void write(byte[] b)
        byte[] bytes = {97,98,99,100,101};
        fos.write(bytes);

        //public void write(byte[] b,int off,int len)
        //从位于偏移量off的指定字节数组写入len字节到该文件输出流
        fos.write(bytes,1,3);

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

------------------------------------------------------------------------------------------------------------------------------

十七、FileOutputStreamDemo3

package com.shujia.lhw.day22;

import java.io.FileOutputStream;

/*
    1、如何实现换行呢?
      要想知道为什么没有实现换行?因为我们只写入了数据的字节,并没有写入换行符
      如何实现呢?在写字节的时候,添加一个换行符,注意:不同的系统,换行符不一定一样
      Mac:\r
      Windows:\r\n
      Linux:\n

    2、如何实现追加呢?

 */
public class FileOutputStreamDemo3 {
    public static void main(String[] args) throws Exception {
        //创建字节输出流对象
//        FileOutputStream fos = new FileOutputStream("e.txt");
//        fos.write("大数据1,yyds".getBytes());
//        fos.write("\r\n".getBytes());
//        fos.write("大数据2,yyds".getBytes());

        //FileOutputStream(String name,boolean append)
        //创建文件输出流以指定的名称写入文件
        //true表示的是可以追加写入数据
        FileOutputStream fos = new FileOutputStream("e.txt", true);
        fos.write("\r\n今天下雪了\r\n".getBytes());
//        fos.write("\r\n".getBytes());
        fos.write("但是没有看到积雪".getBytes());

        //释放资源
        fos.close();
        //...
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘浩浩yyds

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值