精华内容
参与话题
问答
  • 里面包含了所有的电脑常用的工具,都是良心软件,方便读者的日常使用
  • 知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。

    你知道的越多,你不知道的越多

    点赞再看,养成习惯

    GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式,欢迎Star和指教

    前言

    这期是被人才群交流里,还有很多之前网友评论强行顶出来的一期,就是让我介绍自己常用的一些工具给他们安利一下,我一听很高兴呀,帅丙我这么乐于奉献的人是吧。

    主要是能水一篇文章就很开心,不过写下来发现花的时间完全不比写技术少,点赞!!!

    千万不要白嫖,真香警告⚠️。

    但是我在构思这篇文章的时候发现我贴个标题,然后发下软件信息会不会太乏味了,于是创作鬼才我呀,准备用一个产品的研发流程,是的就是用这样的一个思路去写这个工具集的介绍文章。

    因为读者很多还是学生,还有很多应届生,对一个需求的研发流程都不是很熟悉,还有可能对于以后自己需要使用到的工具都不是很熟悉,那我就一一罗列一下,帅丙我作为一个还算有点小经验的程序员都使用哪些工具呢?

    那下面就跟随暖男的脚步,走进顶级程序员的百宝箱吧(我所有的标题都是噱头就为了夸大其词,我是低级程序员,大家看了也不能吊打面试官,笑笑就好了)。

    注意:下面的软件我都是简单的介绍下是干啥的,因为太多了,真正的功能需要大家深挖的,能力允许的朋友下载正版

    正文

    既然都说了帅丙是要用一个产品的研发流程角度去介绍软件,那我们先看看一个产品有哪些研发流程,帅丙就用自己接触的阿里系的研发流程举例了,这也基本上是互联网大厂的研发流程了,可能细节有出入,但是绝对大同小异。

    Tip:我从开发的视角去介绍的话我就会跳过一些软件,比如提出需求这个其实一般都是文档类的,wiki呀这样的形式。

    我就不介绍那种流程工具了,公司很多自研的,大家工作了再去熟悉也很快的。

    概要设计:

    概要设计,这个是大厂程序员需求下来之后基本上都会做的一步,不过看需求大小,可能很多小需求直接就详细设计了

    很多不了解的同学可能会问,需要设计什么呢?为什么要设计呢?

    问得好,经常看我文章的都知道,技术是把双刃剑,你用了技术之后你是不是需要列出他的优点缺点,出问题之后的解决方案,还有可能出现的问题注意点等等。

    这么是为了让你能有把控力,比如你用了个EsElasticsearch)你什么都不管你就是要接入它,你把他开发好了上线了,但是有啥坑你知道么?上线崩了怎么办?

    帅丙我做Es设计的时候设计被老大打回N次,不过成长真心大,对Es的了解也飞速进步。

    其实远远不止这些问题,这就是我们做设计的主要原因,也是大家工作里面能成长的途径之一,你以为大佬们的经验是怎么来的?

    工具:Xmind/ProcessOn

    我这里列举了两个工具,他们两个都可以做概要设计的脑图,我给大家看看我设计过的一些脑图,都是出自这两个软件。

    大家在学习,看书等等的时候做个脑图,我告诉你后面你复习还是干啥都思路贼清晰,而且效率瞬间很多。

    详细设计

    小伙伴又要问了啥是详细设计呀帅丙

    诶呀简单,见名知意嘛,概要设计是大概的设计,详细设计是详细的设计。

    我们研发的时候整个流程往往很复杂,如果你理解不对直接就写代码,最后容易造成返工,延期,加班,被骂,心情差,回家吵架,离家出走。。。

    看到不做详细设计的后果了吧,其实大家花点时间做详细设计很有必要,你思路完全清晰了,写代码那就是分分钟的事情,不是嘛?

    那再看看帅丙的一个小设计吧,之前文章中大量的流程图,时序图都来自它,主要是这玩意还是在线的,都不用下载很方便啊。

    详细设计的工具我用的就是在线作图神器:ProcessOn

    总之一句话很香,流程图、思维导图、原型图、UML、网络拓扑图、组织结构图、BPMN等等一应俱全

    Ascilflow

    进入网站后直接开画!网页上端是菜单,自行操作!

    研发

    这个关键了:工欲善其事,必先利其器

    想必大家都知道这个谚语吧,我就说一下我写代码要用到的软件吧。

    Intellij IDEA

    这个我想都不用我介绍了吧,Java的同学都耳熟能详了,有同学问为啥不用eclipse呀,我不作回答,但是我只能告诉你IDEA肯定是效率还有很多方面都要香的。

    不过看个人习惯的哈,新同学还是推荐IDEA!!!

    WebStorm

    有知道同学要问了,帅丙这不是前端的开发工具么,为啥你要用,帅丙我呀全才来的呀,前端偶尔也写点的嘛,主要是js,vue,jq,还有丢丢React,不过最近帮三歪改前端居然是jsx有没有大佬救救我啊。

    Visual Studio Code

    Visual Studio Code是一个轻量且强大的跨平台开源代码编辑器(IDE),支持Windows,OS X和Linux。内置JavaScript、TypeScript和Node.js支持,而且拥有丰富的插件生态系统,可通过安装插件来支持C++、C#、Python、PHP等其他语言。

    PyCharm

    这个是python之前那次还记得我写代码大赛那期嘛,最开始就是用这个写的,平时学的时候也用用。

    Navicat Premium

    这个呀是数据库的可视化工具很香很好用,不过我们线上的表都是网页操作的,这个只能用来看看本地的开发表了,不过也是很有必要的,你SQL怎么都得本地跑一下没问题,才向DBA申请的嘛。

    Postman

    这个是接口调试的神器,单测比较繁琐的你可以试试这个嘛,不过很多接口还是只能写写单测,反正很香。

    不过这个名字一看就是男生用的,那我们女生用啥呢?往下看

    Postwoman

    PostMan一听就是男生用的,咋妹子们肯定要用最近开源的Postwoman啊,它是一款开源的 Postman 替代品

    开源没多久优点如下:

    • 轻盈,可直接在线访问;
    • 简约,采用简约的 UI 设计精心打造;
    • 支持 GET, HEAD, POST, PUT, DELETE, OPTIONS, PATCH 方法;
    • 支持验证;
    • 实时,发送请求即可获取响应。

    GIt

    代码文档管理工具,版本控制工具,大家之后的代码基本上都是使用git做版本管理

    Maven

    目前帅丙用到Maven的主要功能是:项目构建、项目构建、项目依赖管理、软件项目持续集成、版本管理、项目的站点描述信息管理

    Gradle

    Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。

    它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,目前也增加了基于Kotlin语言的kotlin-based DSL,抛弃了基于XML的各种繁琐配置。

    这个跟Maven功能是一样的,但是两者语法不一样,而且我觉得版本控制的时候没Maven好使,有小坑,胜在语法简洁。

    Charles

    这玩意是个HTTP代理服务器,我用它的主要用法就是抓包!

    都知道我是做电商的嘛,很多线上接口线上问题怎么排查呢,抓包看看数据呗。

    JMeter

    Apache JMeter是Apache组织开发的基于Java的压力测试工具

    是的就是用来压测的,你怎么模拟很多请求呀,就用它就对了。

    Dash

    Dash for mac是使用与Mac OS平台的软件编程文档管理工具,可以浏览API文档,以及管理代码片段工具。Dash自带了丰富的API文档,涉及各种主流的编程语言和框架。

    Devdocs

    上面那个的兄弟,但是这个不用下载,在线的

    DataGrip

    DataGrip是JetBrains公司推出的管理数据库的产品,对于JetBrains公司,开发者肯定都不陌生,IDEA和ReSharper都是这个公司的产品,用户体验非常不错。

    最开始我用它就单纯看同事在用很酷的界面,后面发现功能也香,高亮文本啥的,很多功能大家可以去挖。

    JVisualVM

    VisualVM 是Netbeans的profile子项目,已在JDK6.0 update 7 中自带,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。

    VisualVM可以根据需要安装不同的插件,每个插件的关注点都不同,有的主要监控GC,有的主要监控内存,有的监控线程等。

    Iterm2

    • 官网地址 :https://www.iterm2.com/

    这个是我做日志排查的客户端工具,也是支持很多配置,直接ssh上跳板机查看线上机器的状态等等,线上问题排查还是很有必要的。

    网*有道词典

    有朋友要疑问了帅丙这是什么情况,鬼畜乱入么?

    不是的,我们研发的时候很多单词不认识,或者命名的时候这个词汇的英文不知道还是很有必要查一下的,规范的命名是你成为顶级大牛的第一步,你命名都是A,B,C你代码review的时候,你的Leader会叫hr让你提交前回家过年的,马上过年了大家不要轻易尝试。

    Sublime Text

    这是个文本记录的工具,也可以用于写代码,但是我们有IDE了那就用来当日常琐事记录的工具,临时文档处理的工具也是可以的,反正还是很好用的。

    刚好最近呀人才群里的人才们都叫我安利一下我做笔记还有写博客的工具,说我排版好看。(我飘了)

    安排!

    印象笔记

    这个可以说是陪伴我大学到现在的一个工具了吧,我数了下,上千文件了,我的生活琐事的记录,还有学编程之后的很多东西,我都是收录在里面的。

    这个东西我就不和别的笔记比较了,因为我最开始就用的这个一直没换过,好不好用我说了不算的,大家下一个看看就知道了。

    Typora

    Typora是我一直写Markdown的工具,好用到不行,还可以切换模式你敢信?打字机模式,专注模式,源码模式总有一个你的菜.

    Ipic

    图床我是配合Typora一起使用的大家Markdown是不是复制图片进来都是本地的地址,发到网上就会失效的,但是跟Typora搞基的这个工具他可以在你复制进来的时候直接传到网上了,你再去任何平台发表都可以随心所欲了。

    Md2All

    大家好奇我的markdown怎么这么好看呀,其实我写了markdown之后还转成了html的,用的也就是上面这个工具。

    我写完也是在这里面进行排版然后发出去的,排版要花好久,忍不住给帅丙点赞

    图像处理

    Adobe Photoshop CC 2019

    Ps嘛大家都知道的,正常的图片处理啊用这个香,没事帮美女P下图,搞不好能找个女朋友(我又开始YY了)

    Adobe Premiere Pro CC 2019

    这个可能是大家使用得最多的视频处理软件了吧,很好用!!!

    功能全到无法令人呼吸,缺点就是学习成本有点大,入门很快,想成为大神需要大量时间积累。

    Adobe After Effects CC 2019

    不知道大家视频看得多么,很多视频的特效开场都是这个做的,下面也有一个我的demo。

    GIPHY CAPTURE

    有时候大家文章不想用静态的图画去表达,想录制写代码的Gif动图,那这个软件是真的好使。

    视频播放 KMPlayer

    其实帅丙我心中有个播放神器的,快播。

    可惜了还没用多久,播播就夭折了,我会使用下面这个播放软件去播放我自己的视频。

    因为很多格式电脑自带的可能不支持,我又喜欢剪辑视频,所以一直用它了。

    DouTu

    大家是不是发现我之前的文章很多表情包,其实都是在线制作的。

    Carbon

    帅丙之前的文章里面很多代码的图片都是这个网站生成的,很多样式可以选择,就很好看。

    CodeLF

    这个网站有意思了,写代码不知道单词怎么命名就去这里查,他是GItHub的一个爬虫工具吧,看看大神的命名总是会有思路的吧。

    注意:上面的软件我都是简单的介绍下是干啥的,因为太多了,真正的功能需要大家深挖的,能力允许的朋友下载正版。

    总结

    其实比较香的工具还有太多了,我这里就不一一介绍了,其实有个很简单的办法,就是学习借鉴

    我就是这样的,我看Leader用的什么工具我就问他这是啥,好用不?怎么用?

    包括我写博客吧,其实才写了20多天,第一天准备写的时候我就直接问三歪(Java3y),你用的什么开发工具呀,怎么用的呀,包括他主要发布的哪些平台呀,发布的时间段呀,我都直接问。

    他坐我对面,迫于我的淫威不得不和盘托出,主要是最近有个需求需要我帮他写代码哈哈。

    别人都这么多的经验下来了,软件能差嘛?而且使用过程中不会的还可以问一下对方,不香嘛。

    Tip:本来有很多我准备的资料的,但是都是外链,或者不合适的分享方式,博客的运营小姐姐提醒了我,所以大家去公众号回复【资料】好了。

    白嫖不好,创作不易,各位的点赞就是丙丙创作的最大动力,我们下篇文章见,文末图片有福利

    持续更新,未完待续……


    文章每周持续更新,可以微信搜索「 三太子敖丙 」第一时间阅读,回复【资料】【电子书】有我准备的一线大厂面试资料和电子书,本文 GitHub https://github.com/JavaFamily 已经收录,有大厂面试完整考点,欢迎Star。

    你知道的越多,你不知道的越多

    展开全文
  • 工具】(七):win10常用工具整理!!!

    万次阅读 多人点赞 2019-10-04 18:12:47
    系统工具 办公软件 编程开发 数据库相关 图片视频工具 网络及下载工具 解压缩工具 影音娱乐工具 二、软件工具 1.系统工具 1.1. 磁盘管理 PartAssist:一款好用的磁盘分区管理工具。 1.2. 修复、引导 EasyBCD:一款...

    如题,本文主要为博主对电脑上安装的一些软件,所做的整理,当做备份用吧。

    一、分类

    二、软件工具

    1.系统工具

    1.1. 磁盘管理

    PartAssist:一款好用的磁盘分区管理工具。
    在这里插入图片描述

    1.2. 修复、引导

    EasyBCD:一款常用的系统引导和修复工具。
    在这里插入图片描述

    1.3. 虚拟机管理工具

    win10 自带的Hyper-V,和常用的WMware工具

    Hyper-V:win10(企业版、专业版、教育版)自带。
    在这里插入图片描述

    WMware:适用多种系统(也有破解版)。
    在这里插入图片描述

    1.4. 文件传输

    FileZilla:是一种快速、可信赖的FTP客户端以及服务器端开放源代码程序。
    在这里插入图片描述

    1.5. 启动盘制作

    1. 制作PE启动盘工具:
      微PE工具箱U启动大白菜老毛桃AbsolutePE工具箱深度等等。
    2. 软碟通
      UltraISO:一个类似于WinISO的ISO文件编辑工具,可以用来制作启动光盘映像。
      在这里插入图片描述
    3. Rufus:一个可以帮助格式化和创建可引导USB闪存盘的工具。
      在这里插入图片描述

    >>> 回到分类

    2. 办公软件

    不用多说,首选就是全套office办公软件,如:word、Excel、PowerPoint、Outlook、OneNote等等。

    • 有道翻译:以前用的一个翻译软件,当然Office Word也有在线翻译功能。

    • VoiceTra:语音翻译,PC用的话,可以下一个安卓模拟器试试。

    • iSkysoft PDF Editor:一款强大的全能PDF编辑软件。

    • 福昕阅读器:PDF阅读器,其他,可见:更多

    • Xmind:思维导图软件。

    • Everything:一款文件索引工具(包括了路径、大小、扩展名、类型、修改时间、创建时间、访问时间、属性等)。

    • WizTree:一款Windows 磁盘分析工具。

    • rapidee:环境变量修改器。

    • QuickLook: 一款文件预览工具,方便快捷。

    >>> 回到分类

    3. 桌面管理

    其实很多应用管家都是有自带的桌面整理工具,可以到工具箱去找,如电脑管家、360、腾讯管家等等。

    • RocketDock:高度可定制的Mac风格桌面导航栏,搭配Mac OS X Leopard主题
    • MyDock和MyFinder:两款极致模仿mac os系统桌面的工具
    • Rainmeter:雨滴桌面,个性化桌面定制工具
    • StartIsBack:更改win图标,透明度,和任务栏样式等等
    • Wallpaper Engine:steam壁纸软件,可以在 Windows 桌面上使用动态壁纸

    >>> 回到分类

    4. 编程开发

    4.1. 编辑器

    1. NotePad++:一款好用的纯文本编辑器,也可用于多种语言脚本的开发。
    2. sublime text 3:应用比较广泛的文本编辑器,功能非常强大,程序员必备。
    3. Editplus:小巧但是功能强大的可处理文本、HTML和程序语言的Windows编辑器,你甚至可以通过设置用户工具将其作为C,Java,Php等等语言的一个简单的IDE。
    4. Yu Writer:一款支持多平台的Markdown编辑软件。
    5. Atom:作用类似Vscode,常用于web开发,但也可以打造成多种语言开发的IDE工具。
    6. spyder :一个简单的集成开发环境(python),配合Anaconda,做科学分析以及爬虫
    7. Eric6:一款python的编辑器,配合PyQt5,多用来GUI编程

    4.2. IDE

    1. Dev-C++:简单 开发C/C++的集成开发环境(IDE)。
    2. Pycharm:应用广泛的Python开发 IDE 工具。
    3. RubyMine:常用的Ruby开发的 IDE 工具。
    4. PHPstorm:用于PHP开发的 IDE 工具。
    5. Webstorm:web开发的 IDE 工具。
    6. Visual Studio Code:功能强大的IDE工具,适用于多种语言。

    4.3. Docker

    • docker:一个开源的应用容器引擎,使用镜像模拟多种开发环境。

    4.4. 集成环境

    • phpstudy:PHP中文网开发的一款功能强大的php集成开发环境软件。
    • wampserver:同样是强大的php集成开发环境工具。

    4.5. 项目开发管理

    • Git:最常用的项目托管工具。
    • GitKraken:冲突显示和解决工具。
    • Beyond Compare:差异对比工具。
    • TortoiseGit:小乌龟,界面化一个仓库管理工具。

    4.6. 开发测试

    • postman:用于模拟构造http请求的web工具。
    • Fiddler:抓包工具。
    • WireShark:抓包工具。
    • Airtest:一款 UI 界面自动化测试工具。
    • LoveString:字符编码转换器。
    • goproxy 代理:网络代理工具,支持多种协议,支持 ssh 穿透和 kcp 协议。
    • Gaia:自动化运维平台,可以轻松有趣地以任何编程语言构建功能强大的管道。

    >>> 回到分类

    5. 数据库工具

    • MySQL:广泛应用的关系型数据库工具。
    • MongoDB:文档型(非关系型)数据库工具。
    • Redis: 基于内存亦可持久化的日志型、Key-Value数据库。
    • SqLite:一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。
    • PostgreSQL:开源的对象-关系数据库。
    • Navicat:数据库可视化工具。
    • SQLiteStudio:可视化sqlite数据库工具,Qt写的。
    • dbkoda:MongoDB可视化工具,本以为IDE的Mongo插件数据显示效果已经相当OK了,不得不说这款颜值👍

    >>> 回到分类

    6. 图片视频工具

    >>> 回到分类

    7. 网络及下载工具

    • 百度网盘
    • 比特精灵:下载工具,速度比较快,可以用它代替迅雷。
    • 迅雷极速版:提取码: j3dv(来源:知乎
    • IDM:(Internet Download Manager)国外的一款多线程下载神器。
    • 冰点下载器:无需积分也无需登录就可以自由下载百度和豆丁等文库。
    • chrome:谷歌浏览器,对开发比较友好,功能强大。
    • Firefox:火狐浏览器,也是比较好用的一款浏览器。

    >>> 回到分类

    8. 解压缩工具

    >>> 回到分类

    9. 影音娱乐工具

    • 网易云音乐:以前比较喜欢,现在好多资源缺失。
    • QQ音乐
    • Listen 1:一个比较全面的音乐播放器,可以搜索和播放来自网易云音乐,虾米,QQ音乐,酷狗音乐,酷我音乐网站的歌曲(同时也有Chrome插件版、Mac版…)。
    • Potplayer:一款无广告,功能强大的视频播放器。
    • 优酷视频
    • 爱奇艺
    • 腾讯视频

    >>> 回到分类


    结束,用到再补充!

    展开全文
  • DirectX修复工具下载V3.5增强 绿色版 工具软件

    万次下载 热门讨论 2016-06-23 11:46:59
    DirectX修复工具(DirectX Repair)是一款系统级工具软件下载,简便易用。本程序为官方绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc...
  • 工具包里面的工具类虽然是被定义在Spring下面的,但是由于Spring框架目前几乎成了JavaEE实际的标准了,因此我们直接使用也是无妨的,很多时候能够大大的提高我们的生产力。本文主要介绍一些个人认为还非常实用的...

    每篇一句

    没有坐等出来的精彩,只有拼搏出来的辉煌

    前言

    在Spring Framework里的spring-core核心包里面,有个org.springframework.util里面有不少非常实用的工具类。

    该工具包里面的工具类虽然是被定义在Spring下面的,但是由于Spring框架目前几乎成了JavaEE实际的标准了,因此我们直接使用也是无妨的,很多时候能够大大的提高我们的生产力。本文主要介绍一些个人认为还非常实用的工具类,仅仅代表个人意见哦~
    在这里插入图片描述

    此处提到的工具类为纯工具类。与Spring的Bean没有关系,是最为共用的工具类

    IdGenerator 唯一键生成器 UUID

    UUID除了生成的字符串比较长以外,几乎没有缺点(当然用字符串做主键,也算一个小缺点吧)

    Spring给我提供了接口:IdGenerator 来生成id代表唯一箭,它内置提供了三个实现:
    在这里插入图片描述

    JdkIdGenerator

    JDK的工具类包util包中就为我们提供了一个很好的工具类,即UUID。UUID(Universally Unique Identifier)通用唯一识别码。

    	@Override
    	public UUID generateId() {
    		return UUID.randomUUID();
    	}
    

    底层字节调用JDK的UUID方法,因此不做过多介绍了

    AlternativeJdkIdGenerator

    这是Spring提供给我们的重头戏,用它来取代JDK的UUID的生成。从它的javadoc说明:

     * An {@link IdGenerator} that uses {@link SecureRandom} for the initial seed and
     * {@link Random} thereafter, instead of calling {@link UUID#randomUUID()} every
     * time as {@link org.springframework.util.JdkIdGenerator JdkIdGenerator} does.
     * This provides a better balance between securely random ids and performance.
    

    大意是:它使用了SecureRandom作为种子,来替换调用UUID#randomUUID()。它提供了一个更好、更高性能的表现(关于性能比较,下面会给出一个例子)

    SimpleIdGenerator

    类似于自增的Id生成器。每调用一次,自增1(一般比较少使用 指导就行了)

    三者性能比较:

        public static void main(String[] args) {
            JdkIdGenerator jdkIdGenerator = new JdkIdGenerator();
            AlternativeJdkIdGenerator alternativeJdkIdGenerator = new AlternativeJdkIdGenerator();
            SimpleIdGenerator simpleIdGenerator = new SimpleIdGenerator();
    
            Instant start;
            Instant end;
            int count = 1000000;
    
            //jdkIdGenerator
            start = Instant.now();
            for (int i = 0; i < count; i++) {
                jdkIdGenerator.generateId();
            }
            end = Instant.now();
            System.out.println("jdkIdGenerator循环" + count + "次耗时:" + Duration.between(start, end).toMillis() + "ms");
    
            //alternativeJdkIdGenerator
            start = Instant.now();
            for (int i = 0; i < count; i++) {
                alternativeJdkIdGenerator.generateId();
            }
            end = Instant.now();
            System.out.println("alternativeJdkIdGenerator循环" + count + "次耗时:" + Duration.between(start, end).toMillis() + "ms");
    
            //simpleIdGenerator
            start = Instant.now();
            for (int i = 0; i < count; i++) {
                simpleIdGenerator.generateId();
            }
            end = Instant.now();
            System.out.println("simpleIdGenerator循环" + count + "次耗时:" + Duration.between(start, end).toMillis() + "ms");
        }
    

    发现仅仅循环生成100万次,Spring提供的算法性能远远高于JDK的。因此建议大家以后使用AlternativeJdkIdGenerator去生成UUID,性能会更好一点

    缺点是:还需要new对象才能使用,不能通过类名直接调用静态方法,当然我们可以二次封装。另外,一般输出串我们都会进一步这么处理:.toString().replace("-", "")

    Assert 断言工具类

    Assert断言工具类,通常用于数据合法性检查。Assert断言工具类,通常用于数据合法性检查.

    if (message== null || message.equls("")) {  
        throw new IllegalArgumentException("输入信息错误!");  
    } 
    

    用Assert工具类上面的代码可以简化为:Assert.hasText((message, "输入信息错误!");
    下面介绍常用的断言方法的使用:

    Assert.notNull(Object object, "object is required")    -    对象非空 
    Assert.isTrue(Object object, "object must be true")   -    对象必须为true   
    Assert.notEmpty(Collection collection, "collection must not be empty")    -    集合非空  
    Assert.hasLength(String text, "text must be specified")   -    字符不为null且字符长度不为0   
    Assert.hasText(String text, "text must not be empty")    -     text 不为null且必须至少包含一个非空格的字符  
    Assert.isInstanceOf(Class clazz, Object obj, "clazz must be of type [clazz]")    -    obj必须能被正确造型成为clazz 指定的类
    

    junit也提供断言工具类,但是我们只能在单元测试中使用,而Spring提供的这个,哪儿都能使用,还是比较方便的

    PathMatcher 路径匹配器

    Spring提供的实现:AntPathMatcher Ant路径匹配规则
    (1)SpringMVC的路径匹配规则是依照Ant的来的,实际上不只是SpringMVC,整个Spring框架的路径解析都是按照Ant的风格来的;
    (2)AntPathMatcher不仅可以匹配Spring的@RequestMapping路径,也可以用来匹配各种字符串,包括文件路径等。

    你是否曾今在你们的Filter里看过类似下面的代码?
    在这里插入图片描述
    这种所谓的白名单URL这样来匹配,可谓非常的不优雅,而且通过穷举法的扩展性不可为不差。因此下面举几个例子来介绍此匹配器的用法,以后建议使用它吧~

            PathMatcher pathMatcher = new AntPathMatcher();
    
            //这是我们的请求路径  需要被匹配(理解成匹配controller吧 就很容易理解了)
            String requestPath = "/user/list.htm?username=aaa&departmentid=2&pageNumber=1&pageSize=20";//请求路径
            //路径匹配模版
            String patternPath = "/user/list.htm**";
            assertTrue(pathMatcher.match(patternPath, requestPath));
    

    ANT方式的通配符有三种:
    ?(匹配任何单字符),*(匹配0或者任意数量的字符),**(匹配0或者更多的目录)
    url路径匹配规则说明:
    在这里插入图片描述

    举一些常用案例:

        @Test
        public void fun1() {
            PathMatcher pathMatcher = new AntPathMatcher();
    
            // 精确匹配
            assertTrue(pathMatcher.match("/test", "/test"));
            assertFalse(pathMatcher.match("test", "/test"));
    
            //测试通配符?
            assertTrue(pathMatcher.match("t?st", "test"));
            assertTrue(pathMatcher.match("te??", "test"));
            assertFalse(pathMatcher.match("tes?", "tes"));
            assertFalse(pathMatcher.match("tes?", "testt"));
    
            //测试通配符*
            assertTrue(pathMatcher.match("*", "test"));
            assertTrue(pathMatcher.match("test*", "test"));
            assertTrue(pathMatcher.match("test/*", "test/Test"));
            assertTrue(pathMatcher.match("*.*", "test."));
            assertTrue(pathMatcher.match("*.*", "test.test.test"));
            assertFalse(pathMatcher.match("test*", "test/")); //注意这里是false 因为路径不能用*匹配
            assertFalse(pathMatcher.match("test*", "test/t")); //这同理
            assertFalse(pathMatcher.match("test*aaa", "testblaaab")); //这个是false 因为最后一个b无法匹配了 前面都是能匹配成功的
    
            //测试通配符** 匹配多级URL
            assertTrue(pathMatcher.match("/*/**", "/testing/testing"));
            assertTrue(pathMatcher.match("/**/*", "/testing/testing"));
            assertTrue(pathMatcher.match("/bla/**/bla", "/bla/testing/testing/bla/bla")); //这里也是true哦
            assertFalse(pathMatcher.match("/bla*bla/test", "/blaXXXbl/test"));
    
            assertFalse(pathMatcher.match("/????", "/bala/bla"));
            assertFalse(pathMatcher.match("/**/*bla", "/bla/bla/bla/bbb"));
    
            assertTrue(pathMatcher.match("/*bla*/**/bla/**", "/XXXblaXXXX/testing/testing/bla/testing/testing/"));
            assertTrue(pathMatcher.match("/*bla*/**/bla/*", "/XXXblaXXXX/testing/testing/bla/testing"));
            assertTrue(pathMatcher.match("/*bla*/**/bla/**", "/XXXblaXXXX/testing/testing/bla/testing/testing"));
            assertTrue(pathMatcher.match("/*bla*/**/bla/**", "/XXXblaXXXX/testing/testing/bla/testing/testing.jpg"));
            assertTrue(pathMatcher.match("/foo/bar/**", "/foo/bar"));
    
            //这个需要特别注意:{}里面的相当于Spring MVC里接受一个参数一样,所以任何东西都会匹配的
            assertTrue(pathMatcher.match("/{bla}.*", "/testing.html"));
            assertFalse(pathMatcher.match("/{bla}.htm", "/testing.html")); //这样就是false}
    

    注意事项:
    1、AntPathMatcher不仅可以匹配URL路径,也可以匹配文件路径。但是需要注意AntPathMatcher也有有参构造,传递路径分隔符参数pathSeparator(若不传,默认值为/),对于文件路径的匹配来说,则需要根据不同的操作系统来传递各自的文件分隔符,以此防止匹配文件路径错误。

    AntPathMatcher默认路径分隔符为“/”,而在匹配文件路径时,需要注意Windows下路径分隔符为“\”,Linux下为“/”。靠谱写法如下两种方式:

    AntPathMatcher matcher = new AntPathMatcher(File.separator);
    AntPathMatcher matcher = new AntPathMatcher(System.getProperty("file.separator"));
    

    2、最长匹配规则(has more characters),即越精确的模式越会被优先匹配到。例如,URL请求/app/dir/file.jsp,现在存在两个路径匹配模式/**/.jsp和/app/dir/.jsp,那么会根据模式/app/dir/*.jsp来匹配。

    ConcurrentReferenceHashMap

    ConcurrentReferenceHashMap是自spring3.2后增加的一个同步的软(虚)引用Map。

    这个工具类厉害了。我们知道java的引用类型一共分四种【小家java】引用类型(强引用、软引用、弱引用、虚引用),JDK也为我们提供了
    WeakHashMap来使用。但是,但是它并不是线程安全的,因此刚好Spring给我们功提供这个工具类:ConcurrentReferenceHashMap满足了我们对线程安全的弱、软引用的需求。线面通过一个示例体验一把:

        @Test
        public void fun1() throws InterruptedException {
            String key = new String("key");
            String value = new String("val");
            Map<String, String> map = new ConcurrentReferenceHashMap<>(8, ConcurrentReferenceHashMap.ReferenceType.WEAK);
            map.put(key, value);
            System.out.println(map); //{key=val}
            key = null;
            System.gc();
    
            //等待一会 确保GC能够过来
            TimeUnit.SECONDS.sleep(5);
            System.out.println(map); //{}
        }
    

    我们发现当我们吧key置为null后,垃圾回收器会回收掉这部分内存。这就是弱、虚引用的作用,主要用来防止OOM。

    查看ConcurrentReferenceHashMap源码发现起底层实现依赖的是RefrenceQueue完成自动移除操作。时间有限就写到这里。有时间再进行完善。 当然还有保证线程安全的代码,也是很重要的

    DefaultPropertiesPersister

    这个类本身没有什么特别的,就是代理了JDK的Properties类而已。但写到此处是觉得Spring优秀就优秀在它强大的对扩展开放的原则体现。

    比如如果我们需要对配置文件进行解密(比如数据库连接密码不能明文),这些操作通过复写这些扩展类的某些方法来做,将特别的优雅。
    spring启动时,解密配置文件的密文

    DigestUtils

    可以对字节数组、InputStream流生成摘要。10禁止或者16进制都行

    FastByteArrayOutputStream

    可以说是Spring实现的加强版的ByteArrayOutputStream。为什么加强了呢?其实底层原理是Spring采用了一个LinkedList来作为缓冲区:

    	// The buffers used to store the content bytes
    	private final LinkedList<byte[]> buffers = new LinkedList<>();
    

    ByteArrayOutputStream直接使用的字节数组。

    protected byte buf[];
    

    这样每一次扩容中分配一个数组的空间,并当该数据放入到List中。相当于批量的操作,而ByteArrayOutputStream内部实现为一个数组每一次扩容需要重新分配空间并将数据复制到新数组中。效率高下立判了~因此推荐使用

    FileCopyUtils、FileSystemUtils、StreamUtils

    都是操作文件、操作流的一些工具类。这里就不做过多的介绍了,因为还是比较简单的。

    LinkedCaseInsensitiveMap 、LinkedMultiValueMap

    不区分大小写的有序map;底层代理了LinkedHashMap,因此它能保证有序。此Map的意义在于:在编写比如MaBatis这种类似的自动封装框架的时候,特备有用。

    数据库本身对大小写不敏感(我使用的是mysql),但是创建表格的时候,数据库里面字段都会默认小写,所以MyBatis映射的时候,key也会映射成小写,可以用LinkedCaseInsensitiveMap(key值不区分大小写的LinkedMap)来处理。

    LinkedCaseInsensitiveMap的key一定是String

    现在我随手写个Demo,感受一下吧:

        @Test
        public void fun1() {
            Map<String, Object> map = new LinkedCaseInsensitiveMap<>();
    
            map.put("a", 1);
            map.put("A", 1);
            System.out.println(map); //{A=1}
            System.out.println(map.get("a")); //1 map里面key是小写的a,通过大写的A也能get出来结果
        }
    

    LinkedMultiValueMap:见名之意,一个key对应多个value。废话不多说,直接感受一把就知道了

        @Test
        public void fun1() {
            //用Map接的时候  请注意第二个泛型 是个List哦
            //Map<String, List<Integer>> map = new LinkedMultiValueMap<>();
            LinkedMultiValueMap<String, Integer> map = new LinkedMultiValueMap<>();
    
            //此处务必注意,如果你还是用put方法  那是没有效果的 同一个key还是会覆盖
            //map.put("a", Arrays.asList(1));
            //map.put("a", Arrays.asList(1));
            //map.put("a", Arrays.asList(1));
            //System.out.println(map); //{a=[1]}
    
            //请用add方法
            map.add("a", 1);
            map.add("a", 1);
            map.add("a", 1);
            System.out.println(map); //{a=[1, 1, 1]}
        }
    

    个人感觉没有Apache Common提供的好用。但是一般来说也足够用了~

    PropertyPlaceholderHelper

    作用:将字符串里的占位符内容,用我们配置的properties里的替换。这个是一个单纯的类,没有继承没有实现,而且也没简单,没有依赖Spring框架其他的任何类。

    StringValueResolver是一个转化String类型数据的接口,真正更新属性的api实现竟然是在PropertyPlaceholderHelper#parseStringValue

    因此现在知道此类的重要性了,下面演示一下Demo,知道怎么使用即可(其实在Spring容器环境下,这些都退调用者是透明的,除非自己要书写框架性的东西):
    配置文件如下:

    name=wangzha
    age=18
    sex=man
    name18man=love
    
        public static void main(String[] args) throws Exception {
            String a = "{name}{age}{sex}";
            String b = "{name{age}{sex}}";
            PropertyPlaceholderHelper propertyPlaceholderHelper = new PropertyPlaceholderHelper("{", "}");
            InputStream in = new BufferedInputStream(new FileInputStream(new File("D:\\work\\remotegitcheckoutproject\\myprojects\\java\\boot2-demo1\\src\\main\\resources\\application.properties")));
            Properties properties = new Properties();
            properties.load(in);
    
            //==============开始解析此字符串==============
            System.out.println("替换前:" + a); //替换前:{name}{age}{sex}
            System.out.println("替换后:" + propertyPlaceholderHelper.replacePlaceholders(a, properties)); //替换后:wangzha18man
            System.out.println("====================================================");
            System.out.println("替换前:" + b); //替换前:{name{age}{sex}}
            System.out.println("替换后:" + properties); //替换后:love  最后输出love,证明它是从内往外一层一层解析的
        }
    

    显然@Value注解或者其余spel表达式的东西,都得依赖于这个来做。

    这个掌握了,让我们自定义支持的表达式的时候,我们也可以高大上的说,我的格式支持spel表达式SpelExpressionParser。更加的灵活了

    SpringVersion、SpringBootVersion 获取当前Spring版本号

        public static void main(String[] args) {
            System.out.println(SpringVersion.getVersion()); //5.0.6.RELEASE
            System.out.println(SpringBootVersion.getVersion()); //2.0.2.RELEASE
        }
    

    ReflectionUtils 反射工具类

    反射在容器中使用是非常频繁的了,这些方法一般在Spring框架内部使用。当然现在Spring都成为实际的规范了,所以我们也可以直接拿来使用。

    public static Field findField(Class<?> clazz, String name);
    public static Field findField(Class<?> clazz, @Nullable String name, @Nullable Class<?> type);
    public static void setField(Field field, @Nullable Object target, @Nullable Object value);
    

    该方法是从类里面找到字段对象。(private以及父类的都会找哟,但是static的就不会啦)

    public static Object getField(Field field, @Nullable Object target);
    

    这个很明显,就是拿到该对象指定字段的值,示例如下:

        public static void main(String[] args) {
            Person person = new Person("fsx", 18);
            Field field = ReflectionUtils.findField(Person.class, "name");
            field.setAccessible(true); //注意,如果是private的属性,请加上这一句,否则抛出异常:can not access a member of class com.fsx.boot2demo1.bean.Person with modifiers "private"
    
            System.out.println(ReflectionUtils.getField(field, person)); //fsx
        }
    
    public static Method findMethod(Class<?> clazz, String name);
    public static Method findMethod(Class<?> clazz, String name, @Nullable Class<?>... paramTypes);
    public static Object invokeMethod(Method method, @Nullable Object target); //这个不需要自己处理异常哦
    public static Object invokeMethod(Method method, @Nullable Object target, @Nullable Object... args);
    

    示例:

        public static void main(String[] args) {
            Person person = new Person("fsx", 18);
            System.out.println(ReflectionUtils.findMethod(Person.class, "clone")); //protected native java.lang.Object java.lang.Object.clone() throws java.lang.CloneNotSupportedException
            System.out.println(ReflectionUtils.findMethod(Person.class, "getName")); //public java.lang.String com.fsx.boot2demo1.bean.Person.getName()
            System.out.println(ReflectionUtils.findMethod(Person.class, "setName", String.class)); //public void com.fsx.boot2demo1.bean.Person.setName(java.lang.String)
            System.out.println(ReflectionUtils.findMethod(Person.class, "privateMethod")); //private void com.fsx.boot2demo1.bean.Person.privateMethod()
        }
    

    也是一样非常的强大。private、父类方法都能获取到。

    所有的反射相关的异常,其实都可以交给下面来处理:

    public static void handleReflectionException(Exception ex);
    public static void rethrowRuntimeException(Throwable ex);
    
    boolean declaresException(Method method, Class<?> exceptionType); //判断一个方法上是否声明了指定类型的异常
    boolean isPublicStaticFinal(Field field); //判断字段是否是public static final的
    boolean isEqualsMethod(Method method); //判断该方法是否是equals方法
    boolean isHashCodeMethod(Method method);
    boolean isToStringMethod(Method method);
    boolean isObjectMethod(Method method); //判断该方法是否是Object类上的方法
    
    public static void makeAccessible(Field field); //将一个字段设置为可读写,主要针对private字段
    void makeAccessible(Method method);
    void makeAccessible(Constructor<?> ctor);
    

    在AopUtils中也有这几个isXXX方法,是的,其实AopUtils中的isXXX方法就是调用的ReflectionUtils的这几个方法的;所以可见此工具类的强大

    public static Method[] getAllDeclaredMethods(Class<?> leafClass);
    public static Method[] getUniqueDeclaredMethods(Class<?> leafClass);
    

    看个栗子:

        public static void main(String[] args) {
            Person person = new Person("fsx", 18);
            Method[] allDeclaredMethods = ReflectionUtils.getAllDeclaredMethods(Person.class);
            //我们发现  这个方法可以把所有的申明的方法都打印出来。包含private和父类的   备注:重复方法都会拿出来。比如此处的toString方法 子类父类的都有
            for (Method method : allDeclaredMethods) {
                System.out.println(method);
            }
    
            System.out.println("------------------------------------");
    
            //针对于上面的结果过滤。只会保留一个同名的方法(保留子类的)
            Method[] uniqueDeclaredMethods = ReflectionUtils.getUniqueDeclaredMethods(Person.class);
            for (Method method : uniqueDeclaredMethods) {
                System.out.println(method);
            }
    
        }
    

    最后是这几个方法:
    在这里插入图片描述
    针对指定类型上的所有方法,依次调用MethodCallback回调;看个源码就知道这个方法的作用:

    public static void doWithLocalMethods(Class<?> clazz, MethodCallback mc) {
        Method[] methods = getDeclaredMethods(clazz);
        for (Method method : methods) {
            try {
                mc.doWith(method);
            }catch (IllegalAccessException ex) {
                throw new IllegalStateException("...");
            }
        }
    }
    

    其实实现很简单,就是得到类上的所有方法,然后执行回调接口;这个方法在Spring针对bean的方法上的标签处理时大量使用,比如@Init,@Resource,@Autowire等标签的预处理;
    Spring处理的源码如下:(仅供参考)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    ResourceUtils

    Spring 提供了一个 ResourceUtils 工具类,它支持“classpath:”和“file:”的地址前缀,它能够从指定的地址加载文件资源。(其实还支持“jar:和war:前缀”)

    public abstract class ResourceUtils {
    
    	public static final String CLASSPATH_URL_PREFIX = "classpath:";
    	public static final String FILE_URL_PREFIX = "file:";
    	public static final String JAR_URL_PREFIX = "jar:";
    	public static final String WAR_URL_PREFIX = "war:";
    	...
    	// 是否是一个URL
    	public static boolean isUrl(@Nullable String resourceLocation) {
    		if (resourceLocation == null) {
    			return false;
    		}
    		// 对classpath:进行了特殊的照顾
    		if (resourceLocation.startsWith(CLASSPATH_URL_PREFIX)) {
    			return true;
    		}
    		try {
    			new URL(resourceLocation);
    			return true;
    		}
    		catch (MalformedURLException ex) {
    			return false;
    		}
    	}
    	public static URL getURL(String resourceLocation) throws FileNotFoundException {...}
    	public static File getFile(String resourceLocation) throws FileNotFoundException {...}
    	public static File getFile(URL resourceUrl) throws FileNotFoundException {...}
    	public static File getFile(URI resourceUri) throws FileNotFoundException {...}
    	public static File getFile(URI resourceUri, String description) throws FileNotFoundException {...}
    	
    	// 判断
    	public static boolean isFileURL(URL url) {
    		// 均是和protocol 这个协议有关的~~~
    		String protocol = url.getProtocol();
    		return (URL_PROTOCOL_FILE.equals(protocol) || URL_PROTOCOL_VFSFILE.equals(protocol) ||
    				URL_PROTOCOL_VFS.equals(protocol));
    	}
    	public static boolean isJarURL(URL url) {...}
    	// @since 4.1
    	public static boolean isJarFileURL(URL url) {...}
    	// URL和URI的转换
    	public static URI toURI(URL url) throws URISyntaxException {
    		return toURI(url.toString());
    	}
    	public static URI toURI(String location) throws URISyntaxException {
    		return new URI(StringUtils.replace(location, " ", "%20"));
    	}
    }
    

    Demo:

        public static void main(String[] args) throws FileNotFoundException {
            File file = ResourceUtils.getFile("classpath:application.properties");
            System.out.println(file); //D:\work\remotegitcheckoutproject\myprojects\java\boot2-demo1\target\classes\application.properties
    
            System.out.println(ResourceUtils.isUrl("classpath:application.properties")); //true
    
            //注意此处输出的路径为正斜杠 ‘/’的  上面直接输出File是反斜杠的(和操作系统相关)
            System.out.println(ResourceUtils.getURL("classpath:application.properties")); //file:/D:/work/remotegitcheckoutproject/myprojects/java/boot2-demo1/target/classes/application.properties
        }
    

    备注:若你在使用过程中,发现ResourceUtils.getFile()死活都找不到文件的话,那我提供一个建议:是否是在jar包内使用了此工具类,一般不建议在jar包内使用。另外,提供一个代替方案:可解决大多数问题:

        public static void main(String[] args) {
            ClassPathResource resource = new ClassPathResource("application.properties");
            System.out.println(resource); //class path resource [application.properties]
        }
    

    SerializationUtils

    这个工具就不做过多解释了。提供了两个方法:对象<–>二进制的相互转化。(基于源生JDK的序列化方式)

    public static byte[] serialize(@Nullable Object object);
    public static Object deserialize(@Nullable byte[] bytes);
    

    请注意,对象需要实现Serializable接口哦

    SocketUtils

    提供给我们去系统找可用的Tcp、Udp端口来使用。有的时候确实还蛮好用的,必进端口有时候不用写死了,提高灵活性

        public static void main(String[] args) {
            System.out.println(SocketUtils.PORT_RANGE_MAX); //65535 最大端口号
            System.out.println(SocketUtils.findAvailableTcpPort()); //45569 随便找一个可用的Tcp端口 每次执行值都不一样哦
            System.out.println(SocketUtils.findAvailableTcpPort(1000, 2000)); //1325 从指定范围内随便找一个端口
    
            //找一堆端口出来  并且是排好序的
            System.out.println(SocketUtils.findAvailableTcpPorts(10, 1000, 2000)); //[1007, 1034, 1287, 1483, 1494, 1553, 1577, 1740, 1963, 1981]
    
            //UDP端口的找寻 同上
            System.out.println(SocketUtils.findAvailableUdpPort()); //12007
        }
    

    其长度都是16个bit,所以端口号范围是0到(2^16-1),即 0到 65535。其中0到1023是IANA规定的系统端口,即系统保留窗口。例如HTTP为80端口,DNS服务为53端口。下面列出常用tcp和udp重要协议端口号,供以参考

    在这里插入图片描述
    在这里插入图片描述
    另外说明:TCP、UDP可以绑定同一端口来进行通信。每个端口都拥有一个叫端口号(port number)的整数型标识符,用于区别不同端口。由于TCP/IP传输层的两个协议TCP和UDP是完全独立的两个软件模块,因此各自的端口号也相互独立,如TCP有一个255号端口,UDP也可以有一个255号端口,二者并不冲突。

    StringUtils

    Spring提供的字符串处理类。再结合Apache提供的,绝对的够用了。因此平时code过程中,绝对禁止程序员再自定义StringUtils工具类

    Spring为了最依赖原则,自己实现了一个StringUtils,这里分类进行介绍:

    判断类

    属于该类别的方法都是在对字符串进行一些判定操作:

       //判断类:
        // boolean isEmpty(Object str):字符串是否为空或者空字符串:""
        // boolean hasLength(CharSequence str):字符串是否为空,或者长度为0
        // boolean hasText(String str):字符串是否有内容(不为空,且不全为空格)
        assertFalse(StringUtils.hasText("   "));
        // boolean containsWhitespace(String str):字符串是否包含空格
        assertTrue(StringUtils.containsWhitespace("a b"));
    
    字符串头尾操作

    都是对字符串前,或者字符串后的内容进行判定或者操作

    //字符串头尾操作
    // String trimWhitespace(String str):去掉字符串前后的空格
    assertEquals("abc", StringUtils.trimWhitespace(" abc "));
    // String trimAllWhitespace(String str):去掉字符串中所有的空格
    assertEquals("abc", StringUtils.trimAllWhitespace(" a b c "));
    // String trimLeadingWhitespace(String str):去掉字符串开头的空格
    // String trimTrailingWhitespace(String str):去掉字符串结束的空格
    
    // String trimLeadingCharacter(String str, char leadingCharacter):去掉字符串开头的指定字符;
    // String trimTrailingCharacter(String str, char trailingCharacter):去掉字符串结尾的指定字符;
    
    // boolean startsWithIgnoreCase(String str, String prefix):
    // 判断字符串是否以指定字符串开头,忽略大小写
    assertTrue(StringUtils.startsWithIgnoreCase("abcd", "AB"));
    // boolean endsWithIgnoreCase(String str, String suffix):
    // 判断字符串是否以指定字符串结尾,忽略大小写
    
    文件路径名称相关操作(非常重要)

    文件路径名称相关操作,是针对文件名,文件路径,文件后缀等常见文件操作中需要用到的方法进行封装;

    // String unqualify(String qualifiedName):
    // 得到以.分割的最后一个值,可以非常方便的获取类似类名或者文件后缀
    assertEquals("java", StringUtils.unqualify("cn.wolfcode.java"));
    assertEquals("java", StringUtils.unqualify("cn/wolfcode/Hello.java"));
    
    // String unqualify(String qualifiedName, char separator):
    // 得到以给定字符分割的最后一个值,可以非常方便的获取类似文件名
    assertEquals("Hello.java", StringUtils.unqualify("cn/wolfcode/Hello.java", File.separatorChar));
    
    // String capitalize(String str):首字母大写
    assertEquals("Wolfcode", StringUtils.capitalize("wolfcode"));
    // String uncapitalize(String str):取消首字母大写(首字母小写)
    assertEquals("java", StringUtils.uncapitalize("Java"));
    
    // String getFilename(String path):获取文件名,就不需要再使用FilenameUtils
    assertEquals("myfile.txt",StringUtils.getFilename("mypath/myfile.txt"));
    // String getFilenameExtension(String path):获取文件后缀名
    assertEquals("txt",StringUtils.getFilenameExtension("mypath/myfile.txt"));
    // String stripFilenameExtension(String path):截取掉文件路径后缀
    assertEquals("mypath/myfile", StringUtils.stripFilenameExtension("mypath/myfile.txt"));
    
    // String applyRelativePath(String path, String relativePath):
    // 找到给定的文件,和另一个相对路径的文件,返回第二个文件的全路径
    // 打印:d:/java/wolfcode/other/Some.java
    System.out.println(StringUtils.applyRelativePath("d:/java/wolfcode/Test.java", "other/Some.java"));
    // 但是不支持重新定位绝对路径和上级目录等复杂一些的相对路径写法:
    // 仍然打印:d:/java/wolfcode/../other/Some.java
    System.out.println(StringUtils.applyRelativePath("d:/java/wolfcode/Test.java", "../other/Some.java"));
    
    // String cleanPath(String path): =====这个方法非常的重要
    // 清理文件路径,这个方法配合applyRelativePath就可以计算一些简单的相对路径了
    // 打印:d:/java/other/Some.java
    System.out.println(StringUtils.cleanPath("d:/java/wolfcode/../other/Some.java"));
    // 需求:获取d:/java/wolfcode/Test.java相对路径为../../other/Some.java的文件全路径:
    // 打印:d:/other/Some.java
    System.out.println(StringUtils.cleanPath(StringUtils.applyRelativePath( "d:/java/wolfcode/Test.java", "../../other/Some.java")));
    
    // boolean pathEquals(String path1, String path2):
    // 判断两个文件路径是否相同,会先执行cleanPath之后再比较
    assertTrue(StringUtils.pathEquals("d:/wolfcode.txt","d:/somefile/../wolfcode.txt"));
    
    字符串和子串的操作

    该组方法中主要是提供了字符串和字符串子串的操作,比如子串的匹配,子串的替换;子串的删除等等操作;

    // boolean substringMatch(CharSequence str, int index, CharSequence
    // substring):判断从指定索引开始,是否匹配子字符串
    assertTrue(StringUtils.substringMatch("aabbccdd", 1, "abb"));
    
    // int countOccurrencesOf(String str, String sub):判断子字符串在字符串中出现的次数
    assertEquals(4, StringUtils.countOccurrencesOf("ababaabab", "ab"));
    
    // String replace(String inString, String oldPattern, String
    // newPattern):在字符串中使用子字符串替换
    assertEquals("cdcdacdcd", StringUtils.replace("ababaabab", "ab", "cd"));
    
    // String delete(String inString, String pattern):删除所有匹配的子字符串;
    assertEquals("a", StringUtils.delete("ababaabab", "ab"));
    
    // String deleteAny(String inString, String charsToDelete):删除子字符串中任意出现的字符
    assertEquals("", StringUtils.deleteAny("ababaabab", "bar"));
    
    // String quote(String str) :在字符串前后增加单引号,比较适合在日志时候使用;
    assertEquals("'hello'", StringUtils.quote("hello"));
    
    和Locale相关的一些字符串操作
    // Locale parseLocaleString(String localeString):
    // 从本地化字符串中解析出本地化信息,相当于Locale.toString()的逆向方法
    assertEquals(Locale.CHINA, StringUtils.parseLocaleString("zh_CN"));
    
    // @deprecated as of 5.0.4, in favor of {@link Locale#toLanguageTag()}
    // String toLanguageTag(Locale locale):把Locale转化成HTTP中Accept-Language能接受的本地化标准;
    // 比如标准的本地化字符串为:zh_CN,更改为zh-CN
    System.out.println(StringUtils.toLanguageTag(StringUtils.parseLocaleString("zh_CN")));
    
    字符串和Properties

    把字符串和Properties对象之间的相互转化抽取出的一些常用方法

    //Properties splitArrayElementsIntoProperties(String[] array, String delimiter):
    // 把字符串数组中的每一个字符串按照给定的分隔符装配到一个Properties中
    String[] strs=new String[]{"key:value","key2:中文"};
    Properties ps=StringUtils.splitArrayElementsIntoProperties(strs, ":");
    //打印输出:{key=value, key2=中文}
    System.out.println(ps);
    
    //Properties splitArrayElementsIntoProperties(String[] array, String delimiter, String charsToDelete)
    //把字符串数组中的每一个字符串按照给定的分隔符装配到一个Properties中,并删除指定字符串,比如括号之类的;
    
    字符串和数组之间的基本操作(重要)

    该组方法主要是完成字符串和字符串数组之间的基本操作,比如追加,删除,排序等

    // String[] addStringToArray(String[] array, String str):把一个字符串添加到一个字符串数组中
    // 打印:[a, b, c, d]
    System.out.println(Arrays.toString(StringUtils
            .addStringToArray(new String[] { "a", "b", "c" }, "d")));
    
    // String[] concatenateStringArrays(String[] array1, String[]array2):连接两个字符串数组
    //打印:[a, b, c, a, b, c, d]
    System.out.println(Arrays.toString(StringUtils.concatenateStringArrays(
            new String[] { "a", "b", "c" },
            new String[] { "a", "b", "c","d" })));
    
    //String[] mergeStringArrays(String[] array1, String[] array2):连接两个字符串数组,去掉重复元素
    //打印:[a, b, c, d]
    System.out.println(Arrays.toString(StringUtils.mergeStringArrays(
            new String[] { "a", "b", "c" },
            new String[] { "a", "b", "c","d" })));
    
    //String[] sortStringArray(String[] array):字符串数组排序
    //打印:[a, b, c, d]
    System.out.println(Arrays.toString(StringUtils.sortStringArray(new String[]{"d","c","b","a"})));
    
    //String[] toStringArray(Collection<String> collection):把字符串集合变成字符串数组
    //String[] toStringArray(Enumeration<String> enumeration):把字符串枚举类型变成字符串数组
    //String[] trimArrayElements(String[] array):把字符串数组中所有字符串执行trim功能;
    //String[] removeDuplicateStrings(String[] array):去掉给定字符串数组中重复的元素,能保持原顺序;
    

    另外还有关于字符串和数组还有更多的方法:

    //String[] split(String toSplit, String delimiter):按照指定字符串分割字符串;
    assertArrayEquals(new String[]{"wolfcode","cn"}, StringUtils.split("wolfcode.cn", "."));
    //只分割第一次,打印:[www, wolfcode.cn]
    System.out.println(Arrays.toString(StringUtils.split("www.wolfcode.cn", ".")));
    
    
    //String[] tokenizeToStringArray(String str, String delimiters)
    //会对每一个元素执行trim操作,并去掉空字符串
    //使用的是StringTokenizer完成,
    //打印[b, c, d]
    System.out.println(Arrays.toString(StringUtils.tokenizeToStringArray("aa,ba,ca,da", "a,")));
    //String[] tokenizeToStringArray(String str, String delimiters, boolean trimTokens, boolean ignoreEmptyTokens)
    //后面两个参数在限定是否对每一个元素执行trim操作,是否去掉空字符串
    
    //String[] delimitedListToStringArray(String str, String delimiter):分割字符串,会把delimiter作为整体分隔符
    //打印:[a, b, c, da]
    System.out.println(Arrays.toString(StringUtils.delimitedListToStringArray("aa,ba,ca,da", "a,")));
    //String[] delimitedListToStringArray(String str, String delimiter, String charsToDelete)
    //分割字符串,会把delimiter作为整体分隔符,增加一个要从分割字符串中删除的字符;
    
    //String[] commaDelimitedListToStringArray(String str):使用逗号分割字符串
    //是delimitedListToStringArray(str, ",")的简单方法
    
    //Set<String> commaDelimitedListToSet(String str):使用逗号分割字符串,并放到set中去重
    //使用LinkedHashSet;
    
    //String collectionToDelimitedString(Collection<?> coll, String delim, String prefix, String suffix)
    //将一个集合中的元素,使用前缀,后缀,分隔符拼装一个字符串,前缀后后缀是针对每一个字符串的
    String[] arrs=new String[]{"aa","bb","cc","dd"};
    assertEquals("{aa},{bb},{cc},{dd}", StringUtils.collectionToDelimitedString(Arrays.asList(arrs),",","{","}"));
    
    //String collectionToDelimitedString(Collection<?> coll, String delim):集合变成指定字符串连接的字符串;
    //是collectionToDelimitedString(coll, delim, "", "")的简写;
    //String collectionToCommaDelimitedString(Collection<?> coll):集合变成逗号连接的字符串;
    //是collectionToDelimitedString(coll, ",");的简写;
    
    //String arrayToDelimitedString(Object[] arr, String delim):数组使用指定字符串连接;
    //String arrayToCommaDelimitedString(Object[] arr):使用逗号连接数组,拼成字符串;
    

    StringUtils类中的方法其实真的还是很多,可能平时我们用的比较多的还是一些普通的方法,其实类似文件路径,文件名等相关操作,以前还会专门引入common-io的FilenameUtils等额外的工具类,原来在StringUtils中都有,而且根据其设计的这些方法,我们也能大概的猜出一些方法在Spring中哪些地方可能有用;最后,其中有些方法,还是非常常见的面试题,比如替换字符串,查询子串个数等

    SystemPropertyUtils 占位符解析工具类

    该类依赖于上面已经说到的PropertyPlaceholderHelper来处理。本类只处理系统默认属性值哦~

    该工具类很简单,但是非常的使用。可以很好的利用起来,Spring内部也有非常之多的使用。

    在平时的程序开发中,我们也经常会遇到一些痛点,比如规则引擎(公式):A=${B}+${C}+1,这样我们只需要得到B和C的值,然后再放入公式计算即可

    占位符在Spring、Tomcat、Maven里都有大量的使用。下面用简单的例子体验一把:

    public static String resolvePlaceholders(String text);
    
    //如果标志位为true,则没有默认值的无法解析的占位符将保留原样不被解析 默认为false
    public static String resolvePlaceholders(String text, boolean ignoreUnresolvablePlaceholders);
    

    例子:

        public static void main(String[] args) {
            System.out.println(SystemPropertyUtils.resolvePlaceholders("${os.name}/logs/app.log")); //Windows 10/logs/app.log
    
            //备注:这里如果不传true,如果找不到app.root这个key就会报错哦。传true后找不到也原样输出
            System.out.println(SystemPropertyUtils.resolvePlaceholders("${app.root}/logs/app.log", true)); //${app.root}/logs/app.log
        }
    

    另外,org.springframework.core.io.support.PropertiesLoaderUtils也是Spring提供的加载.properties配置文件的重要工具类之一~


    关注A哥

    Author A哥(YourBatman)
    个人站点 www.yourbatman.cn
    E-mail yourbatman@qq.com
    微 信 fsx641385712
    活跃平台
    公众号 BAT的乌托邦(ID:BAT-utopia)
    知识星球 BAT的乌托邦
    每日文章推荐 每日文章推荐

    BAT的乌托邦

    展开全文
  • 工具

    2020-05-08 23:53:11
    别的文献管理工具:zotero/mendeley wb(tongtongjie)主页搜关键字EndNote有演示视频 (3)思维导图 幕布/Xmind (4)Typora(MarkDown编辑器) 使用方法:直接打开界面,选择主题栏的“段落”和“主题”,就能得到...

    (1)EndNote
    可管理文献、在线查找下载文献、快速插入文献
    别的文献管理工具:zotero/mendeley

    wb(tongtongjie)主页搜关键字EndNote有演示视频

    (2)思维导图
    幕布/Xmind

    (3)Typora(MarkDown编辑器)
    使用方法:直接打开界面,选择主题栏的“段落”和“主题”,就能得到自己想要的排版效果,想学习MarkDown简单语法,可在wb(tongtongjie)置顶找“MarkDown新手指南”功课。

    展开全文
  • 程序员常用的工具软件

    千次阅读 2018-12-25 19:00:48
    工具类 Postman Restlet Client FeHelper [Web前端助手] Set Character Encoding Momentum Visual Studio Code Github客户端 ​Navicat ​xshell ​有道云笔记 Tower Source Insight 4.0 ​工具类 ...
  • 常用的几款抓包工具

    万次阅读 多人点赞 2019-06-05 08:28:50
    常用的几款抓包工具! 标签: 软件测试软件测试方法软件测试学习 原创来自于我们的微信公众号:软件测试大师 最近很多同学,说面试的时候被问道,有没有用过什么抓包工具,其实抓包工具并没有什么很难的工具,只要...
  • DirectX修复工具增强版

    万次阅读 多人点赞 2012-02-09 13:26:54
    DirectX修复工具最新版:DirectX Repair V3.9 增强版NEW! 版本号:V3.9.0.29371 大小: 111MB/7z格式压缩,196MB/zip格式压缩,345MB/解压后 其他版本:标准版 在线修复版 MD5校验码: DirectX Repair.exe/eeab...
  • DirectX修复工具

    万次阅读 多人点赞 2011-11-12 11:10:55
    最后更新:2019-9-5 For English version, ...DirectX修复工具最新版:DirectX Repair V3.9 标准版NEW! 版本号:V3.9.0.29371 大小: 30.7MB/7z格式压缩,98.7MB/zip格式压缩 ,231MB/解压后 其他版本:增强版 在...
  • DirectX修复工具在线修复版

    万次阅读 多人点赞 2012-03-26 20:23:47
    DirectX修复工具最新版:DirectX Repair V3.9 在线修复版NEW! 版本号:V3.9.0.29371 大小: 971KB/7z格式压缩,2.63MB/ZIP格式压缩,5.62MB/解压后 其他版本:标准版增强版 MD5校验码(校验工具下载): ...
  • DirectX修复工具V4.0公测!

    万次阅读 多人点赞 2019-07-28 12:46:41
    DirectX修复工具V3.9版已经正式发布了!还是像原来一样,共提供三个版本以供不同用户进行选择,请直达链接下载:标准版,增强版,在线修复版。 以下的公测说明已经失效,仅供参考。 -------------------------...
  • DirectX修复工具 V3.2增强 绿色版

    万次下载 热门讨论 2014-07-01 10:06:43
    DirectX修复工具 DirectX Repair 是一款系统级工具软件 简便易用 本程序为绿色版 无需安装 可直接运行 本程序的主要功能是检测当前系统的DirectX状态 如果发现异常则进行修复 程序主要针对0xc000007b问题设计 ...
  • DirectX修复工具 V3.0 官方绿色增强版

    万次下载 热门讨论 2013-09-21 12:03:30
    DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题...
  • DirectX修复工具 V3.3标准 绿色版

    万次下载 热门讨论 2015-05-03 09:43:18
    DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题...
  • DirectX修复工具最新版:DirectX Repair V3.7 增强版 NEW! 版本号:V3.7.0.26539 大小: 107MB/7z格式压缩,189MB/zip格式压缩,322MB/解压后 其他版本:标准版 在线修复版 MD5校验码:DirectX Repair.exe/...
  • DirectX修复工具V3.8增强版

    千次下载 热门讨论 2018-12-15 14:07:52
    DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题...
  • DirectX修复工具 V3.0标准版

    千次下载 热门讨论 2013-09-26 20:20:15
    DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题...
  • DirectX修复工具强力修复实验包

    万次阅读 2018-02-16 19:57:48
    DirectX修复工具API Sets强力修复实验包下载地址: https://pan.baidu.com/s/1viLPeKp8vtFCy8Pr1S9CWw 密码:5d6n 实验包使用说明: 1、实验包仅支持DirectX修复工具V3.6.6版及以上版本。 2、首先将上述下载...
  • DirectX修复工具V3.7增强版

    千次下载 热门讨论 2018-04-21 17:48:57
    DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题...
  • DirectX修复工具 V3.5在线修复 绿色版 免安装版

    千次下载 热门讨论 2016-06-25 22:57:10
    DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题...
  • 大家应该对DirectX修复工具并不陌生,该工具主要就是为了解决0xc000007b问题而设计的(如果之前不知道这个工具的,可以参看DirectX修复工具增强版介绍)。然而,近日接连出现很多用户连DirectX修复工具也打不开,...
  • DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题...
  • DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题...
  • DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题...
  • DirectX修复工具(DirectX Repair)是一款系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。 本程序的主要功能是检测当前系统的DirectX状态,如果发现异常则进行修复。程序主要针对0xc000007b问题...
  • DirectX修复工具最新版:DirectX Repair V3.7 增强版&nbsp;&nbsp;NEW!版本号:V3.7.0.26539大小: 107MB/7z格式压缩,189MB/zip格式压缩,322MB/解压后其他版本:标准版 &nbsp; &...
  • DirectX修复工具V1.0

    千次下载 热门讨论 2011-11-21 12:01:08
    DirectX修复工具(DirectX repair)是一款完全由本人自主开发的系统级工具软件,简便易用。本程序为绿色版,无需安装,可直接运行。资源中的技术文档包含程序的部分源代码,以供编程爱好者交流。 本程序适用于多个...
  •  近日接连接到一些用户的反馈,说他们在使用DirectX修复工具的时候,所有文件的状态均为修复失败或者下载失败(如下图)。虽然他们使用的是标准版或增强版而非在线修复版,程序还是会尝试下载需要的DirectX组件。 ...
  • Directx修复工具

    2018-10-24 20:58:01
    Directx修复工具自动修复

空空如也

1 2 3 4 5 ... 20
收藏数 5,147,068
精华内容 2,058,827
关键字:

工具