SCJP复习笔记之Math中的方法
先只记几个舍入的……
- ceil 向上取整(ceil(-.01) = 0)
- floor 向下取整(floor(-.01)= -1)
- round 四舍五入:实现方式是floor(arg + 0.5)
round(0.49) = 0, round(0.50) = 1, round(0.51) = 1
round(-0.49) = 0, round(-0.50) = 0, round(-0.51) = -1
SCJP复习笔记之修饰符。。
看一下记一下。。有很多以前没有注意到的地方……
使用文件锁防止多个应用。。
原先发的是通过占用固定端口来判断程序是否重复打开,显然很容易和其他应用程序的端口冲突,
在研究Java能不能访问系统内核对象之前。。先用比较简单的方法:对一个文件加锁来防止多个应用重复打开。
这个方法的缺陷是需要另一个文件参与。
一个简单的非阻塞通讯DEMO。。。
nio的Channel + Selector实现,1服务端+n客户端
内容是客户端向服务端发送信息,服务端组播给所有客户端,并没有做客户端异常退出时的处理 - -。
写了一晚上终于。。囧无比……
由于设置interestOps时直接覆盖了原来的标记,没有做或操作,导致只能读一次,还查了半天 TAT。
具体流程是:
服务端 bind->关注OP_ACCEPT-->accept---->关注OP_READ------------------>READ信息,关注WRITE--------------->组WRITE
客户端 ---->关注OP_CONNECT-->connect-->关注OP_READ|OP_WRITE-->WRITE信息,取消关注OP_WRITE-->READ信息
乍看之下很Observer,但是实际上是Reactor(不同之处在于前者只与单个事件源关联,后者则是将事件分派到各自的处理程序中,与多个事件源关联)。
这样循环。。。客户端除了第一次connect关注了WRITE之外其他都是直接调用channel.write直接从通道输出。
(第一次connect时也可以,这里是为了演示如何发送OP_WRITE的……)
要注意OP_WRITE事件发生后要记得取消(register & ~OP_WRITE),因为OP_WRITE总是准备好的。。很容易卡住。
nio.Buffer小记
完全用数组来理解。。@ _ @
看了下Buffer的源码 居然跟想象的差不多也 ^^,的确是用数组存储,不过米有找到get和put的源码……
统计代码行数。。
话说之前直接用eclipse的代码行数统计,但是只能统计文件所有行数,不能统计具体的代码,我按照VC的那个统计行数的插件仿着写了个。。
统计指定扩展名下的总行数、纯代码行数、纯注释行数、代码混合注释行数、空行数以及非空行数。
试下动态编译。。
前几天看到了 今天米事就来写一写, = = 期间遇到了两个问题:
用eclipse来写com.sun.tools找不到,以及运行时找不到文件(java.lang.ClassNotFoundException)。。
先贴代码:
-
package org.yoyo.test;
-
-
import java.io.File;
-
import java.io.IOException;
-
import java.io.PrintWriter;
-
import java.lang.reflect.InvocationTargetException;
-
import java.lang.reflect.Method;
-
import java.net.MalformedURLException;
-
import java.net.URL;
-
import java.net.URLClassLoader;
-
import java.util.Scanner;
-
-
import com.sun.tools.javac.Main;
-
-
/**
-
* 动态编译测试
-
* @author YOYO
-
*/
-
public class RuntimeCompileTest {
-
-
/**
-
* CompileMain
-
*/
-
private static Main javac = new Main();
-
-
/**
-
* 创建临时文件存放代码
-
* @param codes
-
* @return
-
*/
-
try {
-
writer.write("public class " + className + " {" + "\r\n");
-
writer.write(" public static void main(String[] args) {" + "\r\n");
-
writer.write(codes);
-
writer.write(" }" + "\r\n");
-
writer.write("}" + "\r\n");
-
writer.flush();
-
writer.close();
-
-
return file;
-
e.printStackTrace();
-
return null;
-
}
-
}
-
-
/**
-
* 输入代码
-
* @return
-
*/
-
-
while (scanner.hasNext()) {
-
codes.append(scanner.nextLine() + "\r\n");
-
}
-
scanner.close();
-
-
}
-
-
/**
-
* 编译
-
* @param fileName
-
* @return
-
*/
-
@SuppressWarnings("static-access")
-
return javac.compile(args);
-
}
-
-
/**
-
* 执行
-
* @param file
-
* @return
-
*/
-
@SuppressWarnings("unchecked")
-
try {
-
Class clazz = urlClass.loadClass(getClassName(file));
-
-
return true;
-
e.printStackTrace();
-
e.printStackTrace();
-
e.printStackTrace();
-
e.printStackTrace();
-
e.printStackTrace();
-
e.printStackTrace();
-
e.printStackTrace();
-
}
-
-
return false;
-
}
-
-
/**
-
* 获得类名
-
* @param file
-
* @return
-
*/
-
return file.getName().substring(0,
-
file.getName().length() - ".java".length());
-
}
-
-
/**
-
* 测试
-
* @return
-
*/
-
public boolean newTest() {
-
if ("".equals(file.getName()) || 0 != compile(file.getName())) {
-
return false;
-
}
-
return run(file);
-
}
-
-
/**
-
* @param args
-
*/
-
}
-
-
}
com.sun.tools找不到的解决方法:在项目属性-Libraries里面加上jdk下面的tools.jar包即可。
java.lang.ClassNotFoundException引起原因:我原来用的是Class.forName(...)方法,这个方法只加载ClassPath里面的类,因此找不到。。
改成上面代码中的URLClassLoader来读取就可以了。
Java Graphics drawString 居中绘制文本
调用FontMetrics里的stringWidth方法可以获得文本的宽度,进行计算即可,以下是可直接调用的方法: