![](https://img-blog.csdnimg.cn/20190919160818473.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java
田野上的风筝
混迹于bug世界中。
展开
-
java多线程实现生产者、消费者模式
简述生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向缓存区里生产数据,而消费者从缓存区里取出数据什么是生产者? 生产者指的是负责生产数据的模块。什么是消费者? 消费者指的是负责消费数据的模块。什么是缓冲区? 消费者不能直接使用生产者的数据,它们之间有个缓冲区。生产者将生产好的数据放入缓冲区,消费者从缓冲区取要处理的数据。注:上面的的模块指的可能是:方法、对象、线程等。缓冲区是实现并发协助的核心,设置缓...原创 2021-01-08 10:32:44 · 1706 阅读 · 1 评论 -
设计模式之建造者模式
简述建造者模式(又称生成器模式)使用多个简单的对象一步一步构建成一个复杂的对象。这种设计模式属于创建型模式,它提供了一种创建对象的最佳方式。一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。如在开发过程中需要创建一个复杂的对象(计算机对象),这个复杂对象由多个子部件按一定的步骤组合而成,计算机是由 CPU、主板、内存、硬盘、显卡、显示器、键盘等部件组装而成的,一般买电脑我们不会自己去组装计算机,而是将计算机的配置要求告诉销售,销售安排技术人员去组装计算机原创 2020-12-26 08:46:54 · 662 阅读 · 0 评论 -
设计模式之原型模式(java代码实现)
简述原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口(在java中实现Cloneable),,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。还有在spring中的bean的scope中就有使用到原型模原创 2020-12-17 09:37:41 · 721 阅读 · 0 评论 -
设计模式之简单工厂模式
简述简单工厂模式属于创建类模式(主要关注怎样创建对象,特点是将对象的创建和使用分离),是工厂模式中的一种,而工厂模式又可以分为简单工厂模式、工厂方法模式、抽象工厂模式。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例,简单工厂模式是工厂模式中最简单使用的一种模式。工厂模式的定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点介绍我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。如果要原创 2020-12-07 09:46:29 · 594 阅读 · 0 评论 -
Java使用雪花算法实现生成全局唯一id
简介雪花的基本形状是六角形,但是大自然中却几乎找不出两朵完全相同的雪花我们生成ID的方式有多种,比如说UUID,比如说自动增长...使用场景随着业务的增长与用户数量的增长,单个服务越来越多,数据库也分得越来越细,有些一个业务分成好几个库,这时候自增主键或者序列之类的主键id生成方式已经不再满足需求,分布式系统中需要的是一个全局唯一的id生成规则 雪花算法的结构如下(每部分用-分开):0 - 0000000000 0000000000 0000000000 0000000000 0原创 2020-10-28 09:21:04 · 16305 阅读 · 5 评论 -
Java UDP通信
TCP/IP协议的传输层除了一个TCP协议外,还有一个UDP协议。UDP协议是用户数据报协议的简称,它作用也是网络数据的传输。如何选择TCP协议和UDP协议, UDP协议虽然有时不太可靠,但如果可以接受掉包的情况,UDP协议有更大的优势。在Java中使用UDP协议发送数据的几个步骤使用DatagramSocket类创建一个套接字,然后使用DatagramPcket类创建要发送的数据包,之后使用DatagramSocket类中send()方法发送数据包。如果是接收UDP数据包的话,先使用Datagra原创 2020-10-18 20:30:02 · 373 阅读 · 0 评论 -
Java线程总结(二)
线程池优化多线程编程在Java中的对象是使用new来进行创建的,如果对象的创建量少还好,当创建大量生命周期短的对象时,使用new这种方式效率是比较低下的。使用池技术可以解决这种问题。如数据库连接使用数据库连接池可以大大提高效率,而线程也有线程池。下面例子中可以看出使用线程池和不使用线程池的效率差别,一种使用普通方式创建5000个生命周期短的线程,另一种是通过线程池技术来创建。@Test...原创 2019-07-17 20:40:47 · 101 阅读 · 0 评论 -
Java生成PDF文件
PDF作为日常常见的文件格式之一,有时候经常需要使用到。在Java中生成PDF的方式一般有:itext-PdStamper pdfStamper(根据模板生成PDF),itext-Document document(使用代码编写)等。使用IText生成PDF:IText是一个能够快速生成PDF文件的Java类库,IText的Java类对于那些要生成包括文本,表格,图形的只读文档是很好用的。...原创 2019-07-17 20:43:49 · 14593 阅读 · 8 评论 -
Java使用Socket传输文件、对象
网络应用主要分为客户端和服务端,在Java中Socket类是处理客户端通信的类,通过这类可以连接到指定IP或域名的服务器,从而实现客户端与服务端互相发送接收数据。使用Socket传输文件在使用套接字进行编码时,有时需要通过Socket传输文件。下面例子实现Socket多线程从客户端向服务端传输文件。Server关键代码:public class Server extends Ser...原创 2019-08-07 22:38:18 · 3090 阅读 · 2 评论 -
Java Swing程序解析Internet网页中的内容
有时候需要对获取某个网页上的内容,例获取某一个网页上的所有超链接、form表单填写的内容以及提交的连接。这样就需要对网页的内容进行解析,解析后可以使用正则表达式获取自己想要的内容。(在java中也可使用jsoup来对网页内容进行解析)下面主要通过URLConnection类的getInputStream()方法获取到输入地址的网页内容资源的输出流,从输出流读取信息,从而解析网页内容。创建S...原创 2019-07-17 20:34:54 · 450 阅读 · 0 评论 -
Java动态代理学习
Java动态代理机制:不需要开发人员手动编写代理类,只需要简单地指定一组接口以及委托类对象,即可动态获取代理类。而代理类会将所有的方法调用分派到委托对象上进行反射执行。动态代理的作用最终是学习AOP(面向切面编程),与装饰者模式相似,但比装饰者模式更加灵活。 动态代理相关的类java.lang.reflect.Proxy:java动态代理主类,该类提供了一组静态方法来为一组接口动态生成代理...原创 2019-06-27 16:56:33 · 130 阅读 · 0 评论 -
JavaWeb之BaseServlet
在JavaWeb中,使用最基础的Servlet用法实现一个功能操作是比较繁琐的,如实现两个功能就要创建两个Servlet,当业务操作过多时,这样会造成Servlet过于冗余,而web.xml配置文件代码也过于臃肿。过多地去创建Servlet明显是不可取的,这时可以在请求路径加一个方法参数,然后再在Servlet中进行判断,使用if语句判断方法参数从而调用哪个方法。如下图这做法虽...原创 2019-06-27 09:48:08 · 425 阅读 · 0 评论 -
Java验证码图片生成工具类
验证码是为了区分进行操作的是否是人,一般常见于登录、注册等。使用验证码可以防止有人恶意注册等操作。使用java编写一个生成验证码图片生成工具类。主要使用java的绘图类来实现。验证码图片生成工具类代码实例化一些需要用到的值//验证码宽度private int width=70;//验证码高度private int height=35;//实例化一个Random对象,...原创 2019-07-08 08:46:30 · 490 阅读 · 1 评论 -
JavaWeb文件压缩
ZIP压缩文件是一种非常常见的文件压缩形式,压缩后的文件可以节省存储空间,在java的内置类中提供了相关类,实现的方式也比较为简单。使用java.util.zip包中的ZipOutputStream与ZipInputStream类来实现文件的压缩/解压缩。如果要从ZIP压缩管理文件内读取某个文件,要首先找到对应文件的目录进入点,才能读取这个文件的内容。ZipOutputStream对象,可以文...原创 2019-06-26 21:29:31 · 617 阅读 · 0 评论 -
Java利用Socket实现互相通信
网络编程中,两个程序通过一个双向的通信连接实现数据的交换,这连接的一端称为一个socket。socket通信原理:OSI七层模型、TCP/IP五层模型OSI模型:应用层、表示层、会话层、传输层、网络层、数据链接层、物理层TCP/IP五层模型:应用层(相当于OSI表示层、会话层)、传输层、网络层、数据链接层、物理层在这七个层级中,socket属于传输层,基于TCP/IP协议下的soc...原创 2019-07-25 20:59:26 · 3504 阅读 · 0 评论 -
Swing程序实现网络资源下载
在Java网络编程中,资源下载是必不可少的一部分,如何使用代码从网络上下载你需要的网络资源。在Java中可以使用HttpURLConnection类来实现。网络资源单线程下载创建窗体关键代码:创建一个类,继承JFrame(窗体类),在该类的构造方法设置窗体内容(如窗体大小、将控件添加到容器中以及设置控件的位置等等),其中使用addActionListener监听按钮以进行相对应的响应。但点...原创 2019-07-25 21:01:04 · 421 阅读 · 1 评论 -
Java泛型应用
泛型是Java SE 5.0版的重要特性,使用泛型编程可以提高代码的重用性。泛型在Java中有比较重要的地位,在面向对象编程以及其他各种设计模式中有非常广泛的应用。什么是泛型:泛型即是“参数化类型”,也就是将类型由原来具体的类型参数化,类似于方法中的变量参数,此时类型也定义为参数形式。使用通配符增加泛型利用泛型类型参数<T>可以将类、方法或接口限制为T类型,但这种方式有个明...原创 2019-07-25 21:02:00 · 147 阅读 · 1 评论 -
Java获取内网所有IP地址以及创建套接字
获取内网的所有IP地址在进行网络编程时,有时候需要对局域网内的所有主机进行遍历,获得内网的所有IP地址首先创建一个继承JFrame类的窗体类GetIpFrame类构造方法,在窗体类放置内容面板,再在面板上添加两个按钮,在设置滚动面板时添加一个文本域控件,用于显示获取到IPpublic GetIpFrame() { super(); addWind...原创 2019-08-07 22:30:17 · 862 阅读 · 1 评论 -
Java对称加密
BASE64加解密BASE64是一种比较基本、简单的加密算法,其实BASE64主要作用不是用于加密,BASE64是把与原始的数据转换成另一种编码格式,这样方便在网络上传输。所以严格来说,BASE64并不是安全的加密解密算法,但通过BASE64编码过后原来的数据也会改变成非原来的数据的字符。例 /*该方法创建BASE64Encoder对象后调用encodeBuffer()方法对数据...原创 2019-08-16 17:37:08 · 2435 阅读 · 1 评论 -
Java非对称加密
非对称加密算法(RSA)是第一个既可以用于加密数据也可以应用数字签名的算法。RAS算法相对于DES和AES等对称加密算法在速度上要慢很多。使用RSA加密数据时需要使用密钥对,也就是一个公钥,一个私钥。如A、B双方发送数据,A生成密钥对,将公钥发送给B,A将数据用私钥加密后发送给B,而B用A提供的公钥对数据进行解密。如果是B向A发送数据,B用公钥加密数据并发送给A,A使用私钥对数据进行解密。例:...原创 2019-08-16 17:38:22 · 3253 阅读 · 0 评论 -
Java使用Stock传输视频
在网络编程使用套接字时,有时需要使用Socket传输视频、音频文件。如一个客户端将视频文件发送到服务端。创建一个服务端窗体类,该类继承JFream类,关键代码如下下面是服务端窗体类的构造方法,主要作用是创建窗体界面,获取选择文件信息,其中当点击发送按钮后,定义数据输入流对象后,创建输入流对象,分别将文件名、文件大小写入输出流,定义一个字节数组,将文件读取到字节数组中。public Se...原创 2019-09-19 11:34:10 · 2775 阅读 · 2 评论 -
Java线程总结(一)
在java中并发机制很重要,并发机制可以使程序执行多个线程,每一个线程对应一个功能,并以其他线程并发执行,在单线程中,代码按照调用顺序依次往下执行,要实现多线程就需要一个进程同时完成多段代码的操作。多线程:即是一个程序运行时产生不单单一个线程并发:CPU通过调度算法让用户觉得时同时执行,但不是真正的同时。实现多线程的两种方式1、继承Thread类,重写run()方法,在main方法...原创 2019-04-26 21:43:40 · 135 阅读 · 0 评论 -
JavaWeb实现生成二维码
在Java中,二维码的生成实现方式有很多种,可以使用QRCode.jar来实现,也可以使用ZXing开发。ORCode.jar下载:链接: https://pan.baidu.com/s/1XFK5xU5jVJUmSz4EU2v6NA 提取码: ein8 使用zxing需要使用到的jar包:链接: https://pan.baidu.com/s/14FEiFXBl3f9YPbu4E...原创 2019-07-07 16:09:52 · 5811 阅读 · 0 评论 -
Java使用FreeMarker模板引擎动态生成html页面
因一个功能需要动态生成HTML文件,所以接触了下FreeMarker模板引擎。一般可以使用该模板引擎来生成月报,日报,单据报表等等。我们都知道预先生成静态HTML文件,当访问时可以提高效率的。Freemarker简单介绍Freemarker是一款模板引擎,基于模板用来生成文本(任何来自HTML格式的文本用来生成源代码)的通用工具。FreeMarker实际上是被设计生成HTML页面的,尤其是...原创 2019-07-07 16:05:33 · 14862 阅读 · 0 评论 -
Java Response实现文件下载
在开发项目中,有时候需要从服务端下载一个文件到本地,以此对这需求可以使用Response对象(HttpServletResponse)就可以实现文件的下载。(注:使用的服务器是tomcat)首先新建一个JavaWeb项目,在项目上新建一个Servlet,上面图中箭头所指的区域是如果打勾的话就会创建对应的方法模板,这里只使用到doGet和doPost方法,所以其他的没有用到的没有勾上。...原创 2019-05-06 13:18:15 · 23882 阅读 · 0 评论 -
Java Swing程序设计入门
Swing为GUI(图形用户界面)提供开发工具包,使用Swing开发的应用程序可以统一应用程序在不同平台上运行的GUI组件显示风格,因为在Swing组件可以跨平台指定统一风格和外观。一般常用的组件有JButton、JFrame、JDialog、JList等等JFream窗体:一个容器,可以装载组件的容器,可以通过继承java.swing.JFrame类来创建窗体,继承了JFrame类后拥有...原创 2019-05-05 16:26:39 · 421 阅读 · 0 评论 -
Java绘图
绘图可以在应用程序中绘制图片、文字、图形等,在Java中主要可以使用Graphics和Graphics2D进行绘图,其中Graphics类是所有图形上下文的抽象基类,而Graphics2D就继承了Graphics类。而Graphics功能没有Graphics2D强大,Graphics2D是Graphics的扩展。构造一个新的Graphics2D对象,因为Graphics2D是抽象类,所以无法直...原创 2019-04-27 21:50:04 · 43513 阅读 · 3 评论 -
Java多态
Java既然是面向对象编程语言,那就有面向对象的三大特性:封装、继承、多态。其中多态即是同一个行为具有多个不同表现形式或形态能力,(如相同的信息传送给子类或父类对象时,该对象会根据自己所属的引用执行不同的行为)使用多态的好处:使程序可扩展性、灵活性更好等优点。实现多态的三个必要条件:继承、重写,父类引用指向子类对象(向上转型)。向上转型:在多态中将子类的引用指向父类对象。这样的引用具备...原创 2019-04-26 22:19:26 · 116 阅读 · 0 评论 -
Java内部类
在类中里面再定义一个类,那定义在类中里面的类称为内部类,内部类可 以分为成员内部类、局部内部类以及匿名类。成员内部类 代码如下虽然外部的成员变量、成员方法修饰为private ,但是内部类可以直接使用外部类的成员变量、方法, 内部类的实例化要绑定在外部类的实例上,内部类初始化方式跟普通类初始化方式相同实例化内部类的对象:实例化内部类对象应该使用外部类对象来创建内部类的对...原创 2019-04-26 22:03:42 · 160 阅读 · 0 评论 -
Java数组排序之冒泡排序算法
在java中数组有很多常用的算法,常用的排序算法包括冒泡排序,直接选择排序等,一般在开发中,需要对一组数组进行排序,这时候就可以使用排序算法排序。其中冒泡排序是比较常用的数组排序算法之一,冒泡排序主要是排序数组的过程总是将小数往前放,大数往后放。冒泡排序其实就是对比相邻的值,如果满足条件就交换值。冒泡排序示例:首先创建一个数组,这数组里面的元素是乱序的,现在使用冒泡算法将数组进行升序...原创 2019-04-17 20:45:29 · 3148 阅读 · 0 评论 -
Java反射
Java的反射机制十分强大,可以在访问已经已经装载到JVM中的Java对象的描述。可以实现访问,修改对象本身的信息功能,使用反射操作属性,普通方法,构造方法,在javaa.lang.reflect包中提供了对反射的支持。(反射一般应用在一些通用性比较高的代码,如一些框架,都是使用反射来是实现的)在框架开发中,都是基于配置文件开发(在配置文件配置类,通过反射可以得到类中的所有内容)反射原理:...原创 2019-04-16 22:44:18 · 113 阅读 · 0 评论 -
Java中的可变参数
Java1.5增加了可变参数这个新特性,可变参数:用于在参数个数不确定但类型确定的情况下,在Java中,你可以把一个可变参数看作参数数组,这个参数数组里面存储着传过来的参数。可变参数应用的场景,代码如下:上面的几个方法里面的逻辑基本相同,唯一不同的是传递的参数个数不一致,这时候如果使用可变参数来实现的话,可以使代码更加简洁。定义方法:数组类型…数组名称 示例代码如下既...原创 2019-04-16 22:37:55 · 166 阅读 · 0 评论 -
Java单例模式
单例模式提供一种创建对象的方式,所以疏远创建型模式。单例模式就是在创建对象的同时也要确保创建单个对象。单例类不需要实例化。使用到单例模式的优点,减少了内存的开销,避免多重占用资源。单例类不能继承。单例模式使用需要全面考虑线程和资源占用的问题,单例模式实现的实现方式:懒汉式、饿汉式、加锁同步、双重校验锁、使用枚举实现单例等,饿汉式举例,代码如下从上面代码可以看出首先是创建实例,不管有没有调用...原创 2019-04-08 12:39:27 · 101 阅读 · 0 评论 -
JavaWeb之JSP自定义标签
在jsp开发时,当jsp内置标签以及JSTL标签库都满足不了需求时,可以根据自己的需求来自定义标签。其实在jsp页面使用标签就等同于调用某个对象的某个方法。自定义标签步骤:先定义标签处理类(如继承SimpleTagSupport类),再编写TLD文件(标签库描述库文件)。定义标签类可以编写一个实现SimpleTag接口的类, public class MyTag1 implements...原创 2019-05-15 21:44:25 · 8578 阅读 · 2 评论 -
JavaWeb之Servlet三大作用域
在JavaWeb中,Servlet中三大域对象分别是request,session,ServletContextrequest:一个请求链,每一个请求都会创建一个request,作用域为当前的请求链,一般用于同一请求链之间不同页面的参数传递,如表单中的值传递。session:Tomcat(服务器)会为每个会话创建一个session对象,作用域:session的数据只能在当前会话中的所有se...原创 2019-05-16 21:35:13 · 2969 阅读 · 0 评论 -
Java使用PreparedStatement和Statement实现批处理
批处理就是将一批一批SQL语句的处理,而不是一条一条语句进行处理。如当你有多条SQL语句要执行时,一次向服务器发送一条语句,这样虽然也可以达到效果,但是效率很差,而处理这个问题就可以使用批处理(即是一次向服务器发送多条SQL语句,然后让服务器一次性处理),批处理只针对更新语句(新增、删除、修改),所有批处理跟查询没有关系。批处理:如通过多次调用PreparedStatement类的addBat...原创 2019-05-16 21:47:56 · 5287 阅读 · 3 评论 -
JavaWeb中实现类似Google Suggest自动完成
Google Suggest(谷歌搜索)就是在搜索框输入一个或多个文字时,会自动列出与该输入文字相关的部分常用搜索词汇。这在Web应用中经常能看到,比如百度搜索、搜狗搜索等,在JavaWeb中可以使用ajax技术来完成这一类似的功能。这里是基于JSP+Servlet+JDBC实现。JSP关键代码html代码:就是一个文本框,使用oninput事件,这个事件是HTML5标准事件,(如果使用的...原创 2019-06-17 19:53:01 · 259 阅读 · 0 评论 -
JDBCUtils工具类处理多线程并发访问问题
在项目框架中,如需要在MVC设计模式基础上进一步地将业务进行分离,,Dao层只能是对数据库进行操作,不能涉及任何的业务上的处理,所以事务不应该出现在Dao层中,只能在Service层进行业务处理,但是事务的结束和开始都需要Connection对象,而Connection对象又只能出现在Dao层,为了线程安全,这里在JDBCUtils工具类要对事务进行处理。使用ThreadLocal对象,根据业务逻...原创 2019-06-17 16:51:21 · 1119 阅读 · 0 评论 -
Java使用c3p0连接数据库
c3p0是一个开源的JDBC连接池,实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展,使用它的开源项目有Spring、Hibernate等。c3p0和dbcp的区别:dbcp没有自动回收空闲连接功能,c3p0有该功能。为什么使用连接池:在一般项目中操作数据库,每一次的操作都是建立一个连接,操作完成后才稀放连接,而JDBC不会保持连接的持续,超过一定的时间会稀放该连接。而...原创 2019-06-17 16:27:28 · 6019 阅读 · 0 评论 -
JavaWeb 使用ajax上传文件并显示进度条等上传信息
文件上传在Web程序中是常用的功能,一般上传图片或者文件大小比较少的文件客户端不需要显示上传进度或文件上传的信息,如果是上传的文件比较大的时候,可以在客户端展示文件上传进度以及根据业务的需求显示文件上传的各种信息。在JavaWeb中使用ajax技术实现带有进度条的文件上传,实现的方法有多种,大概逻辑分为:当客户端上传文件发送请求后,服务器将上传的文件写入某路径中,在此上传的过程中,将文件上传的...原创 2019-06-04 21:27:01 · 4407 阅读 · 1 评论