JAVA基础九:常用工具类

1 commons-lang3

  1. 依赖

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

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

  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. 查找方法可以选择 从后向前 / 从前向后 方法,且还有忽略大小写选项。

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

1.2 RandomStringUtils

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

1.3 NumberUtils

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

1.4 ArrayUtils

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

1.5 DateUtils

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

2 commons-io

  1. 依赖

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

2.1 FileUtils

  1. 常用方法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值