当前位置: 首页 > news >正文

Apache-Commons-FileIOUtils工具类常用方法使用

一、导入依赖

1.1、Maven项目

mavne依赖

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

1.2、Java项目

1、下载依赖

  1. 访问Apache官网:https://www.apache.org/

  2. 翻到最下面,找到Commons,点进去

    在这里插入图片描述

  3. 然后在下面表格里找到IO,并点击进入

    在这里插入图片描述

  4. 这里下载最新版本,JDK版本必须为Java8

    在这里插入图片描述

  5. 这里选择.zip结尾的,上面那个是Linux系统下载的

    在这里插入图片描述

  6. 下载好后解压,就会有一个目录,只需要把圈出来的jar包导入到项目里即可

    在这里插入图片描述

2、导入依赖

  1. 打开Idea,点击左上角的项目,然后点击Project Structure...,打开项目资源

    在这里插入图片描述

  2. 然后点击左侧的Libraries,然后点击+号,再选择Java

    在这里插入图片描述

  3. 在文件夹里找到我们的jar包,然后选择则,点击OK

  4. 当项目里出现这个文件,就代表着导入成功了

    在这里插入图片描述

二、API文档查看步骤

  1. 打开下载的文件的docs目录,里面存放着所有api的文档,然后打开index.html页面

    在这里插入图片描述

  2. 然后找到我们下载的包io

    在这里插入图片描述

  3. 进入IO后,我们找到本次学习的FileUtils类,点击进入

    在这里插入图片描述

  4. 然后就会看到里面所有的方法等等

    在这里插入图片描述

三、文件常用API使用

这里大概分了几种类型方便查找使用

这里为了方便观看,所有异常直接抛出

1、操作步骤目录和文件都包含的

(1)将一个文件拷贝到某个目录下

copyFileToDirectory:将一个文件拷贝到某个目录下(目标目录不存在就会创建)

准备

  1. 在test目录里创建aaa.txt文件

    在这里插入图片描述

开始

将文件复制到不存在的aaa目录里

package com.tcc.test;

import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;

import java.io.*;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        FileUtils.copyFileToDirectory(new File("d:/test/aaa.txt"),new File("d:/test/aaa"));
    }
}
  • 结果(创建了目录aaa,并粘贴了文件)

    在这里插入图片描述

(2)列出指定目录下的所有文件(可过滤)

listFiles:列出指定目录下的所有文件(可过滤子目录)

准备

  1. 在test目录里创建两个目录,两个文件

    在这里插入图片描述

  2. 在两个目录里分别创建两个文件

    在这里插入图片描述

开始

遍历test目录及其子目录下所有文件

package com.tcc.test;

import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.IOFileFilter;

import java.io.*;
import java.util.Collection;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        Collection<File> files =  FileUtils.listFiles(new File("d:/test"), new IOFileFilter() {
            /**
             * 所有文件的过滤器
             * @param file
             * @return
             */
            @Override
            public boolean accept(File file) {
                return true;
            }

            @Override
            public boolean accept(File file, String s) {
                return true;
            }
        }, new IOFileFilter() {
            /**
             * 子目录过滤器,可以过滤子目录
             * @param file
             * @return
             */
            @Override
            public boolean accept(File file) {
                return true;
            }

            @Override
            public boolean accept(File file, String s) {
                return true;
            }
        });

        for (File file : files) {
            System.out.println(file.toString());
        }
    }
}
  • 结果

    在这里插入图片描述

遍历test目录下除了ccc.html文件的所有文件

package com.tcc.test;

import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.IOFileFilter;

import java.io.*;
import java.util.Collection;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        Collection<File> files =  FileUtils.listFiles(new File("d:/test"), new IOFileFilter() {
            /**
             * 所有文件的过滤器
             * @param file
             * @return
             */
            @Override
            public boolean accept(File file) {
                // 如果文件名称是以html结尾的,则拦截
                if(file.getName().endsWith("html")){
                    return false;
                }
                return true;
            }

            @Override
            public boolean accept(File file, String s) {
                return false;
            }
        }, new IOFileFilter() {
            /**
             * 子目录过滤器,可以过滤子目录
             * @param file
             * @return
             */
            @Override
            public boolean accept(File file) {
                return true;
            }

            @Override
            public boolean accept(File file, String s) {
                return false;
            }
        });

        for (File file : files) {
            System.out.println(file.toString());
        }
    }
}
  • 结果

    在这里插入图片描述

