技巧积累--java

1.取得程序运行中某些路径的值:

String path = test.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();//工程下bin的文件路径

String path_jar = System.getProperty("java.class.path");//工程所要加载的jar包的所有路径

String path_library = System.getProperty("java.library.path");//环境变量的值


2.某个类找不到时,可以用如下方式输出类的访问路径
CodeSource cs = ConnectionConfiguration.class.getProtectionDomain().getCodeSource();

CodeSource cs = Class.forName("de/measite/minidns/DNSCache").getProtectionDomain().getCodeSource();  
System.out.println(cs.getLocation());

ConnectionConfiguration就是你要找的类,de/measite/minidns/DNSCache就是你要找的类所在的包,如果找不到就是没有加入到工程中


3. ClassNotFoundException和NoClassDefFoundError的区别:
http://my.oschina.net/jasonultimate/blog/166932


4. Java中isEmpty、""和null的区别:
isEmpty是分配了内存空间,但值为空 

""是分配了内存空间,值不是空,是空字符串  
null是未分配内存空间,更谈不上有值无值了

5.一个变量值x: x != null 和 null != x 的情况在java中就是编译器中差一条,基本没什么差别
但是 x.equals("") 和 ("").equals(x) 不同,前一个报空指针异常,后一个不报

6.jdk1.6及以上才支持实现接口方法时,默认加上@override,而继承重写时,哪个版本都会加上@override

7.string的split("@")[0]即使没有@字符,也会返回原字符串不会报错,
但jid.substring(0,jid.indexOf("@"))这种方法,因为indexOf("@")没有@会返回-1,所以这种方法会报错

 +、*、|、/等符号在正则表达示中有相应的不同意义。一般来讲只需要加[]、或是\\即可
如 int i=s.split("[?]").length;   或者   int i=s.split("\\?").length;i);


8.Math.random()只返回[0.0,1.0)之间的double型数值,每次不会返回相同的
java.util.random有两种构造函数,设定seed时每次都是相同的随机顺序,不设定时默认系统时间,因此不设定seed时每次取的数都不同
Random ran = new Random();int jobNum = ran.nextInt(32);这样每次都是取0-32之间不同的数,这和int m = (int) (Math.random()*32);是一样的效果
Random ran = new Random(32);int jobNum = ran.nextInt();这样每次取出都是同一个数

9.Java中file.list()是乱序的,不保证文件输出按字母排序,我也没搞清是怎么排列的

10.cmd命令行下运行java程序,要进到所在的文件夹下(不想cd过去的话,直接在对应的文件夹下shift+右键,选择“在此处打开命令行”),
输入javac package\Hello.java ,生成class文件;再输入java package.Hello ,运行成功
注意:要加包名,不要加分号---------惨痛教训证明:javac后面语句加分号提示“无效的标记”; java后面的语句加分号提示“找不到或无法加载主类”

11.static final 和 final static没什么区别,只是后者的可读性比较强些。跟 int[] a 和int a[] 一样,只是int[] a可读性强一点

12.Java中跟日志相关的又两个:commons-logging和log4j

commons-logging和log4j是Apache下的开源项目。

commons-logging的目的是为“所有的Java日志实现”提供一个统一的接口,使项目与日志实现工具解耦。自身的日志功能比较弱(只有一个简单的 SimpleLog),所以一般
不会单独使用它。Log4j的功能非常强大,是目前最主流的java日志工具。结合使用两者可以避免使项目与log4j紧密耦合,用户可以轻松切换到其他日志工具,同时又可以使用log4j的强大功能。

commons-logging如何自动选择适当的日志实现工具?
我们在使用commons-logging+日志实现工具时,我们的代码只需要和commons-logging打交道,由commons-logging去选

择适当的日志实现工具。这里我们看一下commons-logging是如何去选择实现工具的:
-首先在classpath下寻找自己的配置文件commons-logging.properties,如果找到,则使用其中定义的Log实现类:
org.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog
上面这个配置,commons-logging会使用commons-logging的SimpleLog
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JLogger
这个配置,commons-logging就会选择使用log4j
org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger
这个配置,commons-logging会选择jdk的logger
-如果找不到commons-logging.properties文件,则在查找是否已定义系统环境变量org.apache.commons.logging.Log,

找到则使用其定义的Log实现类
-否则,查看classpath中是否有Log4j的包,如果发现,则自动使用Log4j作为日志实现类。
-否则,使用JDK自身的日志实现类(JDK1.4以后才有日志实现类)。
-否则,使用commons-logging自己提供的一个简单的日志实现类SimpleLog。
可见,commons-logging总是能找到一个日志实现类,并且尽可能找到一个最合适的日志实现类。
为了简化配置,我们可以不使用commons-logging的配置文件,也不设置commons-logging相关的环境变量,只需将log4j的包放入classpath就可以了,这样就可以完成commons-logging与log4j的结合。如果以后不想使用log4j,只需将log4j的包 从classpath中移除就可以了。

--------------------

Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局)。

Loggers组件在此系统中被分为五个级别:DEBUG < INFO < WARN < ERROR < FATAL
Log4j有一个规则:只输出级别不低于设定级别的日志信息

禁用和使用日志请求只是Log4j的基本功能,Log4j日志系统还提供许多强大的功能,比如允许把日志输出到不同的地方,如控制台(Console)、文件(Files)等,可以根据天数或者文件大小产生新的文件,可以以流的形式发送到其它地方等等。

log4j.properties配置文件详解:
log4j.rootLogger = [ level ] , appenderName1, appenderName2, …
level :设定日志记录的最低级别
appenderName:就是指定日志信息要输出到哪里。可以同时指定多个输出目的地,用逗号隔开。


--------------------

java的加密压缩和解压:jdk自带的zip包(java.util.zip)并不支持密码,也不支持中文文件名;

Cipher(javax.crypto.Cipher提供加密和解密的功能,是JCE框架的核心)也能实现加密,但加密后的文件用常用的压缩软件打不开

winzipaes开源项目(http://code.google.com/p/winzipaes) 仅支持AES压缩和解压zip文件;

推荐zip4j这一开源项目



你可能感兴趣的:(技巧积累--java)