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 \r\n");

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 + "\r\n");

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 + "\r\n");

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 = "[email protected]";

3.    protected String msgSubject = "babytree";

4.    protected String msgCc = "[email protected]";

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("[email protected]"));

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

时间: 2024-10-13 06:40:26

Java经典实例(第二版)的相关文章

《Java面向对象编程第二版》今年出版以来获得读者一致好评。

<Java面向对象编程第一版>自2016年出版以来,承蒙读者们的厚爱,至今已经重印了二十多次,成为国内Java领域里的经典Java技术宝典.在当当网上获得了1500多条好评: http://product.dangdang.com/9186890.html?point=comment_point 应广大读者的要求,为第一版进行了升级,第二版融合了最新的Java8的语言特性,它继续为Java开发人员们提供丰富全面的技术支持和帮助.在京东网上读者们对第二版的好评如潮,一致认为这是Java开发人员必

《Java面向对象编程第二版》即将出版

<Java面向对象编程第一版>自2016年出版以来,承蒙读者们的厚爱,至今已经重印了二十多次,成为国内Java领域里的经典Java技术宝典.应广大读者的要求,在过去的几个月,为第一版进行了升级,第二版融合了最新的Java8的语言特性,希望它能继续为Java开发人员们提供丰富全面的技术支持和帮助. 本书技术支持网址为:www.javathinker.net

《算法竞赛入门经典(第二版)》pdf

下载地址:网盘下载 内容简介  · · · · · · <算法竞赛入门经典(第2版)>是一本算法竞赛的入门与提高教材,把C/C++语言.算法和解题有机地结合在一起,淡化理论,注重学习方法和实践技巧.全书内容分为12 章,包括程序设计入门.循环结构程序设计.数组和字符串.函数和递归.C++与STL入门.数据结构基础.暴力求解法.高效算法设计.动态规划初步.数学概念与方法.图论模型与算法.高级专题等内容,覆盖了算法竞赛入门和提高所需的主要知识点,并含有大量例题和习题.书中的代码规范.简洁.易懂,不

JAVA面向对象程序设计(第二版) 袁绍欣 第六章答案

1.this 和 super 各有几种用法? 普通的直接引用,this指向当前对象 形参与成员名字重名,用 this 来区分:子类和父类中的成员重名,使用 super 引用构造函数 2.子类对象实例化的具体过程是什么? 先调用父类的构造函数,再调用自己的构造函数 3.类的域变量和方法中定义的局部变量在初始化上有何区别? 类的域变量在类实例化的时候进行初始化,方法中的局部变量在方法内部显式初始化 5.接口有什么用?自己定义一个接口,并给出实现类和使用类 实现多重继承 接口是一种标准,使用者按照接口

算法竞赛入门经典(第二版) - 第二章 思考题及习题

题目1(必要的储存量) 输入一些数,统计个数.(无需数组) 输入一些数,求最大值.最小值和平均数.(无需数组) 输入一些数,哪两个数最接近.(需要数组) 输入一些数,求第二大的值.(无需数组) 输入一些数,求它们的方差.(需要数组) 输入一些数,统计不超过平均数的个数.(无需数组) 题目2(统计字符1的个数) maxn设置的值过大,系统很可能无法分配如此大的内存. 判断语句应该改为if (s[i] == '1'),1是数值,'1'是字符. 使用string.h头文件的下的strlen函数但未包含

Java经典实例:比较浮点数

/** * Created by Frank * 比较浮点数 */ public class FloatCmp { // 公差 private final static Double EPSILON = 0.0000001; public static void main(String[] args) { double da = 3 * .3333333333; double db = 0.99999992857; // 基本类型可以优先使用==进行比较 if (da == db) { Syst

Java经典实例:把字符串解析为日期时间

Java版本:1.8开始 import java.time.LocalDate; import java.time.LocalDateTime; /** * Created by Frank */ public class DateParse { public static void main(String[] args) { String armisticeDate = "1914-11-11"; LocalDate alD = LocalDate.parse(armisticeDa

Java 经典实例:自定义迭代器

编写自己的Iterator,实现Iterator接口,这里多说一句,实现Iterable后,可以用"foreach"循环遍历你的对象. import java.util.Iterator; import java.util.NoSuchElementException; /** * 演示Iterator和Iterable接口,并说明怎样编写一个用于对象数组的简单迭代器. */ public class AarrayIterator<T> implements Iterabl

Java经典实例:使用DateFormatter来格式化日期时间

Java版本:1.8开始 import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; /** * Created by Frank */ public class CurrentDatetime { public static voi