Liny_@NotePad

沉迷ACG中

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)。。

先贴代码:

  1. package org.yoyo.test;
  2.  
  3. import java.io.File;
  4. import java.io.IOException;
  5. import java.io.PrintWriter;
  6. import java.lang.reflect.InvocationTargetException;
  7. import java.lang.reflect.Method;
  8. import java.net.MalformedURLException;
  9. import java.net.URL;
  10. import java.net.URLClassLoader;
  11. import java.util.Scanner;
  12.  
  13. import com.sun.tools.javac.Main;
  14.  
  15. /**
  16. * 动态编译测试
  17. * @author YOYO
  18. */
  19. public class RuntimeCompileTest {
  20.  
  21.         /**
  22.          * CompileMain
  23.          */
  24.         private static Main javac = new Main();
  25.  
  26.         /**
  27.          * 创建临时文件存放代码
  28.          * @param codes
  29.          * @return
  30.          */
  31.         private File createFile(String codes) {
  32.                 try {
  33.                         File file = File.createTempFile("RuntimeCompile_", ".java",
  34.                                         new File(System.getProperty("user.dir")));
  35.                         String className = getClassName(file);
  36.                         PrintWriter writer = new PrintWriter(file);
  37.                         writer.write("public class " + className + " {" + "\r\n");
  38.                         writer.write("  public static void main(String[] args) {" + "\r\n");
  39.                         writer.write(codes);
  40.                         writer.write("  }" + "\r\n");
  41.                         writer.write("}" + "\r\n");
  42.                         writer.flush();
  43.                         writer.close();
  44.  
  45.                         return file;
  46.                 } catch (IOException e) {
  47.                         e.printStackTrace();
  48.                         return null;
  49.                 }
  50.         }
  51.  
  52.         /**
  53.          * 输入代码
  54.          * @return
  55.          */
  56.         private String inputCode() {
  57.                 StringBuffer codes = new StringBuffer("");
  58.  
  59.                 System.out.println("请输入Java代码:");
  60.                 Scanner scanner = new Scanner(System.in);
  61.                 while (scanner.hasNext()) {
  62.                         codes.append(scanner.nextLine() + "\r\n");
  63.                 }
  64.                 scanner.close();
  65.  
  66.                 return new String(codes);
  67.         }
  68.  
  69.         /**
  70.          * 编译
  71.          * @param fileName
  72.          * @return
  73.          */
  74.         @SuppressWarnings("static-access")
  75.         private synchronized int compile(String fileName) {
  76.                 String[] args = new String[] {"-d", System.getProperty("user.dir"), fileName};
  77.                 return javac.compile(args);
  78.         }
  79.  
  80.         /**
  81.          * 执行
  82.          * @param file
  83.          * @return
  84.          */
  85.         @SuppressWarnings("unchecked")
  86.         private synchronized boolean run(File file) {
  87.                 new File(file.getParent(), getClassName(file) + ".class").deleteOnExit();
  88.                 try {
  89.                         URL url = new URL("file:/" + System.getProperty("user.dir") + ""
  90.                                         + File.separator);
  91.                         URLClassLoader urlClass = new URLClassLoader(new URL[] { url });
  92.                         Class clazz = urlClass.loadClass(getClassName(file));
  93.                         Method main = clazz.getMethod("main",
  94.                                         new Class[] { String[].class });
  95.                         main.invoke(null, new Object[] { new String[0] });
  96.  
  97.                         return true;
  98.                 } catch (ClassNotFoundException e) {
  99.                         e.printStackTrace();
  100.                 } catch (SecurityException e) {
  101.                         e.printStackTrace();
  102.                 } catch (NoSuchMethodException e) {
  103.                         e.printStackTrace();
  104.                 } catch (IllegalArgumentException e) {
  105.                         e.printStackTrace();
  106.                 } catch (IllegalAccessException e) {
  107.                         e.printStackTrace();
  108.                 } catch (InvocationTargetException e) {
  109.                         e.printStackTrace();
  110.                 } catch (MalformedURLException e) {
  111.                         e.printStackTrace();
  112.                 }
  113.  
  114.                 return false;
  115.         }
  116.  
  117.         /**
  118.          * 获得类名
  119.          * @param file
  120.          * @return
  121.          */
  122.         private String getClassName(File file) {
  123.                 return file.getName().substring(0,
  124.                                 file.getName().length() - ".java".length());
  125.         }
  126.  
  127.         /**
  128.          * 测试
  129.          * @return
  130.          */
  131.         public boolean newTest() {
  132.                 File file = createFile(inputCode());
  133.                 if ("".equals(file.getName()) || 0 != compile(file.getName())) {
  134.                         return false;
  135.                 }
  136.                 return run(file);
  137.         }
  138.  
  139.         /**
  140.          * @param args
  141.          */
  142.         public static void main(String[] args) {
  143.                 System.out.println("Test : " + new RuntimeCompileTest().newTest());
  144.         }
  145.  
  146. }

com.sun.tools找不到的解决方法:在项目属性-Libraries里面加上jdk下面的tools.jar包即可。

java.lang.ClassNotFoundException引起原因:我原来用的是Class.forName(...)方法,这个方法只加载ClassPath里面的类,因此找不到。。
改成上面代码中的URLClassLoader来读取就可以了。

Java Graphics drawString 居中绘制文本

调用FontMetrics里的stringWidth方法可以获得文本的宽度,进行计算即可,以下是可直接调用的方法:

  1. public void drawString(Graphics g, String str, int xPos, int yPos) {
  2.         int strWidth = g.getFontMetrics().stringWidth(str);
  3.         g.drawString(str, xPos + strWidth / 2, yPos);
  4. }