java closeutils_作为一个Java程序员,这 8 个开源类库你必须知道

原标题:作为一个Java程序员,这 8 个开源类库你必须知道

昨天在青铜时代群里看到读者朋友们在讨论 Java 最常用的工具类,我觉得大家推荐的确实都挺常见的,我自己用的频率也蛮高的。恰好我在 programcreek 上看到过一篇类似的文章,就想着梳理一下分享给大家。

在 Java 中,工具类通常用来定义一组执行通用操作的方法。本篇文章将会向大家展示 8 个工具类以及它们最常用的方法,类的排名和方法的排名均来自可靠的数据,从 GitHub 上最受欢迎的 50000 个开源 Java 项目中精心挑选。

为了方便大家的理解,我会在介绍每个类的方法时写一段小 Demo,这样大家就能知道每个方法该怎么用。放心吧,方法是干嘛的我也不会保密的。

1)IOUtils

org.apache.commons.io.IOUtils,操作 IO 流的工具类,下面是其常用的方法。

closeQuietly,关闭 IO 流,并且忽略 null 值和异常。

IOUtils.closeQuietly(output);

1

copy,将字节从输入流复制到输出流。

IOUtils.copy(inputStream, new FileOutputStream(File));

1

toByteArray,以 byte[] 的形式获取输入流中的内容。

URLConnection conn = new URL(url).openConnection;

InputStream is = conn.getInputStream;

byte[] result = IOUtils.toByteArray(is);

1

2

3

write,将字符或者字节写入输出流中。

IOUtils.write("沉默王二", response.getOutputStream, "UTF-8");

1

toInputStream,将指定的字符转成输入流。

String content=req.getParameter("content");

InputStream inputStream=IOUtils.toInputStream(content,"utf-8");

1

2

readLines,从输入流中一行一行地读取,并按照指定的字符编码返回字符串列表。

List lines = IOUtils.readLines(new InputStreamReader(new FileInputStream(file), "utf-8"));

1

copyLarge,从输入流中复制内容到输出流,超过 2GB。

