常用工具类

1 commons-lang3

  1. 依赖

    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.9</version>
    </dependency>
    
  2. 结构图

  3. 介绍

    介绍
    org.apache.commons.lang3 提供高度可重用的静态实用程序方法,主要用于为java.lang类增加值
    org.apache.commons.lang3.arch 提供类以使用os.arch系统属性的值。
    org.apache.commons.lang3.builder 帮助创建一致的equals(Object)、toString()、hashCode() 和compareTo(Object)方法
    org.apache.commons.lang3.concurrent 为多线程编程提供支持类
    org.apache.commons.lang3.event 提供一些有用的基于事件的实用程序
    org.apache.commons.lang3.exception 提供异常功能
    org.apache.commons.lang3.math 为商业数学类扩展java.math
    org.apache.commons.lang3.mutable 为基元值和对象提供类型化的可变包装器
    org.apache.commons.lang3.reflect 提供反射java.lang.reflect API的常见高级用法
    org.apache.commons.lang3.text 提供用于处理和操作文本的类,部分用作java.text的扩展
    org.apache.commons.lang3.time 提供处理日期和持续时间的类和方法
    org.apache.commons.lang3.tuple 元组类,从版本3.0中的对类开始

1.1 StringUtils

  1. 在 IDEA 中, Ctrl + 鼠标左键 点击 StringUtils 后进入该类内部,接着按 Ctrl + F12 可以查看该类中的所有方法。(注意每个方法有多个重载函数,使用时则需选择)

  2. equals() 和 equalsIgnoreCase()contains() 和 containsIgnoreCase() 等,注意比较 / 包含等方法有忽略大小写选项。

  3. 查找方法可以选择 从后向前 / 从前向后 方法,且还有忽略大小写选项。

    序号 方法 说明
    1 isEmpty() 判断字符串是否为空 ( null 和 "" 返回true )
    2 isBlank()
    isNotBlank()
    判断字符串是否为空和空字符 ( null 、 "" 和 " "返回 true )
    判断字符串是否不为null且不为空字符
    3 trim() 去头尾空格
    4 substring() 截取子串
    5 split() 分割
    6 replaceOnce()
    replace()
    替换一次
    全部替换
    7 swapCase() 大小写转换
    8 reverse() 字符串顺序反转
    9 concat()
    concatWith()
    将数组转换成字符串
    用参数1(即分隔符一类)将数组数据拼接成字符串
    10 leftPad()
    rightPad()
    左填充
    右填充
    11 equals() 判断两个字符串内容是否相等
    12 contains() 检查 str1 中是否包含 str2
    13 indexOf()
    lastIndexOfIgnoreCase()
    查找 str1 中 str2 出现的位置
    从后向前查找且不区分大小写
    14 countMatches() 查找 str1 中 str2 出现的次数
    15 isAlpha() 字符串是否全部为字母
    16 isNumeric() 字符串是否全部为数字
    17 isAlphanumeric() 字符串是否全部为字母或数字
    18 difference() 比较两个字符串的差异
    19 startsWith() str1 是否以 str2 开始
    20 startsWithIgnoreCase() 忽略大小写后str1 是否以 str2 开始
    21 endsWith() str1 是否以 str2 结束
  • 注:java中常用 springframework ,因此 spring 框架自己封装了个 StringUtils ,所包含的方法现实的功能基本上和上面一样。因此不再赘述,用到的时候查询即可。 参考链接 org.springframework.util.StringUtils

1.2 RandomStringUtils

  • 下面方法有的含有重载,即可以指定生成随机字符的最小、最大位数 (min—max 位)
序号 方法 说明
1 randomNumeric(int count) 随机生成 count 位整数数字
2 random(int count, boolean letters, boolean numbers) 生成 count 位字符串
(letters=true含字母,numbers=true含数字)
3 random(int count, String chars) 从指定的字符串中,生成 count 位随机字符
4 randomAscii(int count) 从 ASCII 32-126之间字符中,生成 count 位字符
5 randomAlphabetic(int count) 从字母 a-z、A-Z 之间字符中,生成 count 位字符
6 randomAlphanumeric(int count) 从字母 a-z、A-Z 和数字 0-9之间,生成 count 位字符

1.3 NumberUtils

  • 下面方法有的含有重载,主要是数据类型不同,一般都包含 Byte、Short、Integer、Long、Double 等
