IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java基础知识(三十一)IO流(二) File类、递归、IO流基础 -> 正文阅读

[Java知识库]Java基础知识(三十一)IO流(二) File类、递归、IO流基础

目录

一、 File类

1、File:

2、构造方法:

3、创建功能

4、删除功能

5、? 重命名功能

6、判断功能

7、基本获取功能

8、高级获取功能

9、需求:

二、递归

1、概述:

2、? ?递归的注意事项:

3、需求:用代码求出实现5的阶乘

4、不死神兔案例

5、遍历指定目录下所有的指定后缀名文件名称

?6、递归删除带内容的目录

三、IO流基础

1、?IO流的分类:

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

3、字节输出流写数据的几种方法:

4、如何实现换行、如何实现追加


一、 File类

1、File:

? ? ? ?File也就是文件表现形式

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

2、构造方法:

? ? ? ? ? ? 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对象
        //F:\a.txt封装成一个File对象
        File file = new File("F:\\a.txt");
        System.out.println(file);

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

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


    }
}

?输出结果:

3、创建功能

? ? ? ? ? ? public boolean createNewFile()
? ? ? ? ? ? public boolean mkdir()
? ? ? ? ? ? public boolean mkdirs()

?代码举例:

public class FileDemo2 {
    public static void main(String[] args) {
        //需求:我想在F盘下面创建一个文件夹demo2
        //封装成File对象,不需要文件或者目录是否已经存在,它只是将一个路径抽象的用File表示
        //将来你可以用File类中的一些方法,来进行创建或者删除
        File file = new File("F:\\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:我想在F盘下面的demo2文件夹中创建一个文件b.txt
        //将目标文件封装成File对象
        File file1 = new File("F:\\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("F:\\demo2\\demo3\\demo4\\demo5");
        System.out.println(file2.mkdirs());

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

输出结果:

4、删除功能

? ?public boolean delete()

代码举例:

public class FileDemo3 {
    public static void main(String[] args) throws IOException {
        File file = new File("F:\\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());

    }
}

输出结果:

?

5、? 重命名功能

?public boolean renameTo(File dest)

代码举例:

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


    }
}

重命名成功输出true,错误输出false,可到对应的文件夹查看具体效果

6、判断功能

? ? ? ? ? ? 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 exists() 判断目标文件或者文件夹是否存在
        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());



    }
}

输出结果:

?

7、基本获取功能

? ? ? ? ? ? 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 getPath()
        //获取相对路径
        System.out.println(file.getPath());

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

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

        //public long lastModified()
        //1645064059299  精确到毫秒
        //返回的是一个时间戳
        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("yyyy-MM-dd HH:mm:ss");
        String format = sdf.format(date);
        System.out.println(format);


    }
}

?输出结果:

?

8、高级获取功能

? ? ? ? public String[] list()
? ? ? ? public File[] listFiles()

?代码举例:

public class FileDemo7 {
    public static void main(String[] args) {
        File file = new File("E:\\数加科技\\十五期");

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

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

    }
}

9、需求:

?? ? 需求:判断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());
                }
            }
        }

    }
}

?另一种思路:

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

? ? ? ? 文件名称过滤器的实现思想及代码
? ? ? ? public String[] list(FilenameFilter filter)
? ? ? ? public File[] listFiles(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 = file1.isFile();
                boolean b1 = name.endsWith(".jpg");
                return b && b1;
            }
        });

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

    }
}

二、递归

1、概述:

? ? ? ? 递归:方法定义中调用方法本身的现象
? ? ? ? Math.max(Math.max(a,b),c) 这样的现象仅仅是方法的嵌套不是方法的递归使用

2、? ?递归的注意事项:

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

代码举例;

public class DiGuiDemo1 {

//    public DiGuiDemo1(){
//        DiGuiDemo1();
//    }


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

3、需求:用代码求出实现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*diGui(i-1);
     *     }
     */
    public static int diGui(int i){
        if(i==1){
            return 1;
        }else {
            return i*diGui(i-1);
        }
    }
}

4、不死神兔案例

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

? ? 找规律:
? ? ? ? ?月份 ? ? ?兔子的对数
? ? ? ? ?第一个月 ? ? ?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("第20个月后的兔子对数为:" + b);
        System.out.println("=============================");
        //递归的形式
        System.out.println("第20个月后的兔子对数为:" + 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
        }
    }

}

5、遍历指定目录下所有的指定后缀名文件名称

? ? ? ? 分析:
? ? ? ? ? ? 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("E:\\数加科技\\十五期");

        //递归实现
        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());
                }
            }
        }
    }

}

?6、递归删除带内容的目录

? ? ? ? 分析:
? ? ? ? ? ? 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());
        }

    }

}

三、IO流基础

1、?IO流的分类:

? 流向:
? ? ? ? ? ? ? ? 输入流 读取数据
? ? ? ? ? ? ? ? 输出流 写出数据
? 数据类型:
? ? ? ? ? ? ? ? 字节流
? ? ? ? ? ? ? ? ? ? 字节输入流 读取数据 InputStream
? ? ? ? ? ? ? ? ? ? 字节输出流 写出数据 OutputStream
? ? ? ? ? ? ? ? 字符流
? ? ? ? ? ? ? ? ? ? 字符输入流 读取数据 Reader
? ? ? ? ? ? ? ? ? ? 字符输出流 写出数据 Writer

2、?? 需求:往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());




    }
}

3、字节输出流写数据的几种方法:

? ? ? ? ? ? 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[] byts = {97,98,99,100,101};
        fos.write(byts);

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




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

4、如何实现换行、如何实现追加

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

?代码举例:

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();
        //....
    }
}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-19 01:00:55  更:2022-02-19 01:01:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 13:01:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码