遍历test目录下除了aaa目录下的所有文件

package com.tcc.test;

import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.IOFileFilter;

import java.io.*;
import java.util.Collection;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        Collection<File> files =  FileUtils.listFiles(new File("d:/test"), new IOFileFilter() {
            /**
             * 所有文件的过滤器
             * @param file
             * @return
             */
            @Override
            public boolean accept(File file) {
                return true;
            }

            @Override
            public boolean accept(File file, String s) {
                return false;
            }
        }, new IOFileFilter() {
            /**
             * 子目录过滤器,可以过滤子目录
             * @param file
             * @return
             */
            @Override
            public boolean accept(File file) {
                /**
                 * 如果文件名是aaa,那么就拦截不遍历其下所有文件
                 */
                if("aaa".equals(file.getName())){
                    return false;
                }
                return true;
            }

            @Override
            public boolean accept(File file, String s) {
                return false;
            }
        });

        for (File file : files) {
            System.out.println(file.toString());
        }
    }
}
  • 结果

    在这里插入图片描述

(3)返回文件/目录的大小

sizeOf:返回文件/目录的大小

准备

  1. 在test目录下,创建aaa.txt文件,里面输入测试数据,并且右键查看文件大小,记住文件字节大小

    在这里插入图片描述

  2. 在test里再创建一个bbb目录,然后在里面新建bbb.txt文件,里面输入测试内容,并且查看字节大小

    在这里插入图片描述

开始

获取aaa.txt文件以及bbb目录的大小

package com.tcc.test;

import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.IOFileFilter;

import java.io.*;
import java.util.Collection;
import java.util.List;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        long l1 = FileUtils.sizeOf(new File("d:/test/aaa.txt"));
        long l2 = FileUtils.sizeOf(new File("d:/test/bbb/bbb.txt"));
        System.out.println("文件大小:" + l1); // 文件大小:5518
        System.out.println("目录大小:" + l2); // 目录大小:11038
    }
}
  • 结果

    在这里插入图片描述

2、操作目录的

(1)清空目录,但不删除目录

cleanDirectory:清空目录,但不删除目录

准备工作:

  1. 先在D盘下创建test目录,然后在里面新建一个目录,两个文件, 用来测试

    在这里插入图片描述

开始使用

package com.tcc.test;

import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;

import java.io.*;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        /**
         * 清空目录,但不删除目录
         */
        FileUtils.cleanDirectory(new File("d:/test"));
    }
}
  • 结果

    在这里插入图片描述

(2)拷贝目录(可过滤)

copyDirectory:将一个目录内容拷贝到另一个目录,只拷贝内容,可以通过FileFliter过滤需要拷贝的文件

准备步骤

  1. 在test文件夹里创建一个abc目录,再创建一个aaa.txt文件,一个bbb.html文件

    在这里插入图片描述

开始使用

只把不为html结尾的文件拷贝过去

package com.tcc.test;

import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;

import java.io.*;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        /**
         * 清空目录,但不删除目录
         */
        FileUtils.copyDirectory(new File("d:/test"), new File("c:/"), new FileFilter() {
            /**
             * 每个操作的文件都会走这个accept方法
             * 只有返回true,才能走完代码,为false则拦截
             * @param pathname
             * @return
             */
            @Override
            public boolean accept(File pathname) {
                if(!pathname.toString().endsWith("html")){
                    return true;
                }
                return false;
            }
        });
    }
}
  • 结果

    在这里插入图片描述

(3)删除目录

deleteDirectory:删除目录

准备

  1. 在test文件夹里创建aaa目录

    在这里插入图片描述

开始

将刚创建的aaa目录删除

package com.tcc.test;

import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;

import java.io.*;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        FileUtils.deleteDirectory(new File("d:/test/aaa"));
    }
}
  • 结果

    在这里插入图片描述