private File downloadFile(HttpResponse response) {

File dir = new File("downloadedFiles");

if (!dir.exists) {

dir.mkdir;

}

File outputFile = new File("downloadedFiles/temp" + RandomStringUtils.randomAlphanumeric(3));

try {

IOUtils.copyLarge(response.getEntity.getContent, new FileOutputStream(outputFile));

return outputFile;

} catch (Exception e) {

throw new RuntimeException(e);

} finally {

request.releaseConnection;

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

readFully,把输入流中的内容读入到字节数组中。

byte[] intArray = new byte[Bytes.SIZEOF_INT];

IOUtils.readFully(in, intArray);

1

2

2)FileUtils

org.apache.commons.io.FileUtils,操作文件或者目录的工具类,下面是其常用的方法。

deleteDirectory,删除目录。

FileUtils.deleteDirectory(file);

1

readFileToString,把文件的内容读入到字符串中。

String fileAsString = FileUtils.readFileToString(reportFile);

1

deleteQuietly,删除文件,但不抛出异常。

FileUtils.deleteQuietly(outputFile);

1

copyFile,把文件复制到一个新的位置。

FileUtils.copyFile(source, dest);

1

writeStringToFile,把字符串写入到文件。

FileUtils.writeStringToFile(templateFile, generatedText, Charset.forName("UTF-8"));

1

forceMkdir,强制创建目录,包括任何必需但不存在的父目录。

File uploadDirectory = new File(this.uploadPath);

if (!uploadDirectory.exists) {

FileUtils.forceMkdir(uploadDirectory);

}

1

2

3

4

write,把字符或者字节写入到文件。

FileUtils.write(new File("C:\\Users\\cmower\\test.txt"), "沉默王二", "utf-8");

1

listFiles,列出指定目录下的所有文件。

public void processResultsDirectory(String dirName) {

File root = new File(dirName);

try {

Collection files = FileUtils.listFiles(root,

new RegexFileFilter(jmeterJTLFileName),

DirectoryFileFilter.DIRECTORY);

for (Iterator iterator = files.iterator; iterator.hasNext;) {

File file = (File) iterator.next;

parse(file);

}

} catch (Exception e) {

e.printStackTrace;

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

copyDirectory,将目录下的所有子目录及文件复制到新的目录。

FileUtils.copyDirectory(source, dest);

1

forceDelete,强制删除文件或者目录及其所有子目录和文件。

FileUtils.forceDelete(tmpFile);

1

3)StringUtils

org.apache.commons.lang3.StringUtils,操作字符串的工具类,并且是 null 安全的,下面是其常用的方法。

isBlank,检查字符是否为空字符串"",或者 null,或者空格。

if (StringUtils.isBlank(name))

{

throw new IllegalArgumentException("姓名不能为空");

}

1

2

3

4

检查结果如下所示。

StringUtils.isBlank(null) = true

StringUtils.isBlank("") = true

StringUtils.isBlank(" ") = true

StringUtils.isBlank("沉默王二") = false

StringUtils.isBlank(" 沉默王二 ") = false

1

2

3

4

5

isNotBlank,与 isBlank 检查的结果相反。

isEmpty,检查字符是否为空字符串"",或者 null;和 isBlank 不同,不包括空格的检查。

if (StringUtils.isEmpty(name)) {

throw new IllegalArgumentException("姓名不能为 null 或者空字符串");

}

1

2

3

检查结果如下所示。

StringUtils.isEmpty(null) = true

StringUtils.isEmpty("") = true

StringUtils.isEmpty(" ") = false

StringUtils.isEmpty("沉默王二") = false

StringUtils.isEmpty(" 沉默王二 ") = false

1

2

3

4

5

isNotEmpty,与 isEmpty 检查的结果相反。

join,将多个元素连接成一个字符串。

StringUtils.join(null) = null

StringUtils.join([]) = ""

StringUtils.join([null]) = ""

StringUtils.join(["沉默", "王二"]) = "沉默王二"

StringUtils.join([null, "", "一枚有趣的程序员"]) = "一枚有趣的程序员"

1

2

3

4

5

equals,比较两个字符序列是否相等。

StringUtils.equals(null, null) = true

StringUtils.equals(null, "沉默王二") = false

StringUtils.equals("沉默王二", null) = false

StringUtils.equals("沉默王二", "沉默王二") = true

StringUtils.equals("cmower", "CMOWER") = false

1

2

3

4

5

split,把字符串拆分为数组,拆分符为空白字符。

StringUtils.split(null) = null

StringUtils.split("") = []

StringUtils.split("沉默王二 沉默王三") = ["沉默王二", "沉默王三"]

StringUtils.split("沉默王二 沉默王三") = ["沉默王二", "沉默王三"]

StringUtils.split(" 沉默王二 ") = ["沉默王二"]

1

2

3

4

5

replace,替换另一个字符串中所有出现的字符串。

StringUtils.replace(null, *, *) = null

StringUtils.replace("", *, *) = ""

StringUtils.replace("any", null, *) = "any"

StringUtils.replace("any", *, null) = "any"

StringUtils.replace("any", "", *) = "any"

StringUtils.replace("沉默王二", "二", null) = "沉默王二"

StringUtils.replace("沉默王二", "二", "") = "沉默王"

StringUtils.replace("沉默王二", "二", "三") = "沉默王三"

1

2

3

4

5

6

7

8

4)FilenameUtils

org.apache.commons.io.FilenameUtils,操作文件名或者路径的工具类,下面是其常用的方法。

getExtension,获取文件的扩展名。

FilenameUtils.getExtension("牛逼.txt"); --> "txt"

FilenameUtils.getExtension("a/b/牛逼.jpg"); --> "jpg"

FilenameUtils.getExtension("a/牛逼.txt/c"); --> ""

FilenameUtils.getExtension("a/b/c"); --> ""

1

2

3

4

getBaseName,获取单纯的文件名或者路径名,文件时去掉路径和扩展名;路径时去掉父级路径。

FilenameUtils.getBaseName("a/b/牛逼.txt"); --> "牛逼"

FilenameUtils.getBaseName("牛逼.txt"); --> "牛逼"

FilenameUtils.getBaseName("a/b/c"); --> c

FilenameUtils.getBaseName("a/b/c/"); --> ""

1

2

3

4

getName,如果是文件时,获取文件名和后缀,去掉路径;如果是路径时,去掉父级路径。

FilenameUtils.getName("a/b/牛逼.txt"); --> "牛逼.txt"

FilenameUtils.getName("牛逼.txt"); --> "牛逼.txt"

FilenameUtils.getName("a/b/c"); --> c

FilenameUtils.getName("a/b/c/"); --> ""

1

2

3

4

concat,将路径和文件名连接在一起。

FilenameUtils.concat("/foo/", "bar"); --> /foo/bar

FilenameUtils.concat("/foo", "bar"); --> /foo/bar

FilenameUtils.concat("/foo", "/bar"); --> /bar

FilenameUtils.concat("/foo", "C:/bar"); --> C:/bar

FilenameUtils.concat("/foo", "C:bar"); --> C:bar (*)

FilenameUtils.concat("/foo/a/", "../bar"); --> foo/bar

FilenameUtils.concat("/foo/", " ../../bar"); --> null

FilenameUtils.concat("/foo/", "/bar"); --> /bar

FilenameUtils.concat("/foo/.. ", "/bar"); --> /bar

FilenameUtils.concat("/foo", " bar/c.txt"); --> /foo/bar/c.txt

FilenameUtils.concat("/foo/c.txt", "bar"); --> /foo/c.txt/bar (!)

1

2

3

4

5

6

7

8

9

10

11

wildcardMatch,检查文件名是否匹配指定的格式。

wildcardMatch("c.txt", "*.txt") --> true

wildcardMatch("c.txt", "*.jpg") --> false

wildcardMatch("a/b/c.txt", "a/b/*") --> true

wildcardMatch("c.txt", "*.???") --> true

wildcardMatch("c.txt", "*.????") --> false

1

2

3

4

5

separatorsToUnix,将所有分隔符转换为正斜杠的 Unix 分隔符。

FilenameUtils.separatorsToUnix("my/unix/filename");

1

getFullPath,获取文件的完整路径。

getFullPath("C:\a\b\c.txt" --> C:\a\b\

getFullPath("~/a/b/c.txt" --> ~/a/b/

getFullPath("a.txt" --> ""

1

2

3

5)ArrayUtils

org.apache.commons.lang3.ArrayUtils,操作数组的工具类,下面是其常用的方法。

contains,检查数组中是否包含某个值

public static boolean containsAll(Object[] one, Object[] two) {

for (Object b : two) {

if (!ArrayUtils.contains(one, b)) {

return false;

}

}

return true;

}

1

2

3

4

5

6

7

8

addAll,将所有元素添加到一个数组中。

ArrayUtils.addAll(null, null) = null

ArrayUtils.addAll(array1, null) = cloned copy of array1

ArrayUtils.addAll(null, array2) = cloned copy of array2

ArrayUtils.addAll([], []) = []

ArrayUtils.addAll([null], [null]) = [null, null]

ArrayUtils.addAll(["a", "b", "c"], ["1", "2", "3"]) = ["a", "b", "c", "1", "2", "3"]

1

2

3

4

5

6

clone,浅拷贝一个数组。

public QualityGateTask[] getQueue {

return (QualityGateTask[]) ArrayUtils.clone(queue);

}

1

2

3

isEmpty,检查数组是否为 null 或者没有元素。

if (ArrayUtils.isEmpty(objectIds)) {

throw new IllegalArgumentException("对象的ID不能为空");

}

1

2

3

add,在数组中添加一个新的元素,原数组不变。

ArrayUtils.add(null, true) = [true]

ArrayUtils.add([true], false) = [true, false]

ArrayUtils.add([true, false], true) = [true, false, true]

1

2

3

subarray,根据起始下标和结束下标截取一个子数组。

public byte[] fetchData(String blobKey, long startIndex, long l) {

CountingInputStream inputStream = new CountingInputStream(getInputStream(blobKey));

byte[] bytes = new byte[(int) l];

try {

int readSize = inputStream.read(bytes, (int) startIndex, (int) l);

if (readSize < l) {

bytes = ArrayUtils.subarray(bytes, 0, readSize - 1);

}

} catch (IOException e) {

LOGGER.warn("Failed to read bytes", e);

} finally {

try {

inputStream.close;

} catch (IOException ignored) {

LOGGER.warn("Exception while closing inputStream", ignored);

}

}

return bytes;

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

indexOf,找出指定数组的下标。

ArrayUtils.indexOf(idxVal, i);

1

6)DigestUtils

org.apache.commons.codec.digest.DigestUtils,加密的工具类,下面是其常用的方法。

md5Hex,计算字符串的 MD5 摘要,并返回 32 位的十六进制字符。

DigestUtils.md5Hex("沉默王二");

1

md5,计算字符串的 MD5 摘要,并返回 16 个元素的字节数组。

DigestUtils.md5("沉默王二");

1

7)StringEscapeUtils

org.apache.commons.text.StringEscapeUtils,字符串的转义和反转义工具类,下面是其常用的方法。

unescapeHtml4,反转义 HTML。

StringEscapeUtils.unescapeHtml4("

1

escapeHtml4,转义 HTML。

StringEscapeUtils.escapeHtml4("

1

escapeJava,转义 Java。

StringEscapeUtils.escapeJava("沉默王二");--> \u6C89\u9ED8\u738B\u4E8C

1

unescapeJava

StringEscapeUtils.escapeJava("\u6C89\u9ED8\u738B\u4E8C");--> 沉默王二

1

8)BeanUtils

大多数 Java 开发人员习惯于创建 getter/setter 的JavaBean,然后通过调用相应的 getXxx 和 setXxx 方法访问对应字段。但在某些情况下,需要动态访问 Java 对象的属性,org.apache.commons.beanutils.BeanUtils 就派上用场了。

copyProperties,拷贝所有属性。

private static void dto2Entity {

UserDTO user = new UserDTO;

user.setId(1l);

user.setUsername("joking");

user.setCreationDate("2016-04-20");

EUser u = new EUser;

ConvertUtils.register(new DateStringConverter, Date.class);

try {

BeanUtils.copyProperties(u, user);

} catch (IllegalAccessException | InvocationTargetException e) {

e.printStackTrace;

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

其中 UserDTO 类的源码如下所示。

public class UserDTO implements Serializable {

private long id;

private String username;

private String creationDate;

// getter/setter

@Override

public String toString {

return "UserDTO [id=" + id + ", username=" + username + ", creationDate=" + creationDate + "]";

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

其中 EUser 类的源码如下所示。

public class EUser implements Serializable {

private long id;

private String username;

private Date creationDate;

//getter/setter

@Override

public String toString {

return "EUser [id=" + id + ", username=" + username + ", creationDate=" + creationDate + "]";

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

其中 DateStringConverter 类的源码如下所示。

public class DateStringConverter implements Converter {

@SuppressWarnings("unchecked")

@Override

public T convert(Class type, Object value) {

if(type.equals(Date.class) && String.class.isInstance(value)) {

return (T)DateUtils.convert((String)value);

} else if(type.equals(String.class) && Date.class.isInstance(value)){

return (T)DateUtils.format((Date)value);

} else {

return (T)value;

}

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

getProperty,返回 bean 指定的属性值。

String fieldValue = BeanUtils.getProperty(value, fieldName);

1

setProperty,设置 bean 指定的属性值。

BeanUtils.setProperty(object, propertyName, value);

1

说实在的,没想到整理起来这么费事,不知不觉 5 个小时过去了。每个类都有很多方法,还要为每个方法敲一个 Demo,真的是很辛苦。但为了你们,再苦再累二哥也心甘情愿啊。

觉得有点用记得给我点赞哦!

简单介绍一下。10 年前,当我上大学的时候,专业被调剂到了计算机网络,主要学的是 Java 编程语言,但当时没怎么好好学,每年都要挂科两三门;因此工作后吃了不少亏。但是最近几年,情况发生了很大改变,你应该也能看得到我这种变化。通过坚持不懈地学习,持续不断地输出,我的编程基本功算得上是突飞猛进。

为了帮助更多的程序员,我创建了“沉默王二”这个 ID,专注于分享有趣的 Java 技术编程和有益的程序人生。一开始,阅读量寥寥无几,关注人数更是少得可怜。但随着影响力的逐步扩大,阅读量和关注人都在猛烈攀升。

绝对不容错过,期待与你的不期而遇。

19f62d4fa10be3fba5418600d99b08f9.png

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值