一、导入依赖

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*/@Overridepublic boolean accept(File file) {return true;}@Overridepublic boolean accept(File file, String s) {return true;}}, new IOFileFilter() {/*** 子目录过滤器,可以过滤子目录* @param file* @return*/@Overridepublic boolean accept(File file) {return true;}@Overridepublic 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*/@Overridepublic boolean accept(File file) {// 如果文件名称是以html结尾的,则拦截if(file.getName().endsWith("html")){return false;}return true;}@Overridepublic boolean accept(File file, String s) {return false;}}, new IOFileFilter() {/*** 子目录过滤器,可以过滤子目录* @param file* @return*/@Overridepublic boolean accept(File file) {return true;}@Overridepublic 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*/@Overridepublic boolean accept(File file) {return true;}@Overridepublic boolean accept(File file, String s) {return false;}}, new IOFileFilter() {/*** 子目录过滤器,可以过滤子目录* @param file* @return*/@Overridepublic boolean accept(File file) {/*** 如果文件名是aaa,那么就拦截不遍历其下所有文件*/if("aaa".equals(file.getName())){return false;}return true;}@Overridepublic 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); // 文件大小:5518System.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*/@Overridepublic 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)]

Apache-Commons-FileIOUtils工具类常用方法使用相关推荐

  1. org.apache.commons.commons-lang3工具类(一)

    https://blog.csdn.net/qq_31289187/article/details/85343068 本文只是简单的介绍了commons-lang3中的SystemUtils.Stri ...

  2. apache commons常用工具类

    1.有些情况下,Arrays满足不到你对数组的操作?不要紧,ArrayUtils帮你 ArrayUtils public class TestMain {  public static void ma ...

  3. 常用工具类 (一) : Apache Commons 常用工具类整理 (全)

    文章目录 一.commons-lang3 引入依赖 StringUtils 字符串工具类 StringEscapeUtils 转义字符串工具类 NumberUtils 数字工具类 ArrayUtils ...

  4. Apache Commons StringUtils工具类深入整理

    字符串是在程序开发中最常见的,Apache Commons开源项目在org.apache.commons.lang3包下提供了StringUtils工具类,该类相当于是对jdk自带的String类的增 ...

  5. Java中字符串工具类继承org.apache.commons.lang3.StringUtils类代码

    场景 转换为字节数组:是否包含字符串:替换掉HTML标签方法:替换为手机识别的HTML,去掉样式及属性,保留回车: 缩略字符串(不区分中英文字符):转换为Double类型:转换为Float类型:转换为 ...

  6. 转载:Apache commons开源工具简介

    Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问http://jakarta.apache.org/commons/index.html Be ...

  7. 转帖:Apache Commons实用工具

    转载网络上的内容,觉得挺有用就贴过来 一.Commons BeanUtils http://jakarta.apache.org/commons/beanutils/index.html 说明:针对B ...

  8. StringUtils 工具类常用方法汇总 1(判空、转换、移除、替换、反转)

    Apache commons lang3 包下的 StringUtils 工具类中封装了一些字符串操作的方法,非常实用,使用起来也非常方便.最近自己也经常在项目中使用到了里面的一些方法,在这里将常用的 ...

  9. hbw-utils - guava基本数据类型工具类常用方法的整理

    世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程. 正如标题第一个字段所写,我正在致力于开发一款全新的工具类.工具类应该是程序中最最基础.最最稳定的类,所以要开发有 ...

  10. Java实用类,包装类,日历类,日期类等工具类常用方法

    文章目录 第二章-实用类 1.枚举类型 2.包装类 3.包装类的常用方法 4.包装类的自动装箱和拆箱 5.String类 6.StringBuffer对象 String,StringBuffer,St ...

最新文章

  1. 国庆七天乐——第一天
  2. 安装centos系统时,修改默认网卡名
  3. ASP.NET - 演练:创建网页以显示 XML 数据
  4. java集合租车_Java入门第二季 租车系统
  5. 【大学课程】线性代数基础知识点
  6. java足球经理2010下载_apk是什么文件?apk文件怎么打开?
  7. 如何成为“10倍效率”开发者
  8. Linux Oracle服务启动停止脚本与开机自启动
  9. Android深度探索(卷1)HAL与驱动开发学习笔记(8)
  10. CAD文件查看器Acme CAD Converter V 8.10.2.1536【轻松查看CAD】
  11. 微信好友检测助手App
  12. 微信公众平台卡劵功能接入指南
  13. 优秀的管理者如何带好团队(这几个技巧你是否学会)
  14. Photoshop 2023 支持 M1 Mac下载
  15. [Beta]第四次 Scrum Meeting
  16. 二、使用Stream流的方式完成过滤操作
  17. 1w存银行一年多少利息_100万存银行1年能有多少钱利息?
  18. 关于js 中 try catch用法
  19. 邮件发送技巧:TO, CC, BCC(收件人、抄送、密送)
  20. 041_CSS及案例-网站主页模板

热门文章

  1. python编写时钟代码_python编写时钟代码
  2. 冰河木马实验(V8.4)
  3. miscrosoft visio 2003记
  4. 2007-2018年软考高级之系统分析师真题及答案解析
  5. 正则表达式 - 中文、英文姓名匹配
  6. idea2019.3.3不能热部署_复盘曼联2-1热刺:3大战术力助索肖自救,1人成“红魔”复苏关键...
  7. word 2013 长篇文档排版案例教程
  8. 计算机毕业设计android的手机商城app(源码+系统+mysql数据库+Lw文档)
  9. 常用计算机操作技巧与方法ppt,相见恨晚的20个常用PPT小技巧
  10. 抢红包插件实现原理浅析