3、操作文件的

(1)比较两个文件的内容是否相同

contentEquals:比较两个文件的内容是否相同

准备工作

  1. 在D盘下test目录里创建两个内容一样的文件,里面写入相同的内容

  2. 在test目录里创建两个内容不一样的文件,里面写入不相同的内容

    在这里插入图片描述

开始使用

package com.tcc.test;

import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;

import java.io.*;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        /**
         * 清空目录,但不删除目录
         */
        boolean f1 = FileUtils.contentEquals(new File("d:/test/a1.txt"), new File("d:/test/a2.txt"));
        boolean f2 = FileUtils.contentEquals(new File("d:/test/b1.txt"), new File("d:/test/b2.txt"));
        System.out.println(f1); // true;
        System.out.println(f2); // false;
    }
}
  • 结果

    在这里插入图片描述

(2)将文件拷贝到新地址

copyFile:将一个文件内容拷贝到一个新的地址

准备

  1. 在D盘下test目录里创建aaa.txt文件

    在这里插入图片描述

开始

将指定的文件复制到D盘test目录里不存在的文件bbb.txt(会自动创建)

package com.tcc.test;

import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;

import java.io.*;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        FileUtils.copyFile(new File("d:/test/aaa.txt"),new File("d:/test/bbb.txt"));
    }
}
  • 结果(创建了文件bbb.txt并把内容粘贴了进去)

    在这里插入图片描述

(2)将文件拷贝到新地址

(3)将一个输入流的内容拷贝到某个文件

copyInputStreamToFile:将一个输入流的内容拷贝到某个文件(目录不存在就会创建)

准备

  1. test目录里创建aaa.txt文件

    在这里插入图片描述

开始

使用输入流读取文件,然后拷贝到不存在的目录aaa里

package com.tcc.test;

import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;

import java.io.*;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        FileUtils.copyInputStreamToFile(new FileInputStream("d:/test/aaa.txt"),new File("d:/test/aaa/bbb.txt"));
    }
}
  • 结果

    在这里插入图片描述

(4)删除文件

deleteQuietly:删除文件

准备

  1. 在test目录里创建文件aaa.txt

    在这里插入图片描述

开始

将创建的文件删除

package com.tcc.test;

import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;

import java.io.*;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        FileUtils.deleteQuietly(new File("d:/test/aaa.txt"));
    }
}
  • 结果

    在这里插入图片描述

(5)打开文件的输入流

openInputStream:打开指定文件的输入流

准备

  1. 在test目录下创建aaa.txt文件

    在这里插入图片描述

使用

打开aaa文件的输入流

package com.tcc.test;

import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.IOFileFilter;

import java.io.*;
import java.util.Collection;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = FileUtils.openInputStream(new File("d:/test/aaa.txt"));
    }
}

(6)将文件内容作为字符串返回

readFileToString:将文件内容作为字符串返回(自带换行)

准备

  1. 在test目录里创建aaa.txt文件,然后在里面编写一些测试内容

    在这里插入图片描述

使用

读取aaa.txt文件内容

package com.tcc.test;

import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.IOFileFilter;

import java.io.*;
import java.util.Collection;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        String s = FileUtils.readFileToString(new File("d:/test/aaa.txt"), "utf-8");
        System.out.println(s);
    }
}
  • 结果

    在这里插入图片描述

(7)将文件内容按行返回到字符串数组中

readLines:将文件内容按行返回到字符串数组中

准备

  1. 在test目录下创建aaa.txt文件,然后在里面编写点测试内容

    在这里插入图片描述

开始

按行读取aaa.txt文件里面的内容

package com.tcc.test;

import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.IOFileFilter;

import java.io.*;
import java.util.Collection;
import java.util.List;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        List<String> s = FileUtils.readLines(new File("d:/test/aaa.txt"),"utf-8");
        for (String s1 : s) {
            System.out.println(s1);
        }
    }
}
  • 结果

    在这里插入图片描述

(8)将字符串内容写到文件中

writeStringToFile:将字符串内容直接写到文件中(文件没有自动创建)