序号 方法 说明
1 compare(byte x, byte y) 比较
2 createBigDecimal(String str) 创建
(createXXX,有 BigInteger、Double 等)
3 toInt(String str) 转换
(toXXX,有 Byte、Double 等)
4 max(byte... array) 最大值
(如 NumberUtils.max(new byte[]{1,3,2,10,5,7}) ,含重载)
5 min(byte... array) 最小值
6 isDigits(String str) 判断 str 是否全为数字t
(如 NumberUtils.isDigits("5.43") ,结果为 false)
7 isNumber(String str) 判断 str 是否为数字
(如 NumberUtils.isDigits("5.43") ,结果为 true)

1.4 ArrayUtils

  • 下面方法有的含有重载,主要是数据类型不同,基本上常见的数据类型均有重载方法。
序号 方法 说明
1 add(byte[] array, byte element) 添加
2 addAll(byte[] array1, byte... array2) 添加全部
3 insert( int index, byte[] array, byte... values) 插入
4 remove( byte[] array, int index) 移除
5 removeAll( byte[] array, int... indices) 移除全部
6 contains(byte[] array, byte valueToFind) 包含
7 indexOf( byte[] array, byte valueToFind) 索引
8 lastIndexOf( byte[] array, byte valueToFind) 最后一个索引
9 reverse( byte[] array) 逆转
10 swap( byte[] array, int offset1, int offset2) 交换
11 isSorted( byte[] array) 排序
12 isEmpty 或 isNotEmpty( byte[] array) 判空
13 isSameLength( byte[] array1, byte[] array2) 相同长度
14 clone(byte[] array) 克隆
15 nullToEmpty( byte[] array) null转为空
16 toArray( T... items) toXXX,有 Map、Object、Primitive、String 等

1.5 DateUtils

  • 若是使用时,可进入 DateUtils 类中查看更多方法
序号 方法 说明
1 add( Date date, int calendarField, int amount) 添加
2 addDays( Date date, int amount) 日期添加 amount 天
(addXXX,有Years、Months、Weeks、Hours、Seconds、Milliseconds等)
3 ceiling( Calendar date, int field) 获取日期上限
4 isSameDay( Date date1, Date date2) 判断是否是同一天
5 parseDate( String str, String... parsePatterns) 将 str 解析成日期

2 commons-io

  • 依赖

    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.10.0</version>
    </dependency>
    

