Maven构建工具
- Maven仓库搜索jar包
- 优点:第三方库很强大,要学会在巨人肩膀上工作
- 缺点:搜索,确定版本,下载jar包,工作量大且不易
- 在Maven仓库搜索jar包,添加到pom.xml,右键项目-run as-build,run as即可。
Maven概念和实战
- Maven是一个构建工具,自动下载中心仓库的jar文件,可以更改为aliyun镜像,编译测试运行和打包发布Java项目
- 对于某一个第三方软件的版本,本地.m2仓库只需存储一个拷贝,却可以为多个Maven项目提供编译和运行支持
- Pom.xml: 包含了项目信息、依赖信息、构建信息
- 其中构件信息包括组织groupId,artifactId,version
单元测试
- 软件测试的经典定义是:在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。
- 软件测试分类:单元vs集成测试,白盒vs黑盒测试,自动vs手动测试,回归测试,压力测试
- 单元测试,是指对软件中的最小可测试单元进行检查和验证。通常是一个函数/方法。
- 单元测试是已知代码结构进行的测试,属于白盒测试。
- 集成测试是将多个单元相互作用,形成一个整体,对整体协调性进行测试。
- 一般从构成系统的最小单元开始,持续推进到单元之间的接口直到集成为一个完成的软件系统为止。
- 白盒测试,全面了解程序内部逻辑结构,对所有的逻辑路径都进行测试。一般由程序员完成。
- 黑盒测试,又名功能测试,将程序视为一个不能打开的黑盒子。在完全不考虑程序内部结构和内部特性的情况下,检查程序功能是否按照需求规格说明书的规定正常使用。一般由独立的使用者完成。
- 自动测试:用程序批量、反复测试程序,并可自动检查程序结果是否满足预定的要求。
- 手动测试:手动执行程序,手动输入所需要的参数,手动检查程序结果是否满足预定的要求。
- 回归测试:修改旧代码后,重新进行测试以确定修改没有引入新的错误或导致其他代码产生错误。
- 回归测试在整个软件测试过程中占有很大的比重。软件快速迭代开发过程中,新版本的连续发布使得回归测试进行的更加频繁。
- 测试策略:基于main函数的策略,优点:简单,缺点“无法自动判断被测对象的行为是否符合预期,main方法需要添加大量的代码,这些代码在发布时候也需要手动删除,分散程序员在开发时的关注点。
- 基于自动化测试框架的策略:初始化,输入测试数据执行被测试代码,获取系统实际结果,比较结果是否一致,得出结论。
- JUnit是一个Java语言的单元测试框架。
JUnit
- 导入依赖,进行JUnit测试。
Java字符编码
- 字符编码:字符:0,a;计算机只用0和1,1bit;ASCII码:美国信息交换标准代码,奠定计算机编码基础;用一个字节来存储a-z,A-Z,0-9和一些常用符号;用于显式英语和西欧语言;回车键(13,00001101)
- 字符编码:ASCII编码采用1Byte,8bits,最多256个字符;ASCII无法适应其他地方,如汉字数量有十几万;扩展编码(加字节),Unicode编码。
- 中文编码:GB2312,GBK,GB18030,Big 5,GB18030>GBK>GB2312
- 字符集:包括哪些字符元素
- 编码:每个字符元素用多少号码(0和1的组合)来表示。
- Unicode字符集,目标:不断扩充,存储全世界所有的字符。
- 编码方案,utf-8兼容ASCII,变长(1-4个字节存储字符),经济,方便传输;utf-16,用变长来存储所有字符,utf-32,用32bits来存储所有字符。
- ANSI编码:记事本默认的编码。
- 源文件编码:采用UTF-8编码。
- 程序内部采用UTF-16编码存储所有字符
- 和外界(文本文件)的输入输出尽量采用UTF-8编码,不能使用一种编码写入,换另外一种编码读取。
Java国际化编程
- i18n:多语言版本的软件,一套软件,多个语言包;根据语言设定,可以切换显式文本。
- Java是第一个设计成支持国际化的编程语言。ResourceBundle包和Locale包
- 语言文件:一个Properties文件,包含K-V对,每行一个K-V
- 语言文件:存储文件必须是ASCII码文件,如果是ASCII以外的文自,必须用Unicode的表示\uxxxx,可以采用native2ascii.exe进行转码
Java高级字符串处理
- 正则表达式:识别一个字符串满足一定的规律
- 规则表达式,计算机科学的一个基础概念,用事先定义好的一些特定字符、及这些特定字符的组合,组成一个规则字符串
- 1+$,代表着一个字符串,只能由26英文字母组成
- 作用:测试字符串内的模式,识别/替换文本。提取文本
- 正则表达式独立于特定语言,匹配模板是定界符,原子,特殊功能字符(元字符),模式修政符
- 其他字符串操作:字符串和集合互转;字符串转义对关键字符转义;变量名字格式化,名字驼峰命名;字符串输入流,将字符串转为一个输入流,输入流可以定义为Scanner,这是Online Judge的实现原理。
- String.join仅支持字符串,StringUtils支持更多元素的链接
XML简介
- 数据是主体,但是单独的数据含义模糊,数据加含义,适用于传输数据,而不是显示数据HTML
- XML(eXtensible Markup Language)
- 可扩展标记语言:意义+数据
- 标签可自行定义,具有自我描述性
- 纯文本表示,跨系统/平台/语言
- W3C标准,包括几乎所有的Unicode字符
- 常规语法:任何的起始标签都必须有一个结束标签;简化写法,例如可以写成.大小写敏感,如和不一样;每个文件都要有一个根元素。标签必须按合适的顺序进行嵌套,不可错位;所有的特性都必须有值,且在值的周围加上引号。需要转义字符,如’<'需要用<代替。注释:
- XML拓展:DTD定义XML文档的结构,使用一系列合法的元素来定义文档结构,可嵌套在xml文档中,或者在xml中引用。
- XML Schema:定义XML文档的结构,DTD的继任者,支持数据类型,可扩展,功能更完善、强大;采用xml编写
- XSL:扩展样式表语言,XSL作用于XML,等同于CSS作用于HTML,内容XSLT转换XML文档,XPath在XML文档中导航,XSL-FO,格式化XML文档
- XML解析方法:树结构,DOM:文档对象模型,擅长小规模读/写;流结构:流机制解释器(推模式),擅长读;Stax流机制解释器(拉模式),擅长读
- DOM处理方法:W3C推荐的标准API,直观易用;其处理方式是将XML整个作为类似树结构的方式读入内存中以便操作及解析,方便修改。
- 解析大数据量的XML文件,会遇到内存泄漏及程序崩溃的风险
- SAX:Simple API for XML采用事件/流模型来解析XML文档,更快速、更轻量;不像DOM加载整个文档,内存要求较低。SAX对XML文档的解析为一次性读取,不创建/不存储文档对象,很难同时访问文档中的多处数据;推模型。当它每发现一个节点就引起一个事件,而我们需要编写这些事件的处理程序。关键类:DefaultHandler
- Stax方法:流模型中的拉模型,在遍历文档时,会把感兴趣的部分从读取器中拉出,不需要引发事件,允许我们选择性地处理节点。这大大提高了灵活性,以及整体效率;两套处理API基于指针的API,基于迭代器的API。
JSON简介及特性
- JSON:JavaScript Object Notation,JS对象表示法;是一种轻量级的数据交换格式;类似XML,更小、更快更易解析;最早用于Javascript中,容易解析,最后推广到全语言,尽管使用Javascript语法,但是独立于编程语言。
- 名称/值对:JSON对象:{”name“:};数据在键值对中;数据由逗号分隔;花括号保存对象。
- JSON数组:方括号保存数组
- org.json: JSON官方推荐的解析类:简单易用,通用性强,复杂功能欠缺。
- GSON:Google出品,基于发射,可以实现Json对象,json字符串和Java对象互转。
- Jackson:号称最快的JSON处理器,简单易用,社区更新和发布速度比较快。
- JSON主要用途:数据交换,生成,解析,校验,和JAVA Bean对象进行互解析,具有一个无参的构造函数,可以包括多个属性,所有属性都是private,每个属性都有相应的Getter/Setter方法,JavaBean用于封装数据,又可成为POJO(Plain Old Java Object)
图形图像简介及解析
- 图形图像基本概念:图形Graph,矢量图,根据几何特性来画,比如点,直线弧线等。
- 图像:Image,由像素点组成,格式:jpg,png,bmp,svg,wmf,gif,tiff。颜色:RGB(Red,Green,Blue)
- 图形Graph,awt包,2D库,Color,Stroke。
- 图像:Image,javax.imageio包,ImageIO,BufferedImage。
- Java原生支持jpg,png,bmp,wbmp,gif
- javax.imageio,ImageIO,自动封装多种ImageReader,ImageWriter,读写图像文件,read读取图片
- java.awt.image.BufferedImage图像在内存中的表示类,getHeight获取高度,getWidth获取宽度,图像文件读写截取合并。
- 验证码生成:一个图片文件,外框,底色,干扰线,字母
条形码和二维码
- 条形码:将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。通常代表一串数字/字幕,每一位有特殊含义,一般数据容量30个数字/字幕,专门的机构管理:中国物品编码中心。
- 二维码:用某种特定的几何图形按一定规律在平面(二位方向上)分布的黑白相间的图形记录数据符号信息;比一维条形码能存更多信息,表示更多数据类型;能够存储数字/字母/汉字/图片等信息;字符集128个字符/可存储几百到几十KB字符/抗损坏
- Zxing,Google出品,支持1D和2D的Barcode,主要类:BitMatrix位图矩阵,MultiFormatWriter位图编写器,MatrixToImageWriter写入图片
Docx简介和解析
- docx为主要研究对象,文字样式,表格,图片,公式。
- 常见功能:docx解析,docx生成
- 第三方库:Jacob,COM4J;POI,docx4j,OpenOffice/Libre Office SDK;Apose;OpenXML
Xlsx(Excel)解析
- 与word类似,分为xls和xlsx,xlsx以XML为标准为主要研究对象,数据-sheet,行列,单元格
- CSV文件:全程Comma-Seperated Values文件,逗号分隔,广义CSV文件,可以由空格/Tab键/分号/···/完成字段分隔
PDF简介与解析
- 便携式文档格式,字型嵌入系统可使字型随文件一起传输;结构化的存储系统,绑定元素和任何相关内容到单个文件,带有适当的数据压缩系统。一般版本是1.4+
- 常见功能处理:解析PDF,生成PDF转化,第三方包PDFBox,iText,XDocReport
多进程和多线程简介
- 当前的操作系统都是多任务OS
- 每个独立执行的任务就是一个进程
- OS将时间划分为多个时间片(时间很短
- 每个时间片内将CPU分配给某一个任务,时间片结束,CPU将自动回收,再分配给另外任务。从外部看,所有任务都是同时在执行。但是在CPU上,任务是按照串行依次运行(单核CPU)。如果是多核,多个进程任务可以并行。但是单个核上,多进程只能串行执行。
- 多进程的优点:可以同时运行多个任务;程序因IO堵塞时,可以释放CPU,让CPU为其他程序服务;当系统有多个CPU时,可以为多个程序同时服务;
- 多进程的缺点:太笨重,不好管理;太笨重,不好切换;
- 多线程概念:一个程序可以包括多个子任务,可串/并行;每个子任务可以称为一个线程;如果一个子任务阻塞,程序可以将CPU调度另外一个子任务进行工作。这样CPU还是保留在本程序中,而不是被调度到别的程序(进程)去。这样,提高本程序所获得CPU时间和利用率。
- 多进程vs多线程:线程共享数据;线程通讯更高校;线程更轻量级,更容易切换;多个线程更容易管理。
java多线程实现
- 继承java.lang.Thread,或实现java.lang.Runnable接口来实现run方法,
- 启动:start方法,会自动以新进程调用run方法;直接调用run方法,将变成串行执行;同一个线程,多次start会报错,只执行第一次start方法;多个线程启动,其启动的先后顺序是随机的;线程无需关闭,只要其run方法执行结束后,自动关闭;main函数(线程)可能早于新线程结束,整个程序并不终止;整个程序终止是等所有的线程都终止(包括main函数线程),底层使用JNI实现.
- 哪个先后执行看的是jvm
- Thread占据了父类的名额,不如Runnable方便,Thread类实现Runnable,Runnable启动时需要Thread类的支持;Runnable更容易实现多线程中资源共享
java多线程信息共享
- 线程类:通过继承Thread或实现Runnable;通过start方法,调用run方法,run方法工作;线程run结束后,线程退出。
- 粗粒度:子线程与子线程之间,和main线程之间缺乏交流。
- 细粒度:线程之间有信息交流通讯:通过共享变量达到线程共享;类似MPI并行库直接发送消息。
- MPI是一个信息传递应用程序接口,包括协议和语义说明;MPI的目标是高性能,大规模性,和可移植性;MPI在今天仍为高性能计算的主要模型
- 通过共享变量在多个线程中共享消息:static变量,同一个Runnable类的成员变量
- 多线程信息共享问题:工作缓存副本;关键步骤缺乏加锁限制
- i++并非原子性操作:读取贮存i到工作缓存副本中,每个cpu执行副本i+1操作;cpu将结果写入到缓存副本中,数据从工作缓存刷到主存中。
- 变量副本问题的解决方法:采用volatile关键字修饰变量;保证不同线程对共享变量操作时的可见性。
- 关键步骤加锁限制:互斥:某一个线程运行一个代码段(关键区),其他线程不能同时运行这个代码段;同步:多个线程的运行,必须按照某一种规定的先后顺序来运行;互斥是同步的一种特例;
- 互斥的关键字是synchronized:synchronized代码块函数,只能一个线程进入;synchronized加大性能负担,但是使用简便。
多线程管理
- 线程类:通过继承Thread或实现Runnable;通过start方法,调用run方法,run方法工作;线程run结束后,线程退出;
- 粗粒度:子线程与子线程之间,和main线程之间缺乏同步;
- 细粒度:线程之间有同步协作,等待,通知/唤醒,终止
- 线程状态:-NEW刚创建,-RUNNABLE就绪态,RUNNING运行态,BLOCK阻塞态,THREMINATED结束态
- Thread的部分API已经废弃,暂停和恢复suspend/resume,消亡:stop/destroy
- 线程阻塞/和唤醒:sleep,时间一到,自己会醒来;wait/notify/notifyAll,等待,需要别人来唤醒;join,等待另外一个线程结束;interrupt,向另外一个线程发送中断信号,该线程收到信号,会触发InterruptedException(可解除阻塞),并进行下一步处理。
- 线程被动地暂停和终止:依靠别的线程来拯救自己;没有及时释放资源
- 线程主动暂停和终止:定期检测共享变量;如果需要暂停或者终止,先释放资源,再主动动作;暂停Thread.sleep(),休眠;终止:run方法结束,线程终止。
- 多线程死锁:每个线程互相持有别人需要的锁;预防死锁,对资源进行等级排序
- 守护(后台)线程:普通线程结束,是run方法运行结束;守护线程的结束,是run方法运行结束,或main函数结束;守护线程永远不要访问资源,如文件或数据库
- 线程查看工具jvisualvm
网络基础知识
- 每个网卡上有全球唯一单独的硬件地址,MAC地址
- IP地址:每个网卡/机器都有一个或多个IP地址。
- IPV4:192.168.0.100,每段从0到255
- IPV6:128bit长,分成8段,每段4个16进制数
- port:端口0-65535,-0到1023OS已经占用了,80是Web,23是telnet;-1024到65535,一般程序可使用(谨防冲突)
- 两台机器通讯就是在IP+Port上进行的
- 保留ip:127.0.0.1本机
- 公网(万维网/互联网)和内网(局域网):网络是分层的,最外层是公网/互联网,底下的每层都是内网;ip地址可以在每个层次的网重用;tracert看当前机器和目标机器的访问中继。
- 通讯协议:TCP和UDP,TCP是传输控制协议,面向连接的协议;两台机器的可靠无差错的数据传输;双向字节流传递。
- UDP是用户数据报协议,面向无连接协议,不保证可靠的数据传输,速度快,也可也在较差的网络下使用
- QQ是以UDP协议为主的。
Java UDP编程
- 计算机通讯:数据从1个IP的port出发(发送方),运输到另外一个IP的port(接受方)
- UDP:无连接无状态的通讯协议,发送方发送消息,如果接收方刚好在目的地,则可以接受。如果不再,那这个消息就丢失了;发送方也无法得知是否发送成功。UDP的好处就是简单,节省,经济。
- DatagramSocket:通讯的数据管道,send和receive方法,绑定一个IP和Port
- DatagramPacket:集装箱:封装数据;地址标签:目的地IP+Port
- 实例:无主次之分,接受方必须早于发起方执行。
Java TCP编程
- TCP协议:有链接、保证可靠的无误差通讯分为以下部分
- 服务器创建一个ServerSocket,等待连接
- 客户机创建一个Socket,连接到服务器
- 服务器ServerSocket接收到连接,创建一个Socket和客户的Socket建立专线连接,后续服务器和客户机的对话(这一对Socket)会在一个单独的线程(服务器端上)运行
- 服务器的ServerSocket继续等待连接,返回第一步。
- ServerSocket:服务器码头,需要绑定port,如果有多块网卡,需要绑定一个IP地址
- Socket:运输通道,客户端需要绑定服务器的地址和Port,客户端往Socket输入流写入数据,送到服务端;客户端从Socket输出流取服务器端过来的数据,服务端反之亦然。
- 服务端等待响应时,处于阻塞状态
- 服务端可以同时响应多个客户端
- 服务端每接受一个客户端,就启动一个独立的线程与之对应
- 客户端或者服务端都可以选择关闭这对Socket的通道
- 实例:服务端先启动且一直保留;客户端后启动,可以先退出
Java HTTP编程
- 网页是特殊的网络服务(HTTP)在浏览器输入URL地址,浏览器将连接到远程服务器上(IP+80port),请求下载一个HTML文件下来,放到本地临时文件夹中,在浏览器显式出来。
- HTTP访问方式:GET:从服务器获取资源到客户端;POST:从客户端向服务器发送数据;PUT:上传文件;DELETE:删除文件;HEAD:报文头部;OPTIONS:询问支持的方法;TRACE:追踪路径;CONNECT:用隧道协议连接代理
- JavaHTTP编程,支持模拟成浏览器的方式去访问网页
- URL,代表一个资源
- URLConnection表示获取资源的连接器;根据URL的openConnection()方法获得URLConnection,connect方法,建立和资源的联系通道;getInputStream方法,获取资源的内容
HttpClient
- 爬虫,自动刷票机器人,各类Web监控,Web测试
Java NIO 编程
- 传统的TCP和UDP通讯:Blocking I/O,简写BIO
- NIO与BIO相反,Non-Blocking I/O 提供非阻塞通讯等方式,避免同步I/O通讯效率过低,一个线程可以管理多个连接,减少线程多的压力
- NIO表示非阻塞IO,主要在nio包,主要类Buffer缓存区,Channel通道,Selector多路选择器
- Buffer缓冲区,一个可以读写的内存区域,ByteBuffer,CharBuffer,DoubleBuffer,IntBuffer,LongBuffer,ShortBuffer(StringBuffer不是)
- 四个重要属性,capacity容量,position读写位置,limit界限,mark标记,用于一个读/写操作
- Channel通道:全双工的,支持读/写(而Stream流是单向的);支持异步读写;和Buffer配合,提高效率;ServerSocketChannel服务器TCP Socket接入通道,接收客户端;SocketChannel TCP Socket通道,可支持阻塞/非阻塞通讯;DatagramChannel UDP通道;FileChannel文件通道
- Selector多路选择器:每隔一段时间,不断轮询注册在其中的Channel,如果有一个Channel有接入,读,写操作,就会被轮询出来;根据SelectionKey可以获取相应的Channel,进行后续IO操作;避免过多线程;SelectionKey四种类型:OP——CONNECT,OP_ACCEPT,OP_READ,OP_WRITE
java AIO编程
- 通讯的同步:是指客户端和服务端直接的通讯等待方式。这里的同步的反义词是异步,即无需等待另外一端操作完成。
- NIO属于同步通讯
- AIO属于异步IO,采用回调方法进行处理读写操作。主要类。
- 三张I/O的区别:BIO为阻塞,同步,简单,线程对比1:1,低;NIO为非阻塞,同步,较难,线程对比N:1,性能高;AIO为非阻塞,异步,困难,线程对比N:1,性能高
Netty编程
- 一个非阻塞的客户端-服务端网络通讯框架
- 基于异步事件驱动模型
- 简化Java的TCP和UDP编程
- 支持HTTP/2,SSL等协议,支持JSON
- 关键技术:通道和事件
- 事件:按照数据流向进行分类,入站事件: 连接激活/数据读取/;出站事件:打开到远程连接/写数据
- 事件处理:Channel通道发生数据或状态改变;EventLoop会将事件分类,并调用ChannelHandler的回调函数;程序员需要实现ChannelHandler内的回调函数;ChannelInboundHandler/ChannelOutboundHandler
- ChannelHandler工作模式:责任链。
- 责任链模式:将请求的接收者连成一条链;在链上传递请求,直到有一个接收者处理该请求;避免请求者和接收者的耦合。
- ChannelHandler可以有多个,依次进行调用;ChannelPipeline作为容器,承载多个ChannelHandler
- ByteBuf:强大的字节容器,提供丰富API进行操作。
邮件知识
- 邮件使用,注册一个电子邮件帐号
- Web邮件管理界面
- 邮件客户端软件(Outlook/Foxmail等)
- 邮件:一封信,包括发件人/收件人/文本/图片/附件等
- 邮件客户端,邮件服务端
- 通过SMTP服务器收存,通过POP3服务器发给王五
- 邮件客户端:Foxmail,OutLook,Thunderbird
- 邮件服务端:Microsoft Exchange Server,IBM,SendMail
- 主要协议(发送端口25,接收端口110)发送是SMTP,接受是POP3;接受也可也是IMAP如摘要浏览,选择下载附件,多文件夹,网络硬盘
- 邮件格式:RFC822邮件格式,邮件头,文字邮件正文;MIME图片/音频/视频等等
- 邮件编码:纯英文邮件,ASCII编码,7Bit;8Bit编码;BASE64,6个bit/Quoted-printable对每个ASCII字符用”=“加上这个字符的十六进制编码
- 邮件中继:通过别人的邮件服务器将你的邮件系统的邮件送到目标地址
- 垃圾邮件
- 邮件和邮件服务器的安全
- 邮件防火墙
Java可进行混合编程
基本没用。
A-Za-z ↩︎