开始

将我是张三aaa换行输出到不存在的aaa.txt文件中

package com.tcc.test;

import com.tcc.entity.User;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.IOFileFilter;

import java.io.*;
import java.util.Collection;
import java.util.List;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        // \t\n实现换行
        FileUtils.writeStringToFile(new File("d:/test/aaa.txt"),"我是张三\t\naaa","utf-8");
    }
}
  • 结果

    在这里插入图片描述

四、IO流常用API使用

1、操作两种流(IO)的

(1)、转为缓冲流

buffer():将传入的流转为缓冲流,并且可以通过参数指定缓冲大小

在这里插入图片描述

使用

package com.tcc.test;


import org.apache.commons.io.IOUtils;

import java.io.*;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        String url = "d:/test/aaa.txt";
        // 转为字节输入流包装流
        BufferedInputStream bis1 = IOUtils.buffer(new FileInputStream(url));
        BufferedInputStream bis2 = IOUtils.buffer(new FileInputStream(url),1024); // 指定缓冲大小

        // 转为字节输出流包装流
        BufferedOutputStream bos1 = IOUtils.buffer(new FileOutputStream(url));
        BufferedOutputStream bos2 = IOUtils.buffer(new FileOutputStream(url),1024); // 指定缓冲大小

        // 转为字符输入流包装流
        BufferedReader br1 = IOUtils.buffer(new FileReader(url));
        BufferedReader br2 = IOUtils.buffer(new FileReader(url),1024); // 指定缓冲大小

        // 转为字符输出流包装流
        BufferedWriter bw1 = IOUtils.buffer(new FileWriter(url));
        BufferedWriter bw2 = IOUtils.buffer(new FileWriter(url),1024);

    }
}

(2)、关闭流

closeQuietly():关闭打开的流

使用

package com.tcc.test;


import org.apache.commons.io.IOUtils;

import java.io.*;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        String url = "d:/test/aaa.txt";
        FileInputStream fis = new FileInputStream(url);

        // 关闭流
        IOUtils.closeQuietly(fis);
    }
}

(3)、比较流中内容

contentEquals():比较流中内容是否相等,相等返回true,反之为false

准备

在这里插入图片描述

使用

比较两个文本中的内容是否相等

package com.tcc.test;


import org.apache.commons.io.IOUtils;

import java.io.*;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        String url1 = "d:/test/aaa.txt";
        String url2 = "d:/test/bbb.txt";

        // 比较字节流
        FileInputStream fis1 = new FileInputStream(url1);
        FileInputStream fis2 = new FileInputStream(url2);

        boolean b = IOUtils.contentEquals(fis1, fis2);
        System.out.println(b); // true;

        // 比较字符流
        FileReader fr1 = new FileReader(url1);
        FileReader fr2 = new FileReader(url2);
        boolean b2 = IOUtils.contentEquals(fis1, fis2);
        System.out.println(b2); // true;
    }
}

(4)拷贝

copy():将输入流中内容拷贝到输出流中,并可以指定字符编码

准备

在这里插入图片描述

开始

aaa.txt,拷贝到当前目录,名字为bbb.txt

最好使用字节流当做参数,其他流使用有坑,字符流的粘贴不过来内容

package com.tcc.test;


import org.apache.commons.io.IOUtils;

import java.io.*;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        String url1 = "d:/test/aaa.txt";
        String url2 = "d:/test/bbb.txt";

        // 字节流输出到字节流,返回值为文本大小
        int fileSize = IOUtils.copy(new FileInputStream(url1), new FileOutputStream(url2));
        System.out.println(fileSize); // 17
    }
}

在这里插入图片描述

(5)拷贝(大于2G)

copyLarge():拷贝内容,适合大于2G的内容,使用了缓冲流

准备

  1. 准备一个比较大的文本或者图片

    在这里插入图片描述

开始

将上面文件拷贝一份,查看运行速度

package com.tcc.test;


import org.apache.commons.io.IOUtils;