2.1 FileUtils

  1. 常用方法

    序号 方法 说明
    1 write() 字符序列写入到文件
    2 writeByteArrayToFile() 字节数组写入到文件
    3 writeLines() 将集合中的内容一次性写入文件
    4 writeStringToFile() 将字符串写入到文件
    5 readFileToByteArray() 将文件内容读入字节数组。文件始终处于关闭状态。
    6 readFileToString() 将文件的内容读入字符串。文件始终处于关闭状态。
    7 readLines() 逐行读取文件内容到字符串列表,文件始终处于关闭状态。
    (返回值类型为List<String>)
    8 lineIterator() 为文件打开一个 InputStream 的行迭代器,完成迭代器之后,应该关闭流以释放内部资源。
    ( class LineIterator implements Iterator<String>:可以很方便的一行一行读取文件内容 )
    9 copyDirectory() 将指定目录下所有子孙目录和文件复制到指定的目标目录下。
    如果目标目录不存在,则创建该目录。
    如果目标目录确实存在,则此方法将源目录与目标目录合并,源目录优先。
    (注意只能是目录,如果是文件则异常)
    10 copyFile() 此方法将指定源文件的内容复制到指定的目标文件,如果目标文件不存在,则会创建包含目标文件的目录,如果目标文件存在,则此方法将覆盖它。
    11 copyFileToDirectory() 将指定源文件的内容复制到指定目标目录中同名的文件中。如果目标目录不存在,则创建该目录。如果目标文件存在,则此方法将覆盖它
    12 copyToDirectory() 将源文件或目录及其所有内容复制到指定目标目录中同名的目录中。如果目标目录不存在,则创建该目录。如果目标目录确实存在,则此方法将源目录与目标目录合并,源目录优先
    13 copyToFile() 将字节输入流复制打目标文件中,如果目标目录不存在,则将创建该目录。如果目标已存在,则将覆盖该目标
    14 copyInputStreamToFile() 将字节输入流复制到目标文件中,不存在时自动创建
    15 copyURLToFile() 将 URL 网络资源复制到目标文件中,可以用于下载,未设置超时时间时,可能出现永久阻塞
    16 deleteDirectory() 递归删除目录。注意只能是目录,如果是文件,则异常
    17 deleteQuietly() 安全删除文件或者递归删除目录,不会抛出任何异常
    18 forceDelete() 强制删除文件或者递归删除目录
    19 forceMkdir() 生成一个目录,包括任何必需但不存在的父目录。如果已存在具有指定名称的文件,但它不是目录,则会引发IOException。如果目录无法创建(或不存在),则抛出IOException
    20 moveDirectory() 移动目录。当目标目录在另一个文件系统上时,执行“复制并删除”
    21 moveDirectoryToDirectory() 将目录移动到另一个目录
    22 moveFile() 移动文件。当目标文件位于另一个文件系统上时,请执行“复制并删除”
    23 moveFileToDirectory() 将文件移动到目录
    24 moveToDirectory() 将文件或目录移动到目标目录
    25 forceMkdirParent() 为给定文件生成任何必需但不存在的父目录。如果无法创建父目录,则引发IOException
    26 getFile() 获取文件对象
    27 getTempDirectory() 返回系统临时目录。底层就是 System.getProperty("java.io.tmpdir")
    28 getUserDirectory() 返回用户的主目录,底层就是 System.getProperty("user.home")
    29 isFileOlder() 测试指定文件的最后修改时间是否在指定时间之后,底层是 file.lastModified() > timeMillis
    30 isFileNewer() 测试指定文件的最后修改时间是否在指定时间之前,底层是 file.lastModified() < timeMillis
    31 sizeOf() 返回指定文件或目录的大小。如果提供的{@link File}是一个常规文件,则返回该文件的长度。如果参数是目录,则递归计算目录的大小。如果某个目录或子目录受到安全限制,则不会包括其大小。请注意,不会检测到溢出,如果发生溢出,则返回值可能为负。
    32 sizeOfDirectory() 递归计算目录的大小(所有文件的长度之和)。sizeOfDirectory 只统计目录的大小,单位为 字节,如果是文件则报错。
    33 byteCountToDisplaySize() 将文件字节大小转为可视化的 KB、MB、GB 等形式的字符串,一共有:bytes、KB、MB、GB、TB、PB、EB
    34 contentEquals() 比较两个文件的内容以确定它们是否相等。(注意只能是文件,如果是目录,则异常)。此方法检查两个文件的长度是否不同,或者它们是否指向同一个文件,然后对内容进行逐字节比较。如果文件的内容相等或两者都不存在,则为true;否则为false
    35 convertFileCollectionToFileArray() 将文件集合转为文件数组,底层就是:files.toArray(new File[files.size()]);
    36 listFiles() 查找给定目录(及其子目录)中与扩展名数组匹配的文件
    37 listFilesAndDirs() 获取某个目录下的所有文件和目录的文件名。
    37 openInputStream() 为指定文件打开 FileInputStream,提供比简单调用new FileInputStream(file更好的错误消息。在方法结束时,要么成功打开流,要么抛出异常
    38 openOutputStream() 打开指定文件的{@link FileOutputStream},检查并创建父目录(如果不存在)。在方法结束时,要么成功打开流,要么抛出异常
    39 toFile() 将 URL 转为 File 对象,注意只能对本地文件生成的 URL 才有效,对网络上的 URL 直接返回 null
    40 toURLs() 将 File 对象转为 URL 对象
  2. 常用代码

    public static void main(String[] args) {
        String path = "D:\\2_photos";
        // 1. 只显示该目录下的文件夹(含子文件夹)不显示文件
        Collection<File> dirList = FileUtils.listFilesAndDirs(new File(path), new NotFileFilter(TrueFileFilter.INSTANCE), DirectoryFileFilter.DIRECTORY);
    
        // 2. 显示该目录下的所有文件夹和文件
        Collection<File> dirAndFileList = FileUtils.listFilesAndDirs(new File(path), TrueFileFilter.INSTANCE, DirectoryFileFilter.DIRECTORY);
    
        // 3. 只显示该目录下的文件但不显示文件夹
        Collection<File> fileList = FileUtils.listFiles(new File(path), null, true);
    }
    

3 guava

  1. 依赖

    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>31.0-jre</version>
    </dependency>
    

3.1 guava-cache

  1. 样例

    /**
     * 需求:本地热点缓存(即缓存到 jvm 中),只有每秒访问成千上万次的数据,才有资格放入本地缓存
     * 
     * 实现思路
     * 搞一个类似 java hashMap 的数据结构即可,key 为 id,value  为对应的领域模型 model 。
     * 但是做这样的 hashMap 是非常有挑战性的,首先该 hashMap 要有并发读、并发写的能力,另外要考虑失效时间、且要有淘汰机制。
     * 因此使用第三方 GuavaCache
     */
    package com.imooc.miaoshaproject.service.impl;
    
    import com.google.common.cache.Cache;
    import com.google.common.cache.CacheBuilder;
    import com.imooc.miaoshaproject.service.CacheService;
    import org.springframework.stereotype.Service;
    import javax.annotation.PostConstruct;
    import java.util.concurrent.TimeUnit;
    
    @Service
    public class CacheServiceImpl implements CacheService {
    
        private Cache<String, Object> commonCache = null;
    
        @PostConstruct
        public void init() {
            commonCache = CacheBuilder.newBuilder()
                    //设置缓存容器的初始容量为10
                    .initialCapacity(10)
                    //设置缓存中最大可以存储100个KEY,超过100个之后会按照LRU的策略移除缓存项
                    .maximumSize(100)
                    //设置写缓存后多少秒过期
                    .expireAfterWrite(60, TimeUnit.SECONDS).build();
        }
    
        @Override
        public void setCommonCache(String key, Object value) {
            commonCache.put(key, value);
        }
    
        @Override
        public Object getFromCommonCache(String key) {
            return commonCache.getIfPresent(key);
        }
    }
    
    // 注:guava 包中还含有 table 数据结构(类似于数据库中的表),这玩意自己实现也有一定难度~
    

4 poi

  1. 依赖

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.9</version>
    </dependency>
    <!-- XSSFWorkbook 即工作簿的 依赖 -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.9</version>
    </dependency>
    
  2. 常用代码样例

    /**
     * 读操作(多列,单列简单略)
     * 读取数据到 List 中,多列数据,定义一个DataVO
     */
    public static List<CityData> readData(String path, String sheetName) throws IOException {
        List<CityData> data = new ArrayList<CityData>();
        XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(path));
        XSSFSheet sheet = getSheet(workbook, sheetName);
        // 城市表中第一行为表头,正式数据从第二行(下标1)开始
        // 注意:i < sheet.getPhysicalNumberOfRows(); 或者 i <= sheet.getLastRowNum()
        for (int i = 1; i <= sheet.getLastRowNum(); i++) {
            Row nowRow = sheet.getRow(i);
            // 注:nowRow.getLastCellNum();可以得到当前行最后一个单元格下标(即该行有多少列)
            // 若需要可以 for (int j = 0; j < nowRow.getLastCellNum(); j++){ } 进行二次循环
            CityData city = new CityData();
            city.setCityName(nowRow.getCell(0).getStringCellValue());
            nowRow.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
            city.setCityCode(nowRow.getCell(1).getStringCellValue());
            data.add(city);
        }
        return data;
    }
    
    /**
     * 写操作(多列,单列简单略)
     * 将 List 中的数据写到 Excel 中(多列数据)
     */
    public static void writeData(String path, String sheetName, List<CityData> data) throws IOException {
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = createSheet(workbook, sheetName);
        // 1 写表头
        List<String> tableHeader = Arrays.asList("城市", "编码", "父ID");
        XSSFRow row0 = sheet.createRow(0);
        for (int i = 0; i < tableHeader.size(); i++) {
            XSSFCell nowCell = row0.createCell(i);
            nowCell.setCellType(HSSFCell.CELL_TYPE_STRING);
            nowCell.setCellValue(tableHeader.get(i));
        }
        // 2 数据(第一行为表头,所以数据从 sheet.createRow(i + 1) 开始)
        for (int i = 0; i < data.size(); i++) {
            XSSFRow nowRow = sheet.createRow(i + 1);
            for (int j = 0; j < tableHeader.size(); j++) {
                XSSFCell nowCell = nowRow.createCell(j);
                nowCell.setCellType(HSSFCell.CELL_TYPE_STRING);
                switch (j) {
                    case 0: {
                        nowCell.setCellValue(data.get(i).getCityName());
                        break;
                    }
                    case 1: {
                        nowCell.setCellValue(data.get(i).getCityCode());
                        break;
                    }
                    case 2: {
                        nowCell.setCellValue(data.get(i).getParentId());
                        break;
                    }
                    default: {
                        break;
                    }
                }
            }
        }
        FileOutputStream fileOutputStream = new FileOutputStream(path);
        workbook.write(fileOutputStream);
        fileOutputStream.flush();
    }
    
  3. 注意事项

    1. POI导入Excel文件时,读取的数据总是少一行的问题

    2. 单元格样式补充

      1. POI中设置Excel单元格格式
      2. POI 设置Excel单元格背景色(参考颜色代码)
posted @ 2021-11-07 23:30  lkf-newlife  阅读(101)  评论(0编辑  收藏  举报