Java高级
木叶之荣
这个作者很懒,什么都没留下…
展开
-
自定义类加载器
package com.zkn.newlearn.classloader;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;/** * * @author zkn * */public cla原创 2016-01-22 22:54:22 · 512 阅读 · 0 评论 -
创建一个简单的web服务器(二):使用自定义的类加载器来替换URLClassLoader
在上一章中我们加载Servlet用的是URLClassLoader,在这一章中我们使用自定义的类加载器来替换URLClassLoader。关于类加载器的文章请参考这里:深入探讨 Java 类加载器。这篇文章写得很棒。具体的代码如下:package com.zkn.imitate.tomcat.secondchapter.first;import com.zkn.imitate.tomc原创 2017-01-04 13:41:08 · 1804 阅读 · 0 评论 -
利用JDK8的新特性计算某个目录下的文件中包含字符串的次数
需求:计算某个字符串在某个文件夹中出现的次数。这篇文章利用了JDK1.8的新特性Stream流和Lambda表达式并结合了线程池的使用。原创 2017-02-06 00:19:50 · 1396 阅读 · 0 评论 -
利用Fork/Join框架来统计某个字符串在某个文件夹的文件中出现的次数
需求:利用Fork/Join框架来统计某个字符串在某个文件夹的文件中出现的次数。主要用到的技术点:JDK8的Stream、Lambda表达式、Fork/Join框架.如果对于Fork/Join不了解的话可以参考这里:http://www.infoq.com/cn/articles/fork-join-introduction原创 2017-02-06 17:53:57 · 802 阅读 · 0 评论 -
用Socket实现HTTP文件上传
我想做过web开发的程序员大部分都做过文件上传的功能,大多数时候我们都是借助于commons-fileupload这样的jar包实现的。下面我试着通过读取Socket的输入流来实现一个文件上传的功能。在做文件上传之前我们需要先了解一下HTTP POST的附件上传协议。HTTP附件上传协议是RFC1876协议,RFC1876协议是在HTTP协议的基础上为INPUT标签增加了file属性,同时限定原创 2017-03-08 23:14:28 · 5780 阅读 · 0 评论 -
Java对象创建、分配、布局、访问小析(HotSpot虚拟机)(三)
本文内容总结自周志明先生所编著的《深入理解Java虚拟机-JVM高级特性与最佳实践》此书的经典不必多说。本节内容是对象的定位访问。在java中我们无时无刻不在创建对象,我们创建对象的目的当然是为了使用它了。但是我们怎么才能使用操作创建的对象呢?我们的java程序会通过栈上的reference数据(指向对象的引用)来操作堆上的具体对象。那这个对象的引用是通过什么方式去定位、访问堆中的对象的具体位原创 2017-05-10 00:44:03 · 599 阅读 · 0 评论 -
Java对象创建、分配、布局、访问小析(HotSpot虚拟机)(二)
本文内容总结自周志明先生所编著的《深入理解Java虚拟机-JVM高级特性与最佳实践》此书的经典不必多说。本节内容是对象的内存布局。在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头、实例数据、对齐填充(Padding)。对象头包含两部分的信息,一部分是对象自身的运行时数据,包含哈希码、GC分代年龄、锁状态信息、线程持有的锁、偏向线程ID、偏向时间戳等。另一部分的信息是类型原创 2017-05-09 01:04:23 · 556 阅读 · 0 评论 -
Java对象创建、分配、布局、访问小析(HotSpot虚拟机)(一)
本文内容总结自周志明先生所编著的《深入理解Java虚拟机-JVM高级特性与最佳实践》此书的经典不必多说。本节内容是对象的创建.、分配的内容。对象的创建java对象的创建有几种方式呢(这里所说的java对象仅限于普通java对象不包含数据和Class对象)?大致有以下四种方式:new关键字。这应该是我们最常见和最常用最简单的创建对象的方式。使用newInstance方法。这里包括原创 2017-05-09 00:35:31 · 696 阅读 · 0 评论 -
使用HttpClient发送InputStream对象及发送文件
最近在做的东西中有这样一个需求要把一个文件上传到服务器A上,再由服务器A上传到服务器B上,而服务器A上传到服务器B的这个请求是通过HttpClient发送的。如果是发送文件的话很好办,但是现在问题的难点是服务器A通过HttpClient发送的不是一个文件,而是一个InputStream对象。一个折中的办法是先把文件临时存储在服务器A上,然后再从服务器A上读取文件发送到服务器B上,那么有没有办法直接原创 2017-05-26 00:17:03 · 31600 阅读 · 13 评论 -
Java内存模型小析值JVM运行时数据区域(一)
之前看过一次周志明写的《深入理解Java虚拟机-JVM高级特性与最佳实践》但是看过之后很多东西就忘了如同失忆了一般,所以这次在看的时候做一个读书笔记,以后也便于复习。先奉上一副自己总结的小图:原创 2017-05-07 00:50:38 · 927 阅读 · 0 评论 -
Java内存模型小析之原子性和可见性(二)
在上篇文章中我们简单的说了一下jvm的内存布局,在这篇文章中我们继续java内存模型方面的东西。原创 2017-06-11 14:17:01 · 944 阅读 · 0 评论 -
Java内存模型小析之重排序(三)
我们在上一篇文章中说了JAVA内存模型中原子性可见性的相关概念(点这里查看),我们在这一篇文章里说一下java内存模型中的重排序的内容。重排序重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。也就是说重排序的目的是提高程序的执行性能。重排序的分类编译器优化的重排序编译器在不改变单线程程序执行结果的前提下,可以重新安排语句的执行顺序。这里需要注意的是:不原创 2017-06-11 17:33:35 · 793 阅读 · 0 评论 -
小工具类输出ThreadLocal中的值
一个输出ThreadLocal中的值小工具类,代码如下:package com.zkn.utils;import org.springframework.core.NamedThreadLocal;import java.lang.ref.Reference;import java.lang.reflect.Field;import java.util.*;/** * Cre原创 2017-10-04 20:02:08 · 2008 阅读 · 0 评论 -
SpringMVC之分析AnnotationDrivenBeanDefinitionParser(三)
我们在之前的文章中对这篇文章中AnnotationDrivenBeanDefinitionParser的parse方法进行了一些分析,我们在这篇文章中接着分析AnnotationDrivenBeanDefinitionParser的parse方法的内容。ManagedList messageConverters = getMessageConverters(element, source, p原创 2017-11-03 22:18:29 · 711 阅读 · 0 评论 -
查看JDK动态代理生成的类的内容
首先我们先定义一个接口:public interface PersonInter { String test(String str);}接着就是我们想的要生成的JDK代理类源码的代码:public class JdkProxySourceClass { public static void writeClassToDisk(String path){ byte[] c原创 2017-09-10 00:37:42 · 7072 阅读 · 0 评论 -
使用线程池导出Excel数据
之前同事在做一个功能的时候,需要导出一些数据,但是组装数据量的过程比较麻烦一点,所以这里给了一个建议看看能不能使用多线程的方法来进行处理。顺便写了两个demo,一种方式是批量分段去往一个sheet页中写入数据,另一种方式是往多个sheet也中写入数据。demo如下: 批量分段导出数据package com.zkn.newlearn.opensource.poi;/** * Created b原创 2017-11-18 23:23:40 · 6868 阅读 · 1 评论 -
JDK1.8新特性值Optional
在我们的开发中,NullPointerException可谓是随时随处可见,为了避免空指针异常,我们常常需要进行一 些防御式的检查,所以在代码中常常可见if(obj != null) 这样的判断。幸好在JDK1.8中,java为我们提供了 一个Optional类,Optional类能让我们省掉繁琐的非空的判断。下面先说一下Optional中为我们提供的方法 方法 描述 of 把指定原创 2017-11-20 23:19:36 · 40526 阅读 · 14 评论 -
创建一个简单的web服务器
Web服务器也称为超文本传输协议(HTTP)服务器,因为它使用HTTP来跟客户端进行通信的。既然说到通信那就离不了Java里的两个重要的类java.net.Socket和java.net.ServerSocket。这里浏览器一方可以认为是一个客户端,接收HTTP请求的一方可以认为是服务端。在这之前我们先说一下HTTP协议。HTTP协议允许web服务器和浏览器通过网络来进行发送和接收数据。它是一原创 2017-01-04 00:59:56 · 11799 阅读 · 2 评论 -
Java中的IO流的介绍(二)
字节输入流(InputStream):SequenceInputStream: SequenceInputStream可以把两个输入流合并成一个输入流。主要用作合并输入流。 内部有一个Enumeration属性,来存放两个输入流。 内部有一个nextStream方法,来指示Enumer原创 2016-12-17 00:24:55 · 1078 阅读 · 0 评论 -
Java中的IO浅析(一)
Java中的IO大致可以分为两类,字节流和字符流。字节流又可以分为字节输入流和字节输出流,字符流又可以分为字节输入流和字符输入流。下面我们看一下他们的体系结构(UML类图表示)。字节输入流字节输入流的UML类图如下所示:字节输出流字符输入流字符输出流IO大致总图:原创 2016-12-10 22:29:01 · 554 阅读 · 0 评论 -
JDK和Cglib动态代理小demo
一:JDK动态代理package com.zkn.newlearn.proxyhandler;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import org.omg.CORBA.portable.InvokeHan原创 2016-01-24 18:19:16 · 1485 阅读 · 0 评论 -
四中方式实现单例模式
一:饿汉式单例模式package com.zkn.newlearn.gof.singleton;/** * * 饿汉式单例模式 * @author zkn * */public class SingletonTest01{ /** * 加载类时,立即加载对象,是没有延迟的。是天然的线程安全的 */ private static Sin原创 2016-02-20 23:31:04 · 713 阅读 · 0 评论 -
反射的方式破解单例模式
上篇文章中前两种单例实现方式可以通过反射来进行破解package com.zkn.newlearn.test.gof;import static org.junit.Assert.*;import java.lang.reflect.Constructor;import org.junit.Test;import com.zkn.newlearn.gof.sin原创 2016-02-20 23:36:42 · 1678 阅读 · 0 评论 -
一台机器配置多个Git账户
背景在我们的开发工作中,我们会有这样的需求:即在一台电脑上管理多个账户。比如:我在GitHub上有一个账户,在Gitlab上有一个账户,在CSDN的CODE上也有一个账户。我们需要为不同的账户生成不同的密钥,但是在生成密钥的时候默认的是id_rsa私钥和id_rsa.pub公钥,但是我们可以改公私钥的文件名。生成公钥的密令如下:ssh-keygen -t rsa -C “您的邮箱地址”在这个命原创 2016-05-11 20:17:10 · 2880 阅读 · 0 评论 -
Enum、EnumMap、EnumSet的用法讲解
今天在工作中遇到这样一个问题,要在前台页面上渲染出来所有的枚举元素,但是前台页面用的是Velocity,所以需要把枚举元素放到Map里,然后在前台进行渲染。这里不能一个一个的取出枚举元素来put的,就想能用一个循环能搞定这个。发现枚举类有一个方法values,正好可以满足我的需求。OK话不多说我们一个一个的介绍其中主要的方法。先看定义的枚举类:package com.zkn.newlear原创 2016-07-11 23:47:26 · 20314 阅读 · 1 评论 -
LinkedList源码浅析
package com.zkn.newlearn.collection;/** * * @author zkn 2016-06-25 * LinkedList的内部数据结构是双向链表, * 所以定义一个内部类,用来表示一个节点, * 这个节点包括三个属性, * 1、一个用来表示当前元素 * 2、一个用来表示上一个元素 *原创 2016-06-28 00:04:51 · 458 阅读 · 0 评论 -
Idea添加本地git仓库
今天在家写项目的时候遇到这样一个问题:我今天新建了一个项目,然后用命令git init为本地仓库,git remote add origin 远程仓库地址,这个时候我再用Idea导入我的工程,却惊奇的发现没有找到git这个菜单。如图所示:这时我就比较郁闷了,因为我的工程中是存在本地git仓库的。上网找了很多资料,没有找到我问题的解决方案。但是我注意到在Idea的右下角有这样一个东西:原创 2016-08-14 17:07:28 · 20539 阅读 · 0 评论 -
Linux环境下安装Zookeeper
前几天自己在家搞了个zookeeper+dubbo的环境。下面来介绍一下怎么在Linux下面安装Zookeeper。准备工作在安装zookeeper之前我们需要先做两件事。第一是安装Oracle的JDK。具体的安装步骤请看这里 Linux(CentOs6.5)系统安装JDK。第二是下载zookeeper的安装包,下载地址请点击这里下载。原创 2016-09-20 23:14:11 · 32388 阅读 · 15 评论 -
多线程之volatile关键字
每个线程都运行在java栈内存中,每个线程都有自己的工作内存。线程的计算一般是通过工作内存进行交互的。如图所示:从上图中我们可以看到,线程在初始化时从主内存中加载所需的变量值到工作内存中,然后在线程运行时,如果是读取,则直接从工作内存中读取,如果是写入则先写到工作内存中,之后再刷新到主内存中,这个可以看做是JVM的一个简单的内存模型,但是这样的结构在多线程的情况下有原创 2016-11-06 22:44:29 · 764 阅读 · 0 评论 -
多线程之线程池概述(一)
java在JDK1.5之后引入了并发计算框架,java.util.concurrent。这个框架大大减轻了简化了多线程的开发工作。一个线程大概有五种状态:新建状态(New)、可运行状态(Runnable,也叫做运行状态)、阻塞状态(Blocked)、等待状态(Waiting)、结束状态(Terminated)。线程的状态只能由新建转变为了运行状态后才能被阻塞或者等待状态。线程的状态流转如图所示:原创 2016-11-06 23:19:42 · 938 阅读 · 0 评论 -
Linux环境下安装RocketMQ(MetaQ)
一:RocketMQ简介RocketMQ是一款分布式、队列模型的消息中间件,具有以下特点:1.能够保证严格的消息顺序2.提供丰富的消息拉取模式3.高效的订阅者水平扩展能力4.实时的消息订阅机制5.亿级消息堆积能力二:安装RocketMQ下载源码首先我们从githup上获取RocketMQ的源码,目前最新的版本为3.5.8,下载地址为:http原创 2016-10-30 21:52:29 · 12979 阅读 · 3 评论 -
解决RocketMQ报No route info of this topic:异常
近日在做RocketMQ的时候,mqnamesrv和mqbroker都正常启动了,但是在运行生产者的时候,报了个No route info of this topic的异常,让我很是郁闷。上网找了一些资料,现把解决办法记录如下,如果还有其他的原因导致这个问题的,后续会补充。Linux系统下:在启动mqbroker的时候需要指定autoCreateTopicEnable=true。例如:原创 2016-10-31 21:56:52 · 93069 阅读 · 21 评论 -
多线程之同步线程通信小例子
最近在学习多线程的时候,看到这样的一个问题:有两个线程,一个是子线程,一个是主线程,子线程运行10次,接着主线程运行20次,接着子线程运行10,主线程运行20次,依次交替循环20次。刚开始看到这个问题的时候,很是茫然。后来分析一下,子线程和主线程交替运行,这是一个线程在执行的时候,另一个线程在等待状态,当在执行的线程执行完之后,唤醒另外一个线程,这样交替进行。线程在执行的地方是要加锁的。但是,在什原创 2016-11-15 23:21:38 · 1335 阅读 · 0 评论 -
多线程之线程池newFixedThreadPool(二)
在上一章中我们概述了一下线程池,这一章我们看一下创建newFixedThreadPool的源码。例子还是我们在上一章中写的那个例子。原创 2016-11-07 13:18:06 · 40445 阅读 · 1 评论 -
java反射增加装饰模式的普适性
装饰模式(Decorator Pattern)的定义是:在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象来包裹真实的对象。就增加功能来说,装饰模式相比于生成子类更为灵活。使用java的动态代理实现装饰模式会具有更强的灵活性、适应性。下面我们就来写一个使用java动态代理来实现装饰模式效果的例子。定义一个职责的接口:/** * 能力 */inte原创 2016-11-15 23:54:52 · 788 阅读 · 0 评论 -
创建多线程的三种方式
在java中给我们提供了三种方式来创建多线程。前两种是我们比较常见的,第三种是JDK1.5之后提供给我们的。接下来我们详细的看一下这三种创建线程的写法。继承Thread类第一种方式是继承Thread类的写法,代码如下: Thread thread = new Thread(){ @Override public void r原创 2016-10-31 23:26:35 · 1567 阅读 · 0 评论 -
多线程之定时器任务
在java中Timer是java.util包中的一个工具类,提供了定时器的功能。我们可以创建一个Timer对象,然后调用其schedule方法在某个特定的时间去执行一个特定的任务。并且你可以让其以特定频率一直执行某个任务,这个任务是用TimerTask来描述的,我们只需要将要进行的操作写在TimerTask类的run方法中即可。先附上两个小例子一遍让读者了解什么是定时器。接着再分析其中的一些源码实原创 2016-11-02 00:28:59 · 9151 阅读 · 1 评论 -
Linux环境下安装dubbo-admin
注意:本文采用的Linux版本为CentOs6.5。准备工作在安装dubbo-admin之前,我们需要的准备工作是你的Linux已经安装了jdk和Zookeeper。具体的安装步骤请参看这两篇文章Linux环境下系统安装JDK和Linux环境下安装Zookeeper。另外我们还需要准备一份tomcat的安装包和dubbo-admin的war包。你可以在这里下载到他们dubbo-admin和...原创 2016-09-21 23:55:46 · 12682 阅读 · 20 评论