import java.io.*;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        String url1 = "d:/test/testPic.png";
        String url2 = "d:/test/testPic2.png";

        // 拷贝字节流内容,返回文件大小	执行很快
        long l = IOUtils.copyLarge(new FileInputStream(url1), new FileOutputStream(url2));
        System.out.println(l); // 20673353
    }
}

在这里插入图片描述

2、操作输入流的

(1)、返回迭代器

lineIterator():返回可以迭代每一行的迭代器

准备

在这里插入图片描述

开始

package com.tcc.test;


import org.apache.commons.io.IOUtils;
import org.apache.commons.io.LineIterator;

import java.io.*;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        String url1 = "d:/test/aaa.txt";

        LineIterator lineIterator = IOUtils.lineIterator(new FileInputStream(url1), "utf-8");
//        System.out.println(lineIterator.next()); // 我是张三

        /**
         * 我是张三
         * aaa
         */
        while (lineIterator.hasNext()){
            System.out.println(lineIterator.next());
        }

    }
}

(2)、将输入流中的内容转为字符串

toString():将输入流中的内容转为字符串

准备

在这里插入图片描述

开始

读取文本里面内容

package com.tcc.test;


import org.apache.commons.io.IOUtils;
import org.apache.commons.io.LineIterator;

import java.io.*;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        String url1 = "d:/test/aaa.txt";

        String s = IOUtils.toString(new FileInputStream(url1), "utf-8");
        System.out.println(s); // 我是张三	aaa
        
    }
}

在这里插入图片描述

(3)内容转为字节/字符数组

toByteArray():转为字节数组 toCharArray:转为字符数组

开始

package com.tcc.test;


import org.apache.commons.io.IOUtils;
import org.apache.commons.io.LineIterator;

import java.io.*;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        String url1 = "d:/test/aaa.txt";

        /**
         * -26
         * -120
         * -111
         * -26
         * -104
         * -81
         * -26
         * -99
         * -114
         * -27
         * -101
         * -101
         */
        byte[] bytes = IOUtils.toByteArray(new FileInputStream(url1));
        for (byte aByte : bytes) {
            System.out.println(aByte);
        }

        /**
         * 我
         * 是
         * 李
         * 四
         */
        char[] chars = IOUtils.toCharArray(new FileInputStream(url1),"utf-8");
        for (char aChar : chars) {
            System.out.println(aChar);
        }
    }
}

结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-46stNOFP-1665813842283)(img/1665813756045.png)]

3、操作输出流的

(1)、向流中写入内容

write():向流中写入内容,但会替换原来的内容

准备

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U5Gbe857-1665813842283)(img/1665797968219.png)]

开始

package com.tcc.test;


import org.apache.commons.io.IOUtils;
import org.apache.commons.io.LineIterator;

import java.io.*;

/**
 * @author 宇辰
 * @date 2022/8/31-8:53
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        String url1 = "d:/test/aaa.txt";

        IOUtils.write("我是李四",new FileOutputStream(url1),"utf-8");
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mcds30Zr-1665813842284)(img/1665798923237.png)]

相关文章:

  • 深圳商城网站建设/免费刷赞网站推广免费
  • 赤水网站建设/潍坊百度seo公司
  • 网页网站建设软件有哪些/安徽seo网络优化师
  • 商城建设网站/google安卓版下载
  • 查看虚拟币行情的网站怎么做/百度收录方法
  • 大型网站制作需要多少钱/宁波企业seo推广
  • JavaScript-自制网页内弹窗[可移动][DOM][纯HTML]
  • 关于 Angular HttpClient 的单例特性的思考
  • 【TS系列】TypeScript进阶(三)
  • 【鸟哥杂谈】三分钟完成腾讯云部署emqx,公网访问自己的mqtt服务器
  • Java泛型01:什么是泛型?
  • 【Python】for/else、列表的创建、查询、删除、修改、排序、列表生成式
  • 基于技能优化算法的函数寻优算法
  • MySql(25)索引及索引优缺点
  • 【C++】哈希应用
  • 【3D建模制作技巧分享】Maya制作骑自行车的女孩模型
  • 《一个月冲刺祥云杯》(2)需要的html典例以及PHP基础
  • Spring学习阶段性总结