Java经典实例(第二版) 1. 获取环境变量 Java代码 1. System.getenv("PATH"); 2. System.getenv("JAVA_HOME"); 2. 获取系统属性 Java代码 1. System.getProperty("pencil color"); // 得到属性值 2. java -Dpencil color=green 3. System.getProperty("java.specification.version"); // 得到Java版本号 4. Properties p = System.getProperties(); // 得到所有属性值 5. p.list(System.out); 3. StringTokenizer Java代码 1. // 能够同时识别, 和 | 2. StringTokenizer st = new StringTokenizer("Hello, World|of|Java", ", |"); 3. while (st.hasMoreElements()) { 4. st.nextToken(); 5. } 6. 7. // 把分隔符视为token 8. StringTokenizer st = new StringTokenizer("Hello, World|of|Java", ", |", true); 4. StringBuffer(同步)和StringBuilder(非同步) Java代码 1. StringBuilder sb = new StringBuilder(); 2. sb.append("Hello"); 3. sb.append("World"); 4. sb.toString(); 5. new StringBuffer(a).reverse(); // 反转字符串 5. 数字 Java代码 1. // 数字与对象之间互相转换 - Integer转int 2. Integer.intValue(); 3. 4. // 浮点数的舍入 5. Math.round() 6. 7. // 数字格式化 8. NumberFormat 9. 10. // 整数 -> 二进制字符串 11. toBinaryString() 或valueOf() 12. 13. // 整数 -> 八进制字符串 14. toOctalString() 15. 16. // 整数 -> 十六进制字符串 17. toHexString() 18. 19. // 数字格式化为罗马数字 20. RomanNumberFormat() 21. 22. // 随机数 23. Random r = new Random(); 24. r.nextDouble(); 25. r.nextInt(); 6. 日期和时间 Java代码 1. // 查看当前日期 2. Date today = new Date(); 3. Calendar.getInstance().getTime(); 4. 5. // 格式化默认区域日期输出 6. DateFormat df = DateFormat.getInstance(); 7. df.format(today); 8. 9. // 格式化制定区域日期输出 10. DateFormat df_cn = DateFormat.getDateInstance(DateFormat.FULL, Locale.CHINA); 11. String now = df_cn.format(today); 12. 13. // 按要求格式打印日期 14. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 15. sdf.format(today); 16. 17. // 设置具体日期 18. GregorianCalendar d1 = new GregorianCalendar(2009, 05, 06); // 6月6日 19. GregorianCalendar d2 = new GregorianCalendar(); // 今天 20. Calendar d3 = Calendar.getInstance(); // 今天 21. d1.getTime(); // Calendar或GregorianCalendar转成Date格式 22. d3.set(Calendar.YEAR, 1999); 23. d3.set(Calendar.MONTH, Calendar.APRIL); 24. d3.set(Calendar.DAY_OF_MONTH, 12); 25. 26. // 字符串转日期 27. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 28. Date now = sdf.parse(String); 29. 30. // 日期加减 31. Date now = new Date(); 32. long t = now.getTime(); 33. t += 700*24*60*60*1000; 34. Date then = new Date(t); 35. 36. Calendar now = Calendar.getInstance(); 37. now.add(Calendar.YEAR, -2); 38. 39. // 计算日期间隔(转换成long来计算) 40. today.getTime() - old.getTime(); 41. 42. // 比较日期 43. Date 类型,就使用equals(), before(), after()来计算 44. long类型,就使用==, <, >来计算 45. 46. // 第几日 47. 使用 Calendar的get()方法 48. Calendar c = Calendar.getInstance(); 49. c.get(Calendar.YEAR); 50. 51. // 记录耗时 52. long start = System.currentTimeMillis(); 53. long end = System.currentTimeMillis(); 54. long elapsed = end - start; 55. System.nanoTime(); //毫秒 56. 57. // 长整形转换成秒 58. Double.toString(t/1000D); 7. 结构化数据 Java代码 1. // 数组拷贝 2. System.arrayCopy(oldArray, 0, newArray, 0, oldArray.length); 3. 4. // ArrayList 5. add(Object o) // 在末尾添加给定元素 6. add(int i, Object o) // 在指定位置插入给定元素 7. clear() // 从集合中删除全部元素 8. Contains(Object o) // 如果Vector包含给定元素,返回真值 9. get(int i) // 返回 指定位置的对象句柄 10. indexOf(Object o) // 如果找到给定对象,则返回其索引值;否则,返回-1 11. remove(Object o) // 根据引用删除对象 12. remove(int i) // 根据 位置删除对象 13. toArray() // 返回包含集合对象的数组 14. 15. // Iterator 16. List list = new ArrayList(); 17. Iterator it = list.iterator(); 18. while (it.hasNext()) 19. Object o = it.next(); 20. 21. // 链表 22. LinkedList list = new LinkedList(); 23. ListIterator it = list.listIterator(); 24. while (it.hasNext()) 25. Object o = it.next(); 26. 27. // HashMap 28. HashMap<String, String> hm = new HashMap<String, String>(); 29. hm.get(key); // 通过key得到value 30. hm.put("No1", "Hexinyu"); 31. hm.put("No2", "Sean"); 32. // 方法1: 获取全部键值 33. Iterator<String> it = hm.values().iterator(); 34. while (it.hasNext()) { 35. String myKey = it.next(); 36. String myValue = hm.get(myKey); 37. } 38. // 方法2: 获取全部键值 39. for (String key : hm.keySet()) { 40. String myKey = key; 41. String myValue = hm.get(myKey); 42. } 43. 44. // Preferences - 与系统相关的用户设置,类似名-值对 45. Preferences prefs = Preferences.userNodeForPackage(ArrayDemo.class); 46. String text = prefs.get("textFontName", "lucida-bright"); 47. String display = prefs.get("displayFontName", "lucida-balckletter"); 48. System.out.println(text); 49. System.out.println(display); 50. // 用户设置了新值,存储回去 51. prefs.put("textFontName", "new-bright"); 52. prefs.put("displayFontName", "new-balckletter"); 53. 54. // Properties - 类似名-值对,key和value之间,可以用"=",":"或空格分隔,用"#" 和"!"注释 55. InputStream in = MediationServer.class.getClassLoader().getResourceAsStream("msconfig.properties"); 56. Properties prop = new Properties(); 57. prop.load(in); 58. in.close(); 59. prop.setProperty(key, value); 60. prop.getProperty(key); 61. 62. // 排序 63. 1. 数组:Arrays.sort(strings); 64. 2. List:Collections.sort(list); 65. 3. 自定义类:class SubComp implements Comparator 66. 然 后使用Arrays.sort(strings, new SubComp()) 67. 68. // 两个接口 69. 1. java.lang.Comparable: 提供对象的自然排序,内置于类中 70. int compareTo(Object o); 71. boolean equals(Object o2); 72. 2. java.util.Comparator: 提供特定的比较方法 73. int compare(Object o1, Object o2) 74. 75. // 避免重复排序,可以使用TreeMap 76. TreeMap sorted = new TreeMap(unsortedHashMap); 77. 78. // 排除重复元素 79. Hashset hs - new HashSet(); 80. 81. // 搜索对象 82. binarySearch(): 快 速查询 - Arrays, Collections 83. contains(): 线型搜 索 - ArrayList, HashSet, Hashtable, linkedList, Properties, Vector 84. containsKey(): 检 查集合对象是否包含给定 - HashMap, Hashtable, Properties, TreeMap 85. containsValue(): 主 键(或给定值) - HashMap, Hashtable, Properties, TreeMap 86. indexOf(): 若 找到给定对象,返回其位置 - ArrayList, linkedList, List, Stack, Vector 87. search(): 线 型搜素 - Stack 88. 89. // 集合转数组 90. toArray(); 91. 92. // 集合总结 93. Collection: Set - HashSet, TreeSet 94. Collection: List - ArrayList, Vector, LinkedList 95. Map: HashMap, HashTable, TreeMap 8. 泛型与foreach Java代码 1. // 泛型 2. List<String> myList = new ArrayList<String>(); 3. 4. // foreach 5. for (String s : myList) { 6. System.out.println(s); 7. } 9. 面向对象 Java代码 1. // toString()格式化 2. public class ToStringWith { 3. int x, y; 4. public ToStringWith(int anX, int aY) { 5. x = anX; 6. y = aY; 7. } 8. public String toString() { 9. return "ToStringWith[" + x + "," + y + "]"; 10. } 11. public static void main(String[] args) { 12. System.out.println(new ToStringWith(43, 78)); 13. } 14. } 15. 16. // 覆盖equals方法 17. public boolean equals(Object o) { 18. if (o == this) // 优化 19. return true; 20. if (!(o instanceof EqualsDemo)) // 可投射到这个类 21. return false; 22. EqualsDemo other = (EqualsDemo)o; // 类型转换 23. if (int1 != other.int1) // 按字段比较 24. return false; 25. if (!obj1.equals(other.obj1)) 26. return false; 27. return true; 28. } 29. 30. // 覆盖hashcode方法 31. private volatile int hashCode = 0; //延迟初始化 32. public int hashCode() { 33. if (hashCode == 0) { 34. int result = 17; 35. result = 37 * result + areaCode; 36. } 37. return hashCode; 38. } 39. 40. // Clone方法 41. 要 克隆对象,必须先做两步: 1. 覆盖对象的clone()方法; 2. 实现空的Cloneable接口 42. public class Clone1 implements Cloneable { 43. public Object clone() { 44. return super.clone(); 45. } 46. } 47. 48. // Finalize方法 49. Object f = new Object() { 50. public void finalize() { 51. System.out.println("Running finalize()"); 52. } 53. }; 54. Runtime.getRuntime().addShutdownHook(new Thread() { 55. public void run() { 56. System.out.println("Running Shutdown Hook"); 57. } 58. }); 59. 在 调用System.exit(0);的时候,这两个方法将被执行 60. 61. // Singleton模式 62. // 实现1 63. public class MySingleton() { 64. public static final MySingleton INSTANCE = new MySingleton(); 65. private MySingleton() {} 66. } 67. // 实现2 68. public class MySingleton() { 69. public static MySingleton instance = new MySingleton(); 70. private MySingleton() {} 71. public static MySingleton getInstance() { 72. return instance; 73. } 74. } 75. 76. // 自定义异常 77. Exception: 编 译时检查 78. RuntimeException: 运行时检查 79. public class MyException extends RuntimeException { 80. public MyException() { 81. super(); 82. } 83. public MyException(String msg) { 84. super(msg); 85. } 86. } 10. 输入和输出 Java代码 1. // Stream, Reader, Writer 2. Stream: 处 理字节流 3. Reader/Writer: 处理字符,通用Unicode 4. 5. // 从标准输入设备读数据 6. 1. 用System.in的BufferedInputStream()读取字节 7. int b = System.in.read(); 8. System.out.println("Read data: " + (char)b); // 强 制转换为字符 9. 2. BufferedReader 读取文本 10. 如果从Stream转成Reader,使用 InputStreamReader类 11. BufferedReader is = new BufferedReader(new 12. InputStreamReader(System.in)); 13. String inputLine; 14. while ((inputLine = is.readLine()) != null) { 15. System.out.println(inputLine); 16. int val = Integer.parseInt(inputLine); // 如果inputLine为整数 17. } 18. is.close(); 19. 20. // 向标准输出设备写数据 21. 1. 用System.out的println()打印数据 22. 2. 用PrintWriter打印 23. PrintWriter pw = new PrintWriter(System.out); 24. pw.println("The answer is " + myAnswer + " at this time."); 25. 26. // Formatter类 27. 格 式化打印内容 28. Formatter fmtr = new Formatter(); 29. fmtr.format("%1$04d - the year of %2$f", 1951, Math.PI); 30. 或 者System.out.printf();或者System.out.format(); 31. 32. // 原始扫描 33. void doFile(Reader is) { 34. int c; 35. while ((c = is.read()) != -1) { 36. System.out.println((char)c); 37. } 38. } 39. 40. // Scanner扫描 41. Scanner 可以读取File, InputStream, String, Readable 42. try { 43. Scanner scan = new Scanner(new File("a.txt")); 44. while (scan.hasNext()) { 45. String s = scan.next(); 46. } 47. } catch (FileNotFoundException e) { 48. e.printStackTrace(); 49. } 50. } 51. 52. // 读取文件 53. BufferedReader is = new BufferedReader(new FileReader("myFile.txt")); 54. BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bytes.bat")); 55. is.close(); 56. bos.close(); 57. 58. // 复制文件 59. BufferedIutputStream is = new BufferedIutputStream(new FileIutputStream("oldFile.txt")); 60. BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream("newFile.txt")); 61. int b; 62. while ((b = is.read()) != -1) { 63. os.write(b); 64. } 65. is.close(); 66. os.close(); 67. 68. // 文件读入字符串 69. StringBuffer sb = new StringBuffer(); 70. char[] b = new char[8192]; 71. int n; 72. // 读一个块,如果有字符,加入缓冲区 73. while ((n = is.read(b)) > 0) { 74. sb.append(b, 0, n); 75. } 76. return sb.toString(); 77. 78. // 重定向标准流 79. String logfile = "error.log"; 80. System.setErr(new PrintStream(new FileOutputStream(logfile))); 81. 82. // 读写不同字符集文本 83. BufferedReader chinese = new BufferedReader(new InputStreamReader(new FileInputStream("chinese.txt"), "ISO8859_1")); 84. PrintWriter standard = new PrintWriter(new OutputStreamWriter(new FileOutputStream("standard.txt"), "UTF-8")); 85. 86. // 读取二进制数据 87. DataOutputStream os = new DataOutputStream(new FileOutputStream("a.txt")); 88. os.writeInt(i); 89. os.writeDouble(d); 90. os.close(); 91. 92. // 从指定位置读数据 93. RandomAccessFile raf = new RandomAccessFile(fileName, "r"); // r表示已 只读打开 94. raf.seek(15); // 从15开始读 95. raf.readInt(); 96. raf.radLine(); 97. 98. // 串行化对象 99. 对象串 行化,必须实现Serializable接口 100. // 保存 数据到磁盘 101. ObjectOutputStream os = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(FILENAME))); 102. os.writeObject(serialObject); 103. os.close(); 104. // 读出数据 105. ObjectInputStream is = new ObjectInputStream(new FileInputStream(FILENAME)); 106. is.readObject(); 107. is.close(); 108. 109. // 读写Jar或Zip文档 110. ZipFile zippy = new ZipFile("a.jar"); 111. Enumeration all = zippy.entries(); // 枚举值列出所有文件清单 112. while (all.hasMoreElements()) { 113. ZipEntry entry = (ZipEntry)all.nextElement(); 114. if (entry.isFile()) 115. println("Directory: " + entry.getName()); 116. 117. // 读写文件 118. FileOutputStream os = new FileOutputStream(entry.getName()); 119. InputStream is = zippy.getInputStream(entry); 120. int n = 0; 121. byte[] b = new byte[8092]; 122. while ((n = is.read(b)) > 0) { 123. os.write(b, 0, n); 124. is.close(); 125. os.close(); 126. } 127. } 128. 129. // 读写gzip文档 130. FileInputStream fin = new FileInputStream(FILENAME); 131. GZIPInputStream gzis = new GZIPInputStream(fin); 132. InputStreamReader xover = new InputStreamReader(gzis); 133. BufferedReader is = new BufferedReader(xover); 134. String line; 135. while ((line = is.readLine()) != null) 136. System.out.println("Read: " + line); 11. 目录和文件操作 Java代码 1. // 获取文件信息 2. exists(): 如 果文件存在,返回true 3. getCanonicalPath(): 获 取全名 4. getName(): 文件名 5. getParent(): 父 目录 6. canRead(): 如果文件可读,返回true 7. canWrite(): 如 果文件可写,返回true 8. lastModified(): 文 件更新时间 9. length(): 文件大小 10. isFile(): 如 果是文件,返回true 11. ifDirectory(): 如 果是目录,返回true 12. 要 调用文件的这些方法,必须 13. File f = new File(fileName); 14. 15. // 创建文件 16. File f = new File("c:\test\mytest.txt"); 17. f.createNewFile(); // 创建mytest.txt文件到test目录下 18. 19. // 修改文件名 20. File f = new File("c:\test\mytest.txt"); 21. f.renameTo(new File("c:\test\google.txt")); 22. 把 mytest.txt修改成google.txt 23. 24. // 删除文件 25. File f = new File("c:\test\mytest.txt"); 26. f.delete(); 27. 28. // 临时文件 29. File f = new File("C:\test"); // 指定一个文件夹 30. // 在test文件夹中创建foo前缀,tmp后缀的临时文件 31. File tmp = File.createTempFile("foo", "tmp", f); 32. tmp.deleteOnExit(); // 在程序结束时删除该临时文件 33. 34. // 更改文件属性 35. setReadOnly(): 设 置为只读 36. setlastModified(): 设置最后更改时间 37. 38. // 列出当前文件夹的文件列表 39. String[] dir = new java.io.File(".").list(); 40. java.util.Arrays.sort(dir); 41. for (int i = 0; i < dir.length; i++) { 42. System.out.println(dir[i]); 43. } 44. 45. // 过滤文件列表 46. class OnlyJava implements FilenameFilter { 47. public boolean accept(File dir, String s) { 48. if (s.endsWith(".java") || s.endsWith(".class") || s.endsWith(".jar")) 49. return true; 50. } 51. } 52. 53. // 获取根目录 54. File[] rootDir = File.listRoots(); 55. for (int i = 0; i < rootDir.length; i++) { 56. System.out.println(rootDir[i]); 57. } 58. 59. // 创建新目录 60. new File("/home/ian/bin").mkdir(); // 如果"/home/ian"存在,则可以创建bin目录 61. new File("/home/ian/bin").mkdirs(); // 如果"/home/ian"不存在,会创建所有的目录 12. 国际化和本地化 Java代码 1. // I18N资源 2. ResourceBundle rb = ResourceBundle.getBundle("Menus"); 3. String label = rb.getString("exit.label"); 4. // ResourceBundle相当于名值对,获取Menus按钮的区域属性 5. Menus_cn.properties: 不 同区域的属性文件 6. 7. // 列出有效区域 8. Locale[] list = Locale.getAvailableLocales(); 9. 10. // 指定区域 11. Locale cnLocale = Locale.CHINA; 12. 13. // 设置默认区域 14. Locale.setDefault(Locale.CHINA); 15. 16. // 格式化消息 17. public class MessageFormatDemo { 18. static Object[] data = { 19. new java.util.Date(), 20. "myfile.txt", 21. "could nto be opened" 22. }; 23. public static void main(String[] args) { 24. String result = MessageFormat.format("At {0,time} on {0,date}, {1} {2}.", data); 25. System.out.println(result); 26. } 27. } 28. 输 出: At 10:10:08 on 2009-6-18, myfile.txt could nto be opened. 29. 30. // 从资源文件中读消息 31. Widgets.properties 在com.sean.cook.chap11下 32. ResourceBundle rb = ResourceBundle.getBundle("com.sean.cook.chap11.Widgets"); 33. String propt = rb.getString("filedialogs.cantopen.string"); 34. String result = MessageFormat.format(rb.getString("filedialogs.cantopen.format"), data); 13. 网络客户端 Java代码 1. // 访问服务器 2. Socket socket = new Socket("127.0.0.1", 8080); 3. // todo something 4. socket.close(); 5. 6. // 查找网络地址 7. InetAddress.getByName(hostName).getHostAddress()); // 根据主机名得到IP地址 8. InetAddress.getByName(ipAddr).getHostName()); // 根据IP地址得到主机名 9. 10. // 连接具体异常 11. UnknownHostException 12. NoRouteToHostException 13. ConnectException 14. 15. // Socket读写文本数据 16. BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 17. String remoteTime = in.readline(); 18. PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 19. out.print("send message to client "); 20. out.flush(); 21. 22. // Socket读写二进制数据 23. DataInputStream in = new DataInputStream(new BufferedInputStream(socket.getInputStream())); 24. long remoteTime = (long)(in.readUnsignedByte() << 24); 25. DataOutputStream out = new DataOutputStream(socket.getOutputStream(), true); 26. 27. // Socket读写串行化数据 28. ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(socket.getInputStream())); 29. Object o = in.readObject(); 30. if (o instanceof Date) // 验证对象类型 31. ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream(), true); 32. 33. // UDP数据报 34. private final static int PACKET_SIZE = 1024; 35. 36. String host = "EV001B389673DE"; 37. InetAddress serverAddr = InetAddress.getByName(host); 38. DatagramSocket socket = new DatagramSocket(); 39. byte[] buffer = new byte[PACKET_SIZE]; // 分配数据缓冲空间 40. DatagramPacket packet = new DatagramPacket(buffer, PACKET_SIZE, serverAddr, 8080); 41. packet.setLength(PACKET_SIZE-1); // 设置数据长度 42. socket.send(packet); 43. socket.receive(packet); // 接收数据 14. 服务器端: Socket Java代码 1. // 创建ServerSocket 2. ServerSocket serverSocket; 3. Socket clientSocket; 4. 5. serverSocket = new ServerSocket(9999); 6. while ((clientSocket = serverSocket.accept()) != null) { 7. System.out.println("Accept from client " + s.getInetAddress()); 8. s.close(); 9. } 10. 11. // 监听内部网 12. public static final short PORT = 9999; 13. public static final String INSIDE_HOST = "acmewidgets-inside"; // 网络接口名 14. public static final int BACKLOG = 10; // 待发数 15. serverSocket = new ServerSocket(PORT, BACKLOG, InetAddress.getByName(INSIDE_HOST)); 16. 17. // 返回相应对象 18. ServerSocket serverSocket = new ServerSocket(9999);; 19. Socket clientSocket; 20. BufferedReader in = null; 21. PrintWriter out = null; 22. while (true) { 23. clientSocket = serverSocket.accept(); 24. in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream(), "8859_1")); 25. out = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream(), "8859_1"), true); 26. String echoLine; 27. while ((echoLine = in.readLine()) != null) { 28. System.out.println("Read " + echoLine); 29. out.print(echoLine + " "); 30. } 31. } 32. 以 上例子返回字符串,如果返回二进制,则使用DataOutputStream;返回对象,使用ObjectOutputStream 33. 34. // 处理多客户端 35. 需要 把接收数据的处理放入多线程中 36. public class EchoServerThreaded { 37. public static final int ECHOPORT = 7; 38. public static final int NUM_THREADS = 4; 39. 40. public static void main(String[] av) { 41. new EchoServerThreaded(ECHOPORT, NUM_THREADS); 42. } 43. 44. public EchoServerThreaded2(int port, int numThreads) { 45. ServerSocket servSock; 46. Socket clientSocket; 47. try { 48. servSock = new ServerSocket(ECHOPORT); 49. } catch(IOException e) { 50. throw new RuntimeException("Could not create ServerSocket " + e); 51. } 52. for (int i = 0; i < numThreads; i++) { 53. new Handler(servSock, i).start(); 54. } 55. } 56. } 57. class Handler extends Thread { 58. ServerSocket servSock; 59. int threadNumber; 60. 61. Handler(ServerSocket s, int i) { 62. super(); 63. servSock = s; 64. threadNumber = i; 65. setName("Thread " + threadNumber); 66. } 67. 68. public void run() { 69. while (true) { 70. try { 71. System.out.println(getName() + " waiting"); 72. Socket clientSocket; 73. synchronized (servSock) { 74. clientSocket = servSock.accept(); 75. } 76. System.out.println(getName() + " starting, IP=" + clientSocket.getInetAddress()); 77. BufferedReader is = new BufferedReader(new InputStreamReader( 78. clientSocket.getInputStream())); 79. PrintStream os = new PrintStream(clientSocket.getOutputStream(), true); 80. String line; 81. while ((line = is.readLine()) != null) { 82. os.print(line + " "); 83. os.flush(); 84. } 85. System.out.println(getName() + " ENDED "); 86. clientSocket.close(); 87. } catch (IOException ex) { 88. System.out.println(getName() + ": IO Error on socket " + ex); 89. return; 90. } 91. } 92. } 93. } 94. 95. // 使用SSL和JSSE保护Web服务器 96. SSLServerSocketFactory ssf = (SSLServerSocketFactory)SSLServerSocketFactory.getDefault(); 97. ServerSocket serverSocket = ssf.createServerSocket(8080); 98. 99. // Log4j 100. Level 级别: DEBUG < INFO < WARN < ERROR < FATAL < OFF 101. Appender: 输 出信息 102. ConsoleAppender: 输出控制台 System.out 103. 104. // 找到网络接口 105. Enumeration list = NetworkInterface.getNetworkInterfaces(); 106. while (list.hasMoreElements()) { 107. NetworkInterface iface = (NetworkInterface)list.nextElement(); 108. System.out.println(iface.getDisplayName()); 109. Enumeration addrs = iface.getInetAddresses(); 110. while (addrs.hasMoreElements()) { 111. InetAddress addr = (InetAddress)addrs.nextElement(); 112. System.out.println(addr); 113. } 114. } 15. Java Mail Java代码 1. // 发送Mail 2. protected String msgRecIp = "hxydream@163.com"; 3. protected String msgSubject = "babytree"; 4. protected String msgCc = "nobody@erewhon.com"; 5. protected String msgBody = "test body"; 6. protected Session session; 7. protected Message msg; 8. 9. public void doSend() { 10. // 创建属性文件 11. Properties props = new Properties(); 12. props.put("mail.smtp.host", "mailhost"); 13. // 创建Session对象 14. session = Session.getDefaultInstance(props, null); 15. session.setDebug(true); 16. msg = new MimeMessage(session); // 创建邮件 17. msg. setFrom(new InternetAddress("nobody@host.domain")); 18. InternetAddress toAddr = new InternetAddress(msgRecIp); 19. msg.addRecipient(Message.RecipientType.TO, toAddr); 20. InternetAddress ccAddr = new InternetAddress(msgCc); 21. msg.addRecipient(Message.RecipientType.CC, ccAddr); 22. msg.setSubject(msgSubject); 23. msg.setText(msgBody); 24. Transport.send(msg); 25. } 26. 27. // 发送MIME邮件 28. Multipart mp = new MimeMultipart(); 29. BodyPart textPart = new MimeBodyPart(); 30. textPart.setText(message_body); // 设置类型"text/plain" 31. BodyPart pixPart = new MimeBodyPart(); 32. pixPart.setContent(html_data, "text/html"); 33. mp.addBodyPart(textPart); 34. mp.addBodyPart(pixPart); 35. mesg.setContent(mp); 36. Transport.send(mesg); 37. 38. // 读Mail 39. Store store = session.getStore(protocol); 40. store.connect(host, user, password); 41. Folder rf; 42. rf = store.getFolder(root); 43. rf = store.getDefaultFolder(); 44. rf.open(Folder.READ_WRITE); 16. 数据库访问 Java代码 1. // JDO 2. Properties p = new Properties(); 3. p.load(new FileInputStream("jdo.properties")); 4. PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory(p); 5. PersistenceManager pm = pmf.getPersistenceManager(); 6. // 提交数据 7. pm.currentTransaction().begin(); 8. if (o instanceof Collection) { 9. pm.makePersistentAll((Collection) o); 10. } else { 11. pm.makePersistent(o); 12. } 13. pm.currentTransaction().commit(); 14. pm.close(); 15. // 取出数据 16. Object[] data = new Object[3]; 17. pm.retrieveAll(data); 18. for (int i = 0; i < data.length; i++) { 19. System.out.println(data[i]); 20. } 21. pm.close(); 22. 23. // 数据操作 24. Class clz = Class.forName("oracle.jdbc.driver.OracleDriver"); 25. String dbUrl = "jdbc:oracle:thin:@192.168.0.23:1521#:nms"; 26. Connection conn = DriverManager.getConnection(dbUrl, "su", "1234"); 27. Statement stmt = conn.createStatement(); 28. ResultSet rs = stmt.executeQuery("select * from pmtable"); 29. while (rs.next()) { 30. String name = rs.getString(1); 31. String otherName = rs.getString("name"); 32. } 33. 34. // 使用PreparedStatement提高性能,除了查询,都使用executeUpdate执行操作 35. PreparedStatement pstmt = conn.prepareStatement("select * from pmtable where name = ?"); 36. pstmt.setString(1, "sean"); 37. ResultSet rs = pstmt.executeQuery(); 38. 39. // 调用存储过程 40. CallableStatement cs = conn.prepareCall("{ call ListDefunctUsers }"); 41. ResultSet rs = cs.executeQuery(); 42. 43. // 显示数据库表信息 44. DatabaseMetaData meta = conn.getMetaData(); 45. meta.getDatabaseProductName(); 46. meta.getDatabaseProductVersion(); 47. meta.getDefaultTransactionIsolation(); 17. XML SAX: 在读取文档提取相应的标记事件(元素起始、元素结束、文档起始) DOM: 在内存中构造与文档中元素相应的树,可以遍历、搜索、修改 DTD: 验证文档是否正确 JAXP: 用于XML处理的Java API Castor: 开源项目,用于Java对象与XML映射 Java代码 1. // 从对象中生成XML 2. private final static String FILENAME = "serial.xml"; 3. public static void main(String[] args) throws IOException { 4. String a = "hard work and best callback"; 5. new SerialDemoXML().write(a); 6. new SerialDemoXML().dump(); 7. } 8. public void write(Object obj) throws IOException { 9. XMLEncoder os = new XMLEncoder(new BufferedOutputStream(new FileOutputStream(FILENAME))); 10. os.writeObject(obj); 11. os.close(); 12. } 13. public void dump() throws IOException { 14. XMLDecoder out = new XMLDecoder(new BufferedInputStream(new FileInputStream(FILENAME))); 15. System.out.println(out.readObject()); 16. out.close(); 17. } 18. serial.xml 格式内容如下: 19. <?xml version="1.0" encoding="UTF-8"?> 20. <java version="1.6.0_02" class="java.beans.XMLDecoder"> 21. <string>hard work and best callback</string> 22. </java> 23. 控 制台输出 24. hard work and best callback 25. 26. // XSLT转换XML 27. XSLT 可以用来对输出格式进行各种控制 28. Transformer tx = TransformerFactory.newInstance().newTransformer(new StreamSource("people.xml")); 29. tx.transform(new StreamSource("people.xml"), new StreamResult("people.html")); 30. 31. // 用SAX解析XML - 主要用于查找关键元素,不用全文遍历 32. public SaxLister() throws SAXException, IOException { 33. XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser"); 34. parser.setContentHandler(new PeopleHandler()); 35. parser.parse("C:\StudySource\javacooksrc2\xml\people.xml"); 36. } 37. class PeopleHandler extends DefaultHandler { 38. boolean parent = false; 39. boolean kids = false; 40. public void startElement(String nsURI, String localName, String rawName, Attributes attr) throws SAXException { 41. System.out.println("startElement: " + localName + "," + rawName); 42. if (rawName.equalsIgnoreCase("name")) 43. parent = true; 44. if (rawName.equalsIgnoreCase("children")) 45. kids = true; 46. } 47. public void characters(char[] ch, int start, int length) { 48. if (parent) { 49. System.out.println("Parent: " + new String(ch, start, length)); 50. parent = false; 51. } else if (kids) { 52. System.out.println("Children: " + new String(ch, start, length)); 53. kids = false; 54. } 55. } 56. public PeopleHandler() throws SAXException { 57. super(); 58. } 59. } 60. 61. // DOM解析XML - 遍历整个树 62. String uri = "file:" + new File("C:\StudySource\javacooksrc2\xml\people.xml").getAbsolutePath(); 63. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 64. DocumentBuilder builder = factory.newDocumentBuilder(); 65. Document doc = builder.parse(uri); 66. NodeList nodes = doc.getChildNodes(); 67. for (int i = 0; i < nodes.getLength(); i++) { 68. Node n = nodes.item(i); 69. switch (n.getNodeType()) { 70. case Node.ELEMENT_NODE: 71. // todo 72. break; 73. case Node.TEXT_NODE: 74. // todo 75. break; 76. } 77. } 78. 79. // 使用DTD或者XSD验证 80. 定 义好DTD或XSD文件 81. XmlDocument doc = XmlDocument.createXmlDocument(uri, true); 82. 83. // 用DOM生成XML 84. DocumentBuilderFactory fact = DocumentBuilderFactory.newInstance(); 85. DocumentBuilder parser = fact.newDocumentBuilder(); 86. Document doc = parser.newDocument(); 87. Node root = doc.createElement("Poem"); 88. doc.appendChild(root); 89. Node stanza = doc.createElement("Stanza"); 90. root.appendChild(stanza); 91. Node line = doc.createElement("Line"); 92. stanza.appendChild(line); 93. line.appendChild(doc.createTextNode("Once, upon a midnight dreary")); 94. line = doc.createElement("Line"); 95. stanza.appendChild(line); 96. line.appendChild(doc.createTextNode("While I pondered, weak and weary")); 18. RMI Java代码 1. a. 定义 客户端与服务器之间的通信接口 2. public interface RemoteDate extends Remote { 3. public Date getRemoteDate() throws RemoteException; 4. public final static String LOOKUPNAME = "RemoteDate"; 5. } 6. 7. b. 编 写RMI服务器 8. public class RemoteDateImpl extends UnicastRemoteObject implements RemoteDate { 9. public RemoteDateImpl() throws RemoteException { 10. super(); 11. } 12. public Date getRemoteDate() throws RemoteException { 13. return new Date(); 14. } 15. } 16. RemoteDateImpl im = new RemoteDateImpl(); 17. System.out.println("DateServer starting..."); 18. Naming.rebind(RemoteDate.LOOKUPNAME, im); 19. System.out.println("DateServer ready."); 20. 21. c. 运 行rmic生成stub 22. javac RemoteDateImpl.java 23. rmic RemoteDateImpl 24. 25. d. 编 写客户端 26. netConn = (RemoteDate)Naming.lookup(RemoteDate.LOOKUPNAME); 27. Date today = netConn.getRemoteDate(); 28. System.out.println(today.toString()); 29. 30. e. 确 保RMI注册表运行 31. rmiregistry 32. 33. f. 启 动服务器 34. java RemoteDateImpl 35. 36. g. 运 行客户端 37. java DateClient 19. 包和包装机制 jar cvf /tmp/test.jar . // 当前目录压缩到test.jar中 jar xvf /tmp/test.jar // 把test.jar解压到当前目录 从指定class运行jar文件 a. Main-Class: HelloWord // 注意中间有一个空格 b. jar cvmf manifest.mf hello.jar HelloWorld.class c. java -jar hello.jar 20. Java线程 Java代码 1. // 停止线程 - 不要使用stop()方法 2. private boolean done = false; 3. public void run() { 4. while (!done) { 5. //todo 6. } 7. } 8. public void shutDown() { 9. done = true; 10. } 11. 可 以调用shutDown()方法来结束线程 12. 13. // 如果读取IO的时候出现堵塞,那么可以使用下面方法 14. public void shutDown() throws IOException { 15. if (io != null) 16. io.close(); 17. } 18. 19. // 启动一线程,等待控制台输入,使用join()方法来暂停当前线程,直到其他线程调用 20. Thread t = new Thread() { 21. public void run() { 22. System.out.println("Reading"); 23. try { 24. System.in.read(); 25. } catch (IOException e) { 26. System.err.println(e); 27. } 28. System.out.println("Thread finished."); 29. } 30. }; 31. System.out.println("Starting"); 32. t.start(); 33. System.out.println("Joining"); 34. try { 35. t.join(); 36. } catch (InterruptedException e) { 37. System.out.println("Who dares imterrupt my sleep?"); 38. } 39. System.out.println("Main finished."); 40. 41. // 加锁保证同步 42. Lock lock = new ReentrantLock(); 43. try { 44. lock.lock(); 45. // todo 46. } finally { 47. lock.unlock(); 48. } 49. 50. 线 程通信wait(), notify(), notifyAll() 51. 生产者-消费者模式 52. Executors 21. 内省或“命令类的类” Java代码 1. // 反射 2. Class c = Class.forName("java.lang.String"); 3. Constructor[] cons = c.getConstructors(); 4. for (int i = 0; i < cons.length; i++) { 5. System.out.println(cons[i].toString()); 6. } 7. Method[] meths = c.getMethods(); 8. for (int i = 0; i < meths.length; i++) { 9. System.out.println(meths[i].toString()); 10. } 11. 12. // 动态装载类 13. Class c = Class.forName("java.lang.String"); 14. Object obj = c.newInstance(); 15. 16. // 通过反射调用类的方法 17. class X { 18. public void master(String s) { 19. System.out.println("Working on "" + s + """); 20. } 21. } 22. Class clx = X.class; 23. Class[] argTypes = {String.class}; 24. Method worker = clx.getMethod("master", argTypes); 25. Object[] theData = {"Chocolate chips"}; 26. worker.invoke(new X(), theData); 27. 输 出: Working on "Chocolate chips" 22. Java与其他语言的结合 Java代码 1. // 执行CMD命令,在Eclipse控制台输出 2. Process p = Runtime.getRuntime().exec("C:/StudySource/ver.cmd"); 3. p.waitFor(); // 等待命令执行完 4. BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); 5. String s; 6. while ((s = br.readLine()) != null) 7. System.out.println(s); 8. 9. // 调用Jython - 计算22.0/7 10. BSFManager manager = new BSFManager(); 11. String[] fntypes = {".py"}; 12. manager.registerScriptingEngine("jython", "org.apache.bsf.engines.jython.JythonEngine", fntypes); 13. Object r = manager.eval("jython", "testString", 0, 0, "22.0/7"); 14. System.out.println("Result type is " + r.getClass().getName()); 15. System.out.println("Result value is " + r);