JAVA經典實例


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM