学习Java的NIO

重要的概念 什么是NIO?NIO是从java 1.4 开始引入的一个新的 IO API。 Channel、Buffer、Selector是NIO的核心部分。 IO通过字节流和字符流操作数据,NIO基于通道(Channel)和缓冲区(Buffer)数据 Channel&BufferChannel数据总是由通道到缓冲区(Read),或者由缓冲区到通道(write) 其中Channel的几个实现 FileChannel DatagramChannel SocketChannel ServerSocketChannel 分别对应文件IO/UDP/TCP网络IO. 下面是一个简单的例子实现,从本地文件系统读取数据到Buffer中。

java

Java中的null引用

空指针也许是java中最常见的异常,到处都埋藏着NullpointerException,最近就遇到一个NullPointException,如下: 1int lastMonthTotalScore = integralOperationReadMapper.getSumByIntegralIdAndDate(integralId, lastMonthDate); 一个很常见的情况,mybatis查询的一个列的和,此时Debug时 integralId、lastMonthDate 都不为空,自动注入的 integralOperationReadMapper也不为空但是Console却实实在在的打出了这一行有一个NullPointerException,此时没有注意到Wrapper类自动转换基本数据类型的情形。 getSumByIntegralIdAndDate 方法返回的是NULL,自动拆箱的时候的要将一个NULL转换为基本数据类型就出错了…o(╯□╰)o 现在总结几个NULL的经验。 1.不用null来返回方法的返回值 不要用null来舒适化变量,方法不要返回null、这样会造成null的传播,在每一个调用的地方都需要检查null 例如: 12345public String doSomething(int id){ String name = findName(id); ... return name;} 这样如果findName如果返回为null,那么null就由findname游走到了doSomething。比如在findname中,如果没有找到对应的Id的姓名,就应该表明是没找到,而不是出错了。 善于运用Java的异常。 1234567public String findName() throws NotFoundException { if (...) { return ...; } else { throw new NotFoundException(); } }

java

Executor任务执行框架的应用

最近一段时间没有写东西了,看大名鼎鼎的Brian Goetz写的Java Concurrency in Practice时候,看到任务执行框架Executor Framework的时候,觉得纸上得来终觉浅,索性写点东西加深一下印象。 在JDK1.5中,Java平台中增加了一个并发包java.util.concurrent,这个包中包含了Executor Framework,而且还包含了很多并发包,比如并发HashMapConcurrentHashMap、阻塞队列BlockQueue、栅栏的实现CyclicBarrier、信号量Semaphore、异步任务FutureTask等等。在处理多线程任务的时候,使用Executor和task要优于使用线程,这也不是我说的,是Effect Java的作者 Joshua Bloach说的,下面来阐述一下为什么。 并发任务执行当要执行一个并发任务的时候,通常有两种方式,一种是串行的处理方式,一种是并行的处理,显然,串行的方式只能一次处理一个任务,当程序在执行当前的任务的时候,就说明接下来到来的任务请求都要等待当前的任务执行完毕才能获得CPU去执行任务,这种方式虽然不会犯错,但是效率太低。那么,如果每一个任务到来都分配一个新的任务呢,这种方式貌似很好,但是: 如果任务请求量非常大的时候会出现一定的问题,因为它没有限制可以创建的线程的数量. 线程生命周期的开销很高 线程的创建和销毁不是没有代价的,根据平台的不同,开销不同,但是不要忘记,线程的创建是需要时间的。 活跃的线程会消耗系统资源 活跃的线程很消耗系统资源,尤其是内存,如果可运行的线程数量多于处理器核心数,那么多余的线程将闲置,但是闲置的线程仍然是消耗系统资源的,尤其 是内存,给GC回收垃圾带来压力,而且线程间在进行竞争的时候也会消耗大量的资源 平台可创建的线程数量是有限的 也就是说,如果创建的线程超出了平台的限制那么,JVM就可能抛出OutofMemoryError的异常

java

JDK动态代理和cglib动态代理

一晃眼,国庆节已经过去了,时间到了10月中旬了,总是感觉时间不够用,想多看点书,多写点代码,在点滴中积淀属于自己的知识系统。 闲言少叙,先来说一下什么是代理模式,我们去一个新的地方总是要先找地方住,但是我们人生地不熟的掌握的资源不多,这时候一般会找中介,中介对房源很熟悉,很快就能为你找到合适的房子,这时候,中介就是一个代理,你就相当于是一个委托方。 下面是设计模式中的代理: 代理模式代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。 按照代理的创建时期,代理类可以分为两种: 静态代理由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 动态代理在程序运行时,运用反射机制动态创建而成。 动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。 动态代理有很多种,先看第一种,JDK动态代理

java

Java中使用DES对称加解密

DESDES(Data Encryption Standard),即数据加密算法。是IBM公司于1975年研究成功并公开发表的。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。 安卓端对请求Web服务器请求字符串进行加密加密公共方法: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112package com.sz.kcygl.common.DESUtil;import java.security.Key;import java.security.SecureRandom;import java.security.spec.AlgorithmParameterSpec;import javax.crypto.Cipher;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESKeySpec;import javax.crypto.spec.IvParameterSpec;import com.sun.org.apache.xml.internal.security.utils.Base64;public class DESUtil { public static final String ALGORITHM_DES = "DES/CBC/PKCS5Padding"; /** * DES算法,加密 * * @param data * 待加密字符串 * @param key * 加密私钥,长度不能够小于8位 * @return 加密后的字节数组,一般结合Base64编码使用 * @throws CryptException * 异常 */ public static String encode(String key, String data) throws Exception { return encode(key, data.getBytes()); } /** * DES算法,加密 * * @param data * 待加密字符串 * @param key * 加密私钥,长度不能够小于8位 * @return 加密后的字节数组,一般结合Base64编码使用 * @throws CryptException * 异常 */ public static String encode(String key, byte[] data) throws Exception { try { DESKeySpec dks = new DESKeySpec(key.getBytes()); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); // key的长度不能够小于8位字节 Key secretKey = keyFactory.generateSecret(dks); Cipher cipher = Cipher.getInstance(ALGORITHM_DES); IvParameterSpec iv = new IvParameterSpec("12345678".getBytes()); AlgorithmParameterSpec paramSpec = iv; cipher.init(Cipher.ENCRYPT_MODE, secretKey, paramSpec); byte[] bytes = cipher.doFinal(data); return Base64.encode(bytes); } catch (Exception e) { throw new Exception(e); } } /** * DES算法,解密 * * @param data * 待解密字符串 * @param key * 解密私钥,长度不能够小于8位 * @return 解密后的字节数组 * @throws Exception * 异常 */ public static byte[] decode(String key, byte[] data) throws Exception { try { SecureRandom sr = new SecureRandom(); DESKeySpec dks = new DESKeySpec(key.getBytes()); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); // key的长度不能够小于8位字节 Key secretKey = keyFactory.generateSecret(dks); Cipher cipher = Cipher.getInstance(ALGORITHM_DES); IvParameterSpec iv = new IvParameterSpec("12345678".getBytes()); AlgorithmParameterSpec paramSpec = iv; cipher.init(Cipher.DECRYPT_MODE, secretKey, paramSpec); return cipher.doFinal(data); } catch (Exception e) { // e.printStackTrace(); throw new Exception(e); } } /** * 获取编码后的值 * * @param key * @param data * @return * @throws Exception * @throws Exception */ public static String decodeValue(String key, String data) throws Exception { byte[] datas; String value = null; datas = decode(key, Base64.decode(data)); value = new String(datas); if (value.equals("")) { throw new Exception(); } return value; }}

java

根据WebMagic写的一个爬取煎蛋网的小爬虫

之前研究jsoup,想用jsoup写一个小爬虫,爬煎蛋网的无聊图,我也是够无聊的 =.=,挖了个坑过了半个月还没填上,昨天上知乎的时候,发现有更加好用的爬虫框架WebMagic(知乎,果然让人发现更大的世界),先用WebMagic实现一下我的小爬虫,好啦,填坑开始… 这里用到webmagic,就把webmagic介绍,使用方法都放出来,没用过的先熟悉一下。 这里是WebMagic中文使用文档,一点即达 @.@ 介绍文档已经很详细了,下面开始,生产爬虫

java
12

本站由 Hank Zhao 使用 Stellar 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
本站总访问量