Dos批处理命令-拷贝文件夹下的多个文件
接到勇发的问题:
用批处理命令实现从一个文件夹下的文件1.txt,2.txt,3.txt....拷贝到另外一个文件夹中..
立刻网上搜索学习了下,写了如下批处理:
for /l %%i in (1,1,3) do copy d:\test\%%i.txt d:\test\sub\%%i.txt pause
上面是一个循环拷贝文件,其中/l 表示以增量的形式从开始到结束的一个序列,其实变量%%i就是表示这个数字,in(1,1,3)表示开始值是1,增量是1,结束值是3,就是表示变量i从1到3,加上后面的copy语句,就是拷贝文件夹d:\test\1.txt~3.txt拷贝到d:\test\sub目录下。
其实,如果d:\test目录下如果只有我们要拷贝的文件,可使用更简单的方法:
@echo on copy d:\test\*.txt d:\test\sub\*.txt pause
上面的意思就是将d:\test\目录下的所有txt文件拷贝到d:\test\sub目录下,同样也达到了效果。
ExtJs中出现this.ds.fields.get(i) is undefined错误解决方法
出现问题如题:依旧谷歌得:
原因:在Grid的列定义中一定要指定dataIndex属性,即使没有store中的对应上(比如一些附加字段)也要指定一个dataIndex,否则就会出现this.ds.fields.get(i) is undefined的错误。
解决方法:当然就是补上列定义中的dataIndex属性咯..
ExtJs中出现this.config[col] is undefined错误解决方法
问题如上,谷歌得:
原因 :
在Grid定义的时候对某列使用了autoExpandColumn属性,而这个属性所指定的是某列定义的id属性,
该列上没有指定id,所以出错了。
解决方法:
在被扩展的那些列指定id属性即可,id属性所指定的值当然要和autoExpandColumn所指定的一样啦。
关于字符串非空判断效率问题
做一个字符串非空的判断,我们经常如下这样写:
if(str == null || "".equals(str)){ //具体操作 }
这是一种很正常的写法,但是如果去比较字符串的长度是否为0的话,效率是更高的。贴个JDK的equals方法的源代码:
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false; }
再来看看str.length()的方法,则是直接返回其大小。两个对比,很明显的length()方法要优化很多。
所以做字符串非空判断尽量写成如下方式:
if(str == null || str.length() == 0){ //具体操作 }
其实也可以用apache-common-lang包下StringUtils.isEmpty(String src);方法判断即可,里面的实现就是用长度来判断的。
经理透露,很多笔试面试题经常都会考这样的问题,如果你用equals来判断,那么在面试官的印象就要大大折扣啦。
Java主线程等待子线程执行完毕-CountDownLatch
想做的一个程序如题,主要是想统计子线程都执行完毕所用的时间,网上搜索到了CountDownLatch这个类,这个工具类可以理解为计数器。在这里用于表示正在运行的线程数,当一个子线程结束的时候,将这个计数器减一,最后在主线程的一个地方等待子线程全部执行完毕,再继续运行等待后面的程序。写了个Demo程序,如下:
//子线程 public class SubThread extends Thread{ //子线程记数器,记载着运行的线程数 private CountDownLatch runningThreadNum; public SubThread(CountDownLatch runningThreadNum){ this.runningThreadNum = runningThreadNum; } @Override public void run() { System.out.println(Thread.currentThread().getName()+"-start"); System.out.println(Thread.currentThread().getName()+"-do something"); System.out.println(Thread.currentThread().getName()+"-end"); runningThreadNum.countDown();//正在运行的线程数减一 } }
//Main主线程 public class MainThread { public static void main(String[] args) throws InterruptedException { long startTime = System.currentTimeMillis(); int threadNum = 5; //线程数 //定义正在运行的线程数 CountDownLatch runningThreadNum = new CountDownLatch(threadNum); System.out.println(Thread.currentThread().getName()+"-start"); //创建多个子线程 for (int i = 0; i < threadNum; i++) { new SubThread(runningThreadNum).start(); } //等待子线程都执行完了再执行主线程剩下的动作 runningThreadNum.await(); System.out.println(Thread.currentThread().getName()+"-end"); long endTime = System.currentTimeMillis(); System.out.println("runningTime:"+(endTime-startTime)); } }
main-start Thread-0-start Thread-0-do something Thread-0-end Thread-1-start Thread-1-do something Thread-1-end Thread-2-start Thread-2-do something Thread-2-end Thread-4-start Thread-3-start Thread-4-do something Thread-3-do something Thread-4-end Thread-3-end main-end runningTime:16
看到打印的结果,满足我现在的要求。笔记下~~
json-lib中关于Date转换的问题
前两天,关于使用json-lib工具包来将一个java对象序列化成json串,结果总是报如下错误:
net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
得原因是因为Java对象中存在Date类型的对象无法进行解析,但是我又必须使用Date类型,还好json-lib提供了可扩展的接口JsonValueProcessor接口来让我们自定义的处理Json返回值的接口,看具体的对日期返回值的操作扩展:(为缩小篇幅,注释没那么规范),另外需要依赖的第三方包有如下:
commons-beanutils.jar commons-collections-3.1.jar commons-lang-2.1.jar commons-logging-1.1.1.jar ezmorph-1.0.3.jar json-lib-2.3-jdk15.jar |
//Date日期类型的Json值处理器,可自定义一些类的处理方式,是json提供的一个扩展接口 public class DateJsonValueProcessor implements JsonValueProcessor { private String format = "yyyy-MM-dd'T'HH:mm:ss"; private SimpleDateFormat sdf = new SimpleDateFormat(format); //处理数组的值 @Override public Object processArrayValue(Object value, JsonConfig jsonConfig) { return this.process(value); } //处理对象的值 @Override public Object processObjectValue(String key, Object value, JsonConfig jsonConfig) { return this.process(value); } //处理Date类型返回的Json数值 private Object process(Object value) { if (value == null) { return ""; } else if (value instanceof Date) return sdf.format((Date) value); else { return value.toString(); } } }
public class TestBean { private String name; private double price; //日期类型的时间 private Date time; //....此处省略setter和getter }
public class Test { //测试 public static void main(String[] args) { //初始化信息 TestBean testBean = new TestBean(); testBean.setName("1234"); testBean.setPrice(3.14145); testBean.setTime(new Date()); JsonValueProcessor jsonProcessor = new DateJsonValueProcessor(); JsonConfig jsonConfig = new JsonConfig(); //注册值处理器 jsonConfig.registerJsonValueProcessor(Date.class, jsonProcessor); String json = JSONSerializer.toJSON(testBean , jsonConfig).toString(); System.out.println(json); } }
结果符合我的要求如下:
{"name":"1234","price":3.14145,"time":"2010-11-09T19:46:29"}
ExtJs提交表单页面总回调failure解决方法
记得这个问题搞了一个多小时,真悲剧...
原因:回调success或failure是根据返回来的参数的json串中的"success"的值来决定的
例如返回:{"success":true}则调用success,如果返回{"success":false}则调用failure,因此在与Strust2中的Action中加入属性boolean success即可,并且需将其序列化为名字为"success",如下:
@JSON(name = "success") public boolean isSuccess() { return success; }
Action可通过设定success的属性值来控制是返回success或failure
javaEE中ClassNotFoundException小结
小小的总结一下:
1.ClassNotFoundException: javax.persistence.Entity
解决方法:加入Hibernate文件夹下的ejb3-persistence.jar即可
2.java.lang.ClassNotFoundException: javax.transaction.TransactionManager
解决方法:
引入如下几个包:
javaee.jar
jsf-api.jar
jsf-impl.jar
jstl-1.2.jar
jta.jar
很郁闷的是MyEclipse已经有了这几个包了,我用了笨方法,把这几个包复制出来,自个建个包目录然后引入工程即可。
ExtJs ComboBox提交值的问题
前不久做的一个登录框,下拉选择框是选择登录的角色,本来设定name='userBean.role',但是后台Action打印发现,得到的总是页面上的显示值,这显然不是我想要的,谷歌发现:
只要想得到真实设定的值,只需要把属性换成hiddenName即可,即hiddenName='userBean.role'
Could not find template in cache 错误的解决方法
今天,做Strust2的东东,启动发现报如下错误:
Could not find template in cache, creating new one的错误
百度之得解决方法,可以在Action的地方写入如下代码:(我是在BaseAction中的构造函数写入)
public BaseAction(){ try { freemarker.log.Logger.selectLoggerLibrary(freemarker.log.Logger.LIBRARY_NONE); logger.debug("加载[freemarker]成功"); } catch (ClassNotFoundException e) { logger.error("未找到类",e); } }
而后问题就消失了..