大家可以瀏覽我新的博客 dyin.cn
2006年6月5日 #
今天與大家分享的資源如下:
==================================================================================
JSP動態(tài)網(wǎng)頁制作
PHP動態(tài)網(wǎng)頁制作
ASP動態(tài)網(wǎng)頁制作
Perl動態(tài)網(wǎng)頁制作
winxp優(yōu)化大全
JSP程序設(shè)計
以上皆是視頻教程
如果你需要請你留下email我將會在晚上統(tǒng)一把種子發(fā)送到你的郵箱里,如果需要請抓緊,3天后將不再提供!
?
要考慮一個真正意義的全球資源,Web瀏覽器的內(nèi)容對每個接收到的用戶來說都是易讀的,現(xiàn)在大多數(shù)的全球資源的網(wǎng)站都是英文的.當(dāng)然,現(xiàn)在也在發(fā)生變化,有的網(wǎng)站為一些特定的國家定制一些非英文版本,比如,說英文的通過http://www.ibm.com/en/index.html來訪問,說中文的通過http://www.imb.com/cn/index.html來訪問,這些很多都是靜態(tài)的文本.怎么構(gòu)件一個動態(tài)生成的國際化內(nèi)容的網(wǎng)站就不是一個簡單的問題了. <% 運(yùn)行結(jié)果: ?Hola Mundo! <% 支持多國語言的Hello World
?? //中文 ?? //韓國語
國際化又稱Il8N,因為英文國家的國家化是Internationalization,它以I開始,以N結(jié)束,共18個字母.本地化又稱L18N,即是Localization.國際化的問題主要包含以下的一些內(nèi)容:
.日期,時間
.數(shù)字
.貨幣
.其它的一些特殊字符
也就是說不同的Locale,顯示日期,時間格式是不一樣的.當(dāng)然,不同的語言有自己不同的字符集.
HTML中的字符實體
HTML中的字符實體和XML的語言保持一致.它定義了用特定的字符序列顯示單字符的功能,這種字符序列稱為字符實體,它以" &"開頭,以";"結(jié)束.例如: © 表示字符"?";
看一例子顯示西班牙語的" Hello World":
<%@page contentType="text/html;charset=ISO-8859-1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
?? "
?? response.setHeader("Content-Language","es");
?? out.println("<html><head><title>En Español</title></head>");
?? out.println("<body>");
?? out.println("<h3>En espa%ntilde;ol</h3>");
?? out.println("¡Hola Mundo!");
?? out.println("</body></html>");
%>En espa%ntilde;ol
在HTML字符實體表示中,ñ代表了" ? "字符,使用response.setHeader("Content-Language","es");來設(shè)置HTML顯示時要使用的語言.
Unicode
Unicode字符標(biāo)準(zhǔn)是一個字符編碼系統(tǒng),它支持互相轉(zhuǎn)換,處理和顯示現(xiàn)在世界上不同語言的文本.在Java語言中,字符,字符串和標(biāo)始符在內(nèi)部使用16位的Unicode 2.0字符集表示.Unicode使用 " \uxxxx" 來表示一個字符,前256個Unicode字符和ISO-8859-1標(biāo)準(zhǔn)(Latin-1)的前256個字符一致.在Unicode世界中, "? ?? " 用 " \u00f1 " 表示.看怎么用Unicode來編寫西班牙語的Hello World:
<%@page contentType="text/html;charset=ISO-8859-1" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
?? "
?? response.setHeader("Content-Language","es");
?? out.println("<html><head><title>En Espa\u00f1ol</title></head>");
?? out.println("<body>");
?? out.println("<h3>En espa\u00f1ol</h3>");
?? out.println("\u00f1Hola Mundo!");
?? out.println("</body></html>");
%>
用語選擇語言的頁面:
語言處理頁面代碼:
<%@page contentType="text/plain;charset=UTF-8"
import="java.io.*,java.text.*,java.util.*,javax.servlet.jsp.*" %>
<html>
??? <head>
??????? <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
??????? <title>JSP Page</title>
??? </head>
??? <body>
<%!
?? Locale locale;
?? DateFormat format;
?? JspWriter writer;
%>
<%!
?? //英語
void processEnglish()throws Exception
{
??? locale=new Locale("en","US");
??? format=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG,locale);
??? writer.println("in english");
??? writer.println("<br>");
??? writer.println("HelloWorld");
??? writer.println(format.format(new Date()));
??? writer.flush();
}
void processChinese()throws Exception
{
??? locale=new Locale("zh","");
??? format=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG,locale);
??? writer.println("in Chinese");
??? writer.println("<br>");
??? writer.println("\u4f60\u597d\u4e16\u754c");
??? writer.println(format.format(new Date()));
??? writer.flush();
}
void processKorean()throws Exception
{
??? locale=new Locale("ko","");
??? format=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG,locale);
??? writer.println("in Korean");
??? writer.println("<br>");
??? writer.println("\uc548\ud558\uc138\uacc4");
??? writer.println(format.format(new Date()));
??? writer.flush();
}
//.........................其他的語言省略
%>
<%
??? //獲得請求的語種
???? String language=(String)request.getParameter("language");
???? int lan=Integer.parseInt(language);??
%>
<%
?? writer=out;
?? switch(lan)
?? {
?????? case 1:processEnglish();break;
?????? case 2:processChinese();break;
?????? case 3:processKorean();break;
?????? //case 4:processRussian();break;
?????? //case 5:processSpanish();break;
????? // case 6:processJapanese();break;
?? }
%>
??? </body>
</html>
處理的思路很簡單,首先獲得請求的語種,然后根據(jù)不同的語言來做不同的處理.
在JSP開發(fā)中我們常常會碰到以下的一些問題,其實都很有代表性. <html> ??? <h1>Login Checking Page</h1>
在不同的頁面或者用戶之間共享數(shù)據(jù)
在JSP中共享數(shù)據(jù),大體上可以分為兩種情況,第一種是在同一個用戶的不同也面之間共享數(shù)據(jù),另一種是在不同用戶之間共享數(shù)據(jù).
對于同一個用戶的會話,要想在不同的頁面之間共享數(shù)據(jù),可以有以下幾種選擇:
.把數(shù)據(jù)保存在Session中(最常見的方法)
.通過Cookie
.通過隱含表單提交到下一個頁面
.通過ServletContext對象
.通過Application對象
.通過文件系統(tǒng)或者數(shù)據(jù)庫
要在不同的用戶之間共享數(shù)據(jù),通常的方法是:
.通過ServletContext對象
.通過Application對象
.通過文件系統(tǒng)或者數(shù)據(jù)庫
可見,對于不同用戶之間共享數(shù)據(jù)的實現(xiàn)方法在同一個用戶的不同也面之間也能實現(xiàn)數(shù)據(jù)共享.
a.在同一個用戶的不同也面之間共享數(shù)據(jù)
1.使用session共享數(shù)據(jù)
用戶在瀏覽網(wǎng)頁時,由于HTTP協(xié)議是一種無狀態(tài)協(xié)議,往往在不同的頁面之間存在數(shù)據(jù)交換的問題,這就需要在這些不同的頁面之間共享數(shù)據(jù).在編程實現(xiàn)中我們常看到的方法是把共享數(shù)據(jù)保存在session中.這些共享數(shù)據(jù)可以是字符串或者與Java的原始數(shù)據(jù)類型相關(guān)的對象,也可以是一個Java對象.
exampl: 用戶登錄時,如果驗證成功,就把信息保存到一個userSession的類中,在其他的頁面可以讀取這個值.
userSession.java
package dory;
import java.util.Date;
/**
?*
?* @author Dory Doo
?*/
public class userSession {
??? private boolean isLogin=false;
??? private String userId;
??? private Date lastLoginTime;
??? private int logCount;
??? /** Creates a new instance of userSession */
??? public userSession() {
??? }
??? public void setIsLogin(boolean l)
??? {
??????? this.isLogin=l;
??? }
??? public void setUserId(String userId)
??? {
??????? this.userId=userId;
??? }
??? public void setLastLoginTime(Date l)
??? {
??????? this.lastLoginTime=l;
??? }
??? public void setLogCount(int logCount)
??? {
??????? this.logCount=logCount;
??? }
??? public boolean isLogin()
??? {
??????? return this.isLogin;
??? }
??? public String getUserId()
??? {
??????? return this.userId;
??? }
??? public Date getLastLoginTime()
??? {
??????? return this.lastLoginTime;
??? }
??? public int getLogCount()
??? {
??????? return this.logCount;
??? }
}
當(dāng)然這個就比較簡單的了,要的是整個思路.我們怎么來使用這個類,我們需要一個驗證登陸的頁login.jsp
<%@page contentType="text/html;charset=gb2312" language="java"
?import="java.sql.*,dory.*" errorPage=""%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
?? "
??? <head>
??????? <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
??????? <title>JSP Page</title>
??? </head>
??? <body>
<%
?? String name=request.getParameter("name");
?? String password=request.getParameter("password");
?? //Connection the Database,loading
?? //int logCount=resultSet.getInt("count");
?? //java.util.Date lastLoginTime=resultSet.getDate("LastLoginTime");
?? //這里簡單設(shè)置logCount和lastLoginTime的值
?? UserSession user=new UserSeesion();
?? user.setUserId(name);
?? user.setIsLogin(true);
?? user.setLastLoginTime(new java.util.Date());
?? user.setLogCount(10);
?? session.setAttribute("userSession",user)
?? response.sendRedirect("welcome.jsp");
%>
??? </body>
</html>
整個登陸頁面的過程是這樣的:
(1)獲得用戶的登陸信息
(2)連接數(shù)據(jù)庫進(jìn)行權(quán)限驗證
(3)如果通過驗證,那么讀取用戶的注冊信息
(4)把用戶的注冊信息保存到一個userSession對象中
(5)把userSession對象保存到Session內(nèi)建對象中
(6)把視圖派發(fā)到下一個顯示頁面
注意:session.setAttribute("userSession",user)把userSession的一個對象設(shè)置到Session中,Session只能保存對象,不能保存原始的數(shù)據(jù)類型,比如:
session.setAttribute("count",10)
是非法的語句,如果要把值為10的整數(shù)保存到Session中,需要使用以下的方法:
session.setAttribute("count",new Integer(10));
然后在另一個頁面使用
(Integer)session.getAttribute("count");
把這個整數(shù)讀出來.
我們用如下方法在另一個頁面中把userSesseion對象讀取出來:
<%@page contentType="text/html;charset=gb2312" language="java"
?import="java.sql.*,dory.*" errorPage=""%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
?? "<html>
??? <head>
??????? <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
??????? <title>JSP Page</title>
??? </head>
??? <body>??
<%
?? UserSession user=(UserSession)session.getAttribute("userSession");
?? try
?? {
?????? if(user.isLogin())
?????? {
?????????? out.print("welcome,your login id is:"+user.getUserId());
?????????? out.print("your last login time is:"+user.getLastLoginTime());
?????????? out.print("now you are the:"+user.getLogCount()+"times logging this website");
?????? }
?????? else
?????? {
?????????? response.sendRedirect("login.html");
?????? }
?? }
?? catch(Exception e)
?? {
?????? response.sendRedirect("login.html");
?? }
%>
??? </body>
</html>
可以看出,通過UserSession user=(UserSession)session.getAttribute("userSession");代碼來讀取在前一個頁面中設(shè)置的對象,然后再從這個對象讀取一些相關(guān)值.當(dāng)然我們也可以用JavaBean的形式來讀取.
2.使用隱含菜單
這種方式通過隱含菜單的形式把數(shù)據(jù)傳遞到下一個頁面,它有兩個局限性:
.只能在相鄰的兩個頁面之間傳遞數(shù)據(jù)
.客戶端可以使用查看網(wǎng)頁源代碼的方式獲得表單中的數(shù)據(jù),安全性不好
它的實現(xiàn)很簡單:
<form action="target.jsp">
<input type="hidden" name="test" value="abc">
<input type="hidden" name="test2" value="def">
</form>
在另外一個頁面中,通過這樣來獲得數(shù)據(jù):
String test=request.getParameter("test");
String test2=request.getParameter("test2");
3.使用Cookie
和Session不同,Cookie是放在客戶端的,由于客戶考慮到安全應(yīng)素可能會禁用cookie,這樣在使用cookie就會遇到麻煩了.
b.在不同的用戶之間共享數(shù)據(jù)
在不同的在不同的用戶之間共享數(shù)據(jù)最常見的方法是使用ServletContext和application對象,通過在一個用戶那里設(shè)置屬性在另一個用戶那里獲得這個屬性.
1.使用ServletContext
在JSP頁面中可以通過getServletContext()方法獲得ServletContext對象.在這種情況下不同的用戶通過它來工享數(shù)據(jù),看下面的實現(xiàn)代碼:
<%@page contentType="text/html;charset=gb2312" language="java"
import="java.sql.*,javax.servlet.*,javax.servlet.http.*,dory.*" errorPage="" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
?? "<%
?? request.setCharacterEncoding("gb2312");
%>
<html>
??? <head>
??????? <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
??????? <title>JSP Page</title>
??? </head>
??? <body>
??? a simple chatting room
??? <br><hr><font color="red">
<%
?? String content=(String)getServletContext().getAttribute(new String("chatTopic_1"));
?? out.print(content);
?? getServletContext().setAttribute("chatTopic_1",content+(String)request.getParameter("content")
?? +"<br>");
%>
??? </font>
??? <hr>
??? <form accept="Servelt Context_chat.jsp">
??????? <input type="text" name="content">
??????? <input type="submit" value="speak">
??? </form>
??? </body>
</html>
2.application對象
application對象對應(yīng)于每個web應(yīng)用來說只有一個,它使用和ServletContext差不多.如下:
<%@page contentType="text/html;charset=gb2312" language="java"
import="java.sql.*,javax.servlet.*,javax.servlet.http.*,dory.*" errorPage="" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
?? "<%
?? request.setCharacterEncoding("gb2312");
%>
<html>
??? <head>
??????? <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
??????? <title>JSP Page</title>
??? </head>
??? <body>
??? a simple chatting room
??? <br><hr><font color="red">
<%
?? String content=(String)application.getAttribute(new String("chatTopic_1"));
?? out.print(content);
?? application.setAttribute("chatTopic_1",content+(String)request.getParameter("content")
?? +"<br>");
%>
??? </font>
??? <hr>
??? <form accept="Servelt Context_chat.jsp">
??????? <input type="text" name="content">
??????? <input type="submit" value="speak">
??? </form>
??? </body>
</html>
可以得到ServletContext和application的實現(xiàn)機(jī)制基本上一致.
=====================================================================================
國內(nèi)外JSP/Java/Servlet技術(shù)著名網(wǎng)站
http://www-900.ibm.com/developerWorks/cn
http://java.sun.com
http://www.jchq.net
http://jquest.webjump.com/
http://www.chinaasp.com/ (國內(nèi))
http://www.cnjsp.com/? (國內(nèi))
http://www.javaunion.org/ (國內(nèi))
http://www.jspchina.com/ (國內(nèi))
國內(nèi)外介紹JSP/Servlet應(yīng)用程序服務(wù)器的網(wǎng)站
?http://www.allaire.com/
?http://jakarta.apache.org/
?http://java.apache.org/
?http://www.atg.com/
?http://www.bea.com/
?http://www.beasys.com/
?http://www.bluestone.com/
?http://caucho.com/
?http://easythings.iwarp.com/
?http://www.fefionsoftware.com
?http://www.gemstone.com/
?http://www.software.ibm.com/
?http://www.inprise.com/
?http://sun.com/software/
?http://www.tagtraum.com/
?http://www.enhydra.com/
?http://www.mortbay.com/
?http://www.novocode.com/
?http://www.oracle.com/
?http://www.orionserver.com/
?http://www.paralogic.com/
?http://www.pramati.com/
?http://www.secant.com/
?http://www.servertec.com/
?http://www.silverstream.com/
?http://www.siteforum.com/
?http://www.unify.com/
?http://www.vqsoft.com/
?http://www.w3.org/
國內(nèi)外介紹 JSP/Java/Servlet開發(fā)工具的網(wǎng)站
?http://www.adobe.com/
?http://www.bea.com/
?http://www.software.ibm.com/
?http://www.inprise.com/
?http://www.macromedia.com/
?http://www.netbeans.org/
?http://www.netobjects.com/
?http://www.oracle.com/
?http://www.sun.com/
?http://www.eclipse.com/
FAQ網(wǎng)站
?http://www.jguru.com/
?http://java.sun.com/products/jsp/faq.html
?http://www.esperanto.org.nz/
?http://www.jchq.net/
繁體資源
http://www.javaworld.com.tw/jute或http://www.jsptw.com/jute
http://www.jsp.mlc.edu.tw
?? 正則表達(dá)式
?.正則表達(dá)式及其作用
?.RegExp對象
?.String對象中與正則表達(dá)式有關(guān)的方法
?.正則表達(dá)式的語法參考
?.實用程序舉例
?什么是正則表達(dá)式?
?.文件路徑通配符
?"?"通配符匹配文件名中的單個字符,而"'"通配符匹配零個或多個字符。data?.dat就是一中文
?本模式,它能匹配data1.dat,data2.dat,datax.dat,dataN.dat等文件名。data*.dat是另一種文
?本模式,它匹配data.dat,data1.dat,data2.dat,data12.dat,datax.dat等文件名。
?
?.正則表達(dá)式
?是由英文詞語regular expression翻譯過來的,英文比中文更能實現(xiàn)其含義,就是符合某種規(guī)則
?的表達(dá)式??梢詫⒄齽t表達(dá)式理解為一種對文件進(jìn)行模糊匹配的語言,它用一些特殊的符號(稱
?為元字符)來代表某種特征(例如,全都是數(shù)字)的一組字符以及指定匹配的次數(shù),含有元字符
?的文本不再表示某一具體的文本內(nèi)容,而是形成了一種文本模式,它可以匹配符合這種模式的所
?有文本串。
?
?元字符與子匹配
?.元字符
?如果一個圖書的編號格式是:要么是5個數(shù)字字符,例如,10101;要么是5個數(shù)字后加上一個連字號
?(-),再加上4個數(shù)字組成的10個字符,例如,11111-1234。那么,要在一個大的文本串中查找這
?兩種格式的圖書編號時,就可以用\d{5}(-\d{4})?做為匹配模式。
?如果要讓abc?中的bc同時受到?的作用,必須使用圓括號將他們括起來,使它們成為一個緊密結(jié)合
?的組合項,這樣后面的?就表示圓括號中的內(nèi)容可有可無,例如,a(bc)?能匹配a和abc。
?.字匹配
?圓口號所括起來的部分為一個子匹配(也叫子表達(dá)式),除了可以得到整個正則表達(dá)式的匹配
?結(jié)果外,還可以單獨(dú)得到每個子表達(dá)式部分所匹配的結(jié)果。
?多個子表達(dá)式所匹配的原始內(nèi)容按照它們正則表達(dá)式模式中從左到右出現(xiàn)的順序存儲在緩沖區(qū)中
?,這種過程稱為捕獲。圓括號中的子匹配所捕獲的內(nèi)容可在整個表達(dá)式中位于這個括號之后的
?地方被反引用,第一括號(即第一個子匹配)捕獲的內(nèi)容用\1表示,第二個圓括號(即第二個子
?匹配)捕獲的內(nèi)容\2表示,依次類推。例如,要匹配2個相同的連續(xù)字符的正則表達(dá)式為(\d)\1.
?要匹配連續(xù)5個相同的數(shù)字字符的正則表達(dá)式為(\d)\1{4}.要匹配1221.3553.6776等數(shù)字??梢?br />?使用正則表達(dá)式為(\d)(\d)\2\1。
? 正則表達(dá)式的作用
?.測試字符串是否匹配某個模式,從而實現(xiàn)數(shù)據(jù)格式的有效性驗證。
?.將一段文本中滿足某一正則表達(dá)式模式的文本內(nèi)容替換為別的內(nèi)容或刪除(即替換為空字符串)
? 例如,將一大段文本中的所有的19xx年的內(nèi)容替換為20xx年,其中xx部分是兩個任意的數(shù)字,
? 不會被替換,但不能簡單地用20替換19,否則1919就被替換為2020。
?.在一段文本中搜索具有某一類型特征的文本內(nèi)容。精確搜索和正則表達(dá)式的模式搜索最大的區(qū)
? 別就是:精確搜索是搜索一個具體的文本,而模式搜索是模式搜索具有某一類型特征的文本。
?
? RegExp對象
?JavaScript中提供了一個名為RegExp的對象來完成有關(guān)正則表達(dá)式的操作和功能,每一條正則
?表達(dá)式模式對應(yīng)一個RegExp對象實例。
?創(chuàng)建RegExp對象實例
?(1)使用RegExp對象的顯示構(gòu)造函數(shù),語法為:new RegExp("pattern"[,"flags"]);
?(2)使用RegExp對象的隱式構(gòu)造函數(shù),采用純粹的文本格式:/pattern/[flags]
?
?flags標(biāo)志字符:
???? -g 用做全局標(biāo)志
???? -i 用做忽略大小寫標(biāo)志
???? -m 用做多行標(biāo)志
???? 如果沒有設(shè)置這個標(biāo)志,那么元字符"^"只與整個被搜索字符串的開始位置相匹配,而元字符
???? "$"只與整個被搜索字符串的結(jié)束位置相匹配。如果設(shè)置了這個標(biāo)志,那么"^"還可以與被
???? 搜索字符串中的"\n"或"\r"之后的位置相匹配。
? 注意:
? 當(dāng)使用構(gòu)造函數(shù)的方式創(chuàng)建RegExp實例對象的時候,應(yīng)將原始的正則表達(dá)式模式文本中的每個
? "\"都使用"\\"來替換,例如,下面的語句等價:
?? var re=new RegExp("\\d{5}");
?? var re=^d{5}/
?RegExp對象-屬性
?.所有RegExp對象實例共享靜態(tài)屬性
?.單個對象實例的屬性
?靜態(tài)屬性:
?.index
?.input
?.lastIndex
?.lastMatch
?.lastParen
?.lastContext
?.leftContext
?.rightContext
?.$1...$9
?對象實例屬性:
?.global
?.ignoreCase
?.multiline
?.source
?RegExp對象-方法
?.test方法
?語法格式為:test(str)。檢查一個字符串中是否存在創(chuàng)建RegExp對象實例所指定的正則表達(dá)式模式
?.exec方法
?語法格式為:exec(str)。使用創(chuàng)建RegExp對象實例時所指定的正則表達(dá)式模式對一個字符串執(zhí)行
?搜索,并返回一個包含搜索結(jié)果的數(shù)組。
?.compile方法
?語法格式為:compile("pattern"[,"flags"])。更換RegExp對象實例所使用的正則表達(dá)式模式,并
?將新的正則表達(dá)式模式編譯為內(nèi)部格式,從而使以后的匹配過程執(zhí)行更快。
?RegExp對象-綜合舉例
?code:
<script language="javascript">
??? var strSrc="xxa1b01c001yya2b02c002zz";
??? var re="/a(\d)b(\d{2})c(\d{3})/gi";
??? var arr,count=0;
??? while((arr = re.exec(strSrc))!=null)
??? {
?????? displayResult();
??? }
??? function displayResult()
??? {
????? document.write(<p>這是用正則表達(dá)式/"+re.source+"/gi對字符串<br>\""
???????????????? +RegExp.input+ "\"進(jìn)行第" +(++count)+ "次搜索的結(jié)果:<br>");
????? document.write("RegExp.index為"+RegExp.index+"<br>");
????? document.write("RegExp.lastindex為"+RegExp.lastindex+"<br>");
????? document.write("RegExp.lastMatch為"+RegExp.lastMatch+"<br>");
????? document.write("RegExp.lastParen為"+RegExp.lastParen+"<br>");
????? document.write("RegExp.lastContext為"+RegExp.lastContext+"<br>");
????? document.write("RegExp.$1為"+RegExp.$1+"<br>");
????? document.write("RegExp.$1為"+RegExp.$2+"<br>");
????? document.write("RegExp.$1為"+RegExp.$3+"<br>");
????? document.write("RegExp.$1為"+RegExp.$4+"<br>");
????? document.write("arr.index為"+arr.index+"<br>");
????? document.write("arr.input為"+arr.input+"<br>");
????? document.write("arr.lastindex為"+arr.lastindex+"<br>");
????? document.write("返回的元素個數(shù)為"+arr.length+"<br>");
????? document.write("返回數(shù)組的類容為[");
????? for(var i=0;i<arr.length;i++)
????? {
???????? if(arr.length-1)
??????????? document.write("\""+arr[i]+"\",");
???????? else
??????????? document.write("\""+arr[i]+"\"]</p>");
????? }
?????
??? }
?</script>
?
?String對象中與正則表達(dá)式有關(guān)的方法
?.match方法
?語法格式為:match(Exp)。與RegExp對象的exec方法類似,它使用正則表達(dá)式模式對字符串執(zhí)行
?搜索,并返回一個包含搜索結(jié)果的數(shù)組。
?<script language="javascript">
?? var strSrc="xxa1b01c001yya2b02c002zz";
?? var re=/a(\d)b(\d(2))c(\d{3})/gi;
?? var arr;
?? arr=strSrc.match(re);
?? for(var i=0;i<arr.length;i++)
?? {
????? if(i<arr.length-1)
???????? document.write("[\""+arr[i]+"\",");
????? else
???????? document.write("\""+arr[i]+"\"]");
?? }
?</script>
?
?.search方法
?語法格式為:serach(rgExp)。返回使用正則表達(dá)式搜索時,第一個匹配的字符串在整個被搜索
?的字符串中的位置。
?.replace方法
?語法格式為: replace(rgExp,replaceText)。使用正則表達(dá)式模式對字符串執(zhí)行搜索,并對搜索
?到的內(nèi)容用指定的字符串替換,返回值包含替換后的內(nèi)容的字符串對象。
給大家分享一個視頻教程-軟件工程,CSF格式的,或許大家有和我一樣用得著的,如果你需要就抓緊時間下載吧,白天相對來說速度快點(diǎn),晚上就比較慢了,也不一定.希望可以給你提供點(diǎn)幫助.現(xiàn)把目錄列舉如下:
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
課程名稱:軟件工程
總學(xué)時:32講
主講老師:劉亞軍
要下載抓緊時間,下載地址經(jīng)常變動
授課目錄:
第1講 軟件過程背景、目的
第2講 軟件質(zhì)量評價、軟件開發(fā)方法和開發(fā)工具 可行性研究與計劃
第3講 成本效益分析
第4講 需求分析基本理論、結(jié)構(gòu)化分析概述、數(shù)據(jù)流圖
第5講 數(shù)據(jù)流圖基本充分、由外向里畫數(shù)據(jù)流圖
第6講 分層數(shù)據(jù)流圖、由頂向下畫數(shù)據(jù)流圖、實例
第7講 數(shù)據(jù)流圖的改進(jìn)、數(shù)據(jù)詞典
第8講 小說明、分析的步驟,SA方法小結(jié)、快速原型法
第9講 基本概念、概要設(shè)計
第10講 塊間聯(lián)系、塊內(nèi)聯(lián)系
第11講 影響范圍、控制范圍、變換分析
第12講 變換分析、事務(wù)分析
第13講 詳細(xì)設(shè)計、JACSON方法
第14講 編程方法、軟件測試基本概念
第15講 白盒測試法
第16講 白盒測試法舉例
第17講? 黑盒測試法
第18講? 黑盒測試法舉例
第19講 維護(hù)方法
第20講? 面向?qū)ο箝_發(fā)方法(1)
第21講? 面向?qū)ο箝_發(fā)方法(2)
第22講? 面向?qū)ο箝_發(fā)方法(3)
第23講? 面向?qū)ο箝_發(fā)方法(4)
第24講? 軟件工具和環(huán)境,案例分析(1)
第25講? 案例分析(2)
第26講? 案例分析(3)
第27講? 案例分析(4)
第28講? 課堂練習(xí) 模擬試卷一美
第29講? 模擬試卷一
第30講? 模擬試卷二
第31講? 模擬試卷二
第32講? 模擬試卷二 開發(fā)方法比較
下載地址:
http://202.119.2.197/netcourses/評比課件/軟件工程/軟件工程01.csf
???????? ....................
http://202.119.2.197/netcourses/評比課件/軟件工程/軟件工程32.csf
If you need them! Be quick!
* 聲明部分,聲明該文檔是一個XML文檔.
* 定義部分,定義XML數(shù)據(jù)的類型以及所使用的DTD(可選).
* 內(nèi)容部分,用XML標(biāo)簽和注釋標(biāo)注過的文檔類容.
聲明
XML文檔以XML聲明開頭,聲明本文檔是一個XML文檔.一般這樣書寫:
<? xml version encoding standalone?>
定義符<?和?>表示這是一條給XML解析器的處理指令.雖然聲明這條語句是可有可無的,但考慮到以后的兼容,建議讀者還是寫上為好.隨著語言的進(jìn)一步發(fā)展,以后的瀏覽器如果知道文檔所用的XML版本的話,將是有好處的.這天語句必須全部用小寫.
在上面的聲明中version表示的XML的標(biāo)準(zhǔn)版本號.encoding表示的是文檔所用的編碼.standalone用來指定在XML文檔被解析之前,是否使用外部或內(nèi)部DTD,它的值只能是yes或no.如果為no,表示使用外部DTD;如果為yes表示使用內(nèi)部DTD;如果不使用DTD,則不使用這個屬性.
看下面的實際例子:
<?xml version="1.0" encoding="UTF-8" standalone="yes">
在XML聲明之后,緊接著是類型定義部分,定義XML文檔中數(shù)據(jù)的類型.
文檔定義類型(DTD)
DTD是用來定義XML文檔內(nèi)容的結(jié)構(gòu)的,以便按統(tǒng)一的格式存儲信息.DTD規(guī)定了XML文檔中可以出現(xiàn)哪些元素;這些元素是必須的還是可選的;這些元素有什么屬性;以及它們之間的相互位置關(guān)系,等等.XML允許用戶為自己的應(yīng)用程序定義專用的DTD,這樣用戶就可以完全檢查文檔結(jié)構(gòu)和內(nèi)容的過程了.這一檢驗過程稱為有效化,嚴(yán)格依從一個DTD的XML文檔被稱作有效文檔.
創(chuàng)建DTD的過程與在數(shù)據(jù)庫里創(chuàng)建數(shù)據(jù)表是類似的.在DTD中,用戶定義用來表示數(shù)據(jù)的元素,然后規(guī)定數(shù)據(jù)的結(jié)構(gòu),并規(guī)定這個元素是可選的還是必須的,這就好比創(chuàng)建數(shù)據(jù)表的列;然后你把數(shù)據(jù)存入XML文檔,就好比添加數(shù)據(jù)表的記錄.
XML文檔使用的元素可以在內(nèi)部DTD中定義,也可以在外部DTD中定義.
內(nèi)部DTD
DTD可以作為文檔的一部分直接放到文檔里面,這樣的DTD只能用于包含它的這個文檔,別的文檔就不能使用了.創(chuàng)建內(nèi)部DTD的語法如下:
<!DOCTYPE rootelement
[element and attribute declarations]
>
<!DOCTYPE標(biāo)識文檔類型定義的開始,屬性rootelement指明跟元素名字.
為部DTD
外部DTD是一個單獨(dú)的文件,存放XML文檔中可以使用的全部元素及屬性的定義.你可以在多個文檔中同時使用同一個DTD,以便保持多個文檔之間數(shù)據(jù)結(jié)構(gòu)的一致性。
在XML文檔中引用外部DTD的語法如下:
<!DOCTYPE rootelement [PUBLIC|SYSTEM] "name-of-file">
其中,DOCTYPE標(biāo)識這是文檔類型定義部分;rootelement代表根元素;PUBLIC表示這個DTD是存放在公用服務(wù)器上的;SYSTEM表示這個DTD是存放在本地計算機(jī)系統(tǒng)上的;Name-of-file是被引用的DTD文件的名稱.
DTD字符
下表是DTD中使用的部分專用字符及其含義.
DTD字符 | 含義 | 舉例 | 描述 | |||||||||
, | 指定順序中的"與" | Firstname ,Lastname | Firstname與Lastname,以此順序 | |||||||||
| | "或" | Firstname | Lastname | Firstname或Lastname | |||||||||
? | "可選項',只能出現(xiàn)一次 | Lastname? | 可以不出現(xiàn)Lastname,但如果使用,則只能出現(xiàn)一次 | |||||||||
() | 用于組成元素 | (Firstname | Lastname),Address | 一個Firstname或Lastname元素必須出現(xiàn)在Address元素之前 | |||||||||
* | 該元素可以不出現(xiàn)也可以出現(xiàn)多次 | (Firstname | Lastname)* | 可以以任何順序出現(xiàn)任意個數(shù)Firstname或Lastname元素 | |||||||||
? + | 該元素至少出現(xiàn)一次也可以出現(xiàn)多次 | (Firstname +) | 可以出現(xiàn)多個Firstname元素 |
在DTD中定義元素
元素是XML文件的基本組成部分.每個元素都是用標(biāo)簽標(biāo)識的一小段數(shù)據(jù).標(biāo)簽包括了元素的名字和屬性.
XML允許用于創(chuàng)建自己的元素集.因此,元素名應(yīng)該取得容易記憶,并且最好有一定的含義,讓人一看到它,便對里面的數(shù)據(jù)有個大概的了解.XML是大小寫敏感的,所以要么你全用大寫,要么就一律用小寫.
定義元素的語法如下:
<!ELEMENT elementname content>
在DTD中,你通過創(chuàng)建一個元素內(nèi)容模型(element content model)來精確的規(guī)定一個元素中是否喊有其它元素,可以出現(xiàn)多少次以及按什么順序出現(xiàn).如果元素中只包含別的元素,而不包含字符數(shù)據(jù),我們就說它只含有元素內(nèi)容.
XML中命名元素的規(guī)則
* 元素名至少要含有一個字母(a-z或A-Z中的一個)
* 元素名可以用下劃線(_)或冒號( : )開頭.
* 第一個字符后面可以是一個或多個字母,數(shù)字,連字符,下劃線或句號,但不能是空格和定位符(tab),至于標(biāo)點(diǎn)符號只能使用連字符(-)和句號(.).
對于完整的命名規(guī)則,請參看http://www.w3.org/XML/上的在線XML介紹
元素類型
元素有空元素,自由元素和容器元素三種(如下表:)
元素類型 | 語法 | ||||||
空元素(Empty) | <!ELEMENT empty.element EMPTY> | <!ELEMENT empty.element EMPTY> | |||||
自由元素(Unrestricted) | <!ELEMENT any.element ANY> | <!ELEMENT any.element ANY> | |||||
容器元素(Container) | <!ELEMENT TITLE(#PCDATA)> | <!ELEMENT TITLE(#PCDATA)> |
分析下面的標(biāo)簽結(jié)構(gòu):
<student>
<firstname> Blove </firstname>
<lastname> Saga </lastname>
<rollno> 49 </rollno>
<score> 70 </score>
</student>
要使上面的文檔生效,必須創(chuàng)建一個DTD,里面包含student,firstname,lastname,rollno,score等五個元素的定義.另外,還要規(guī)定這五個元素是必須的或可選的;以規(guī)定順序或任意排序;以及它們出現(xiàn)的次數(shù).用戶為這些規(guī)定編寫元素定義,每個元素的定義可能不同.
譬如,如果firstname和lastname都是必需的元素,并且firstname要在lastname后面,那么DTD可以這樣編寫:
<!ELEMENT student ?(firstname,lastname)><!--元素內(nèi)容-->
<!ELEMENT firstname (#PCDATA)><!--元素內(nèi)容-->
<!ELEMENT?lastname? (#CDATA)><!--元素內(nèi)容-->
注意:
數(shù)據(jù)類型#CDATA表示元素包含字符型數(shù)據(jù),解析器不解析這些數(shù)據(jù),其中的標(biāo)簽是不作為標(biāo)記的.
數(shù)據(jù)類型#PCDATA表示元素包含字的數(shù)據(jù)將由解析器解析,其中的標(biāo)簽是被作為標(biāo)記處理.
? XML 文檔是一個含XML標(biāo)記的ASCII文本文件,它的擴(kuò)展名是.xml, 如: employee.xml在開始編寫XML文檔之前,你應(yīng)該了解組成XML文檔的各個部分.一個XML文檔的主要成分包括:
?* 元素
?*?內(nèi)容
?* 屬性
?* 注釋
?元素
?元素是XML文件的基本構(gòu)造塊,作為主要的標(biāo)注組件,用來描述文件的內(nèi)容.每一個元素用一個標(biāo)簽來表示一段文本信息.大部分標(biāo)簽是成對出現(xiàn)的,開始標(biāo)簽在數(shù)據(jù)的開始處,結(jié)束標(biāo)簽放在數(shù)據(jù)的末尾.開始標(biāo)簽和結(jié)束標(biāo)簽之間嵌有信心的元素稱為容器元素.例如:
??? <Title> My Title </Title>
我們知道,上面語句中的Title是HTML里的元素,用來顯示瀏覽器窗口的標(biāo)題.在XML里,你可以創(chuàng)建自己的元素,如:
?? <empname> John Rambo </empname>
在上面的語句中,empname是由開始標(biāo)記(<>)和結(jié)素標(biāo)記(</>)定義的元素,嵌在這兩個標(biāo)簽中的信息就是這個元素的內(nèi)容.利用元素嵌套,你可以構(gòu)建一個分層的結(jié)構(gòu).
也有一些標(biāo)簽不是成對出現(xiàn)的,被稱作空元素.空元素不能包含的元素或數(shù)據(jù),因為它沒有開始和結(jié)束標(biāo)簽.最簡單的空元素例子是用<BR>標(biāo)簽表示的斷行元素.
在一個XML文件中,可以有一個或多個元素,但只能有一個根元素,根元素下面允許有多個子元素.
內(nèi)容
在XML中,由元素表示的信息,稱為內(nèi)容.請看下面的例子:
? <TITLE> LION KING </TITLE>
上面這行語句中,LION KING就是TITLE元素所表示的內(nèi)容.
屬性
屬性提供元素的補(bǔ)充信息.每個屬性有一個屬性名和屬性值,屬性值可以是數(shù)字,單詞,或URL.
在HTML中,我們經(jīng)常使用字體元素的顏色屬性,如:
<Font color="red">Displayed in red</Font>
其中,color是屬性名,其屬性值是red.
在XML中,屬性值一律要加上引號.例如:
<empname doj="2006">John Rambo</empname>
這里,"2006"是doj屬性(data of joining)的屬性值,用來描述元素empname.
注釋
注釋是用來給XML文檔加上注釋的,瀏覽器和XML處理器都忽略注釋,不加處理.使用注釋的好處是能使所有使用XML文檔的人都對文檔中各種元素的用法一目了然.
要在XML文件中輸入注釋,可以依次輸入一個小于號,一個感嘆號和兩個橫杠,再輸入注釋的文本內(nèi)容,并確保文本中沒有兩個橫杠.這一點(diǎn)W3C規(guī)定的,以保持XML與SGML的兼容.最后輸入兩個橫杠和一個大于號來結(jié)束注釋.例如:
<!-- Writing comments in XML Documents-->
這就是注釋.
結(jié)構(gòu)良好的XML文檔
一個結(jié)構(gòu)良好的XML文檔應(yīng)該遵守以下五個基本規(guī)則:
* 標(biāo)簽不能隱含,必須顯式出現(xiàn).每一個起始標(biāo)簽必須有對應(yīng)的結(jié)束標(biāo)簽;每一個結(jié)束標(biāo)簽也必須有對應(yīng)的起始標(biāo)簽,對比一下HTML和XML的不同:
在HTML中,可以用下面的這段代碼創(chuàng)建一個編號列表:
<OL>
<LI> Number list item one
<LI> Number list item two
<LI> Number list item three
</OL>
在上訴代碼中,用<OL>和</OL>來表示這是一個順序列表,用<LI>表示當(dāng)前列表項的開始,而列表項的結(jié)束,則是靠后一列表項的開始來暗示的.如果這段代碼出現(xiàn)在XML文檔中,瀏覽器是不會正確解析這個頁面的,
因為它并不是一個結(jié)構(gòu)良好的文檔.
XML文檔中的標(biāo)簽必須顯式出現(xiàn),不能隱含.如果用XML實現(xiàn)上面的例子,必須這樣書寫:
<OL>
<LI> Number list item one</LI>
<LI> Number list item two</LI>
<LI> Number list item three</LI>
</OL>
從上面這個例子中,你能看到,第一個列表必須包含在開始標(biāo)簽和結(jié)束標(biāo)簽之間,以滿足結(jié)構(gòu)良好的XML文檔的第一個規(guī)則.
* 空標(biāo)簽的結(jié)束字符'>'前必須使用'/'字符.
所謂空標(biāo)簽,是指標(biāo)簽的所有信息都放在它的分界符里,沒有任何屬于它的文本信息.比如象HTML中的<BR>和<IMG>,都不需要結(jié)束標(biāo)簽,因為標(biāo)簽里已經(jīng)包含了所有的信息.
HTML中的標(biāo)簽全部是預(yù)定義的,瀏覽器能夠直接識別.但是必須記住,XML中沒有任何預(yù)定義的標(biāo)簽,用戶為自己的頁面定義自己的語言.正因為這樣,XML并不能知道<BR>,<IMG>是空標(biāo)簽,你必須在標(biāo)簽的結(jié)束處加上斜杠(/),來指明他們是空標(biāo)簽.就像這樣:
<BR/>
<IMG SRC="image.gif"/>
* 所有的屬性值必須用雙引號括起來.
在HTML當(dāng)中,下面的語法是正確的:
<TD WIDTH="25%">
<TD WIDTH=25%>
然而在XML當(dāng)中,由于屬性值必須用引號括起來,所以只有前面一句和</TD>配合起來才是合法的.
* 標(biāo)簽不能交疊使用
比如說,下面這行語句就交疊起來了:
<CITY>Chicago<STATE>Michigan</CITY></STATE>
在XML中,必須從里到外地關(guān)閉標(biāo)簽,正確的順序是:
<CITY>Chicago<STATE>Michigan</STATE></CITY>
* 標(biāo)簽大小寫敏感,每次都必須嚴(yán)格匹配
在XML文檔中,必須區(qū)分大小寫,如果你寫了如下的語句,將導(dǎo)致一個致命的錯誤(fatal error):
<P> Able was I, ere I saw Elba</p>
標(biāo)簽<P>不能用來關(guān)閉標(biāo)簽</p>,因為兩者的大小寫是不同的.所有的標(biāo)簽必須大小寫嚴(yán)格匹配.
一個結(jié)構(gòu)良好的XML文檔,就是一個嚴(yán)格遵循XML標(biāo)簽規(guī)則,但沒有文檔類型定義(DTD, Document Type Definition)的文檔.
理解XML
?
??? XML表示可擴(kuò)展標(biāo)記語言(eXtensible Markup Language).其中,"可擴(kuò)展"這個詞意味著開發(fā)者能夠自由擴(kuò)展在描述文件方面的能力,可以為自己的應(yīng)用程序定義有實際意義的標(biāo)簽.XML是基于文本的,允許開發(fā)者在各種應(yīng)用程序之間傳遞和交換結(jié)構(gòu)化數(shù)據(jù),同時大大便利了不同服務(wù)器之間的數(shù)據(jù)傳輸.用XML表注的數(shù)據(jù)能夠被所有的設(shè)備識別,從帶主機(jī)的大型機(jī)和微型機(jī),到掌上電腦和蜂窩電話.
??? 與諸如HTML,DHTML,CSS等其他網(wǎng)頁技術(shù)相比,XML更注重數(shù)據(jù)的結(jié)構(gòu),而不是數(shù)據(jù)的表現(xiàn)形式.讓我們看看下面的這段代碼:
?<B>XML Bible</B>
?<P>
Elliotte Rusty Harold <BR>
IDG Books Worldwide <BR>
$39.99
??? 稍微看一下,你可能已經(jīng)知道了,它將的是一本關(guān)于書的基本信息:作者,出版社,價格.但是,這里用作標(biāo)記的元素,比如<B>,<P>等,并沒有揭示出這是一本有關(guān)書的信息,它只是描述了這幾行信息是如何顯示的.比如,在第一行中用了<B>,就表示瀏覽器處理的時候,要以粗體字顯示這行文本.
??? 同樣對這些信息,我們用XML標(biāo)注如下:
<BOOK>
<NAME>XML Bible</NAME>
<AUTHOR>Elliotte Rusty Harold</AUTHOR>
<PUBLISHER>IDG Books Worldwide</PUBLISHER>
<PRICE>$39.99</PRICE>
</BOOK>
??? 上面的小例子揭示出,通過定義一些有含義的標(biāo)簽,XML擴(kuò)展了用戶描述文件的能力.你可以根據(jù)應(yīng)用程序的需要,定義任意多個標(biāo)簽.在上面的代碼段中,沒有任何關(guān)于如何顯示信息的描述.XML將數(shù)據(jù)的結(jié)果與顯示分離開來,這似乎不太合理,其實很有益處的.
使用XML的優(yōu)越性
?
??? XML不僅對數(shù)據(jù)從服務(wù)器到客戶端的傳輸大有好處,對于應(yīng)用程序之間的數(shù)據(jù)傳輸,也是十分理想的.我們將它的優(yōu)越性列舉如下:
* 可使用特定領(lǐng)域的詞匯
*? 數(shù)據(jù)交換
*? 智能化查詢
*? 讓用戶選擇顯示的數(shù)據(jù)
*? 局部更新
可使用特定領(lǐng)域的詞匯
??? XML是沒有預(yù)定義標(biāo)簽的,你必須自己定義標(biāo)簽,用來標(biāo)注你的數(shù)據(jù).也就是說,你可以用XML創(chuàng)建自己的表注語言(稱為XML詞匯表).XML允許每個特定的行業(yè)根據(jù)需要定義自己的標(biāo)簽集合,這樣瀏覽器就不必處理成千上萬的標(biāo)簽集了.利用XML,已經(jīng)創(chuàng)建了若干新的標(biāo)記語言,比如W3C特別推薦的MathML,一種用于顯示數(shù)學(xué)公式和科學(xué)數(shù)據(jù)的專用標(biāo)記語言,就是基于XML的.
數(shù)據(jù)交換
??? 數(shù)據(jù)交換在進(jìn)行電子商務(wù)的交易時是極為重要.數(shù)據(jù)交換的關(guān)鍵在于企業(yè)之間或企業(yè)內(nèi)部部門之間的標(biāo)準(zhǔn)數(shù)據(jù)接口,使用存儲格式不同的數(shù)據(jù)能夠進(jìn)行交換.XML為以文本格式式存儲的數(shù)據(jù)提供了對于結(jié)構(gòu)的定義和管理,可以作為數(shù)據(jù)交換的標(biāo)準(zhǔn)格式或協(xié)議,是數(shù)據(jù)交換雙方的系統(tǒng)差異變得無關(guān)緊要,并且產(chǎn)生清晰易讀的文件.XML避免了同類產(chǎn)品的一些常見弊病,如擴(kuò)展性差,缺乏國際化和本地化的支持,平臺相關(guān)等.作為一種非常健壯的數(shù)據(jù)交換格式,XML將繼續(xù)發(fā)展,不斷完善.
智能化查詢
??? 由于XML的出現(xiàn),只能搜索引擎將成為現(xiàn)實,可將XML文檔中的數(shù)據(jù)進(jìn)行智能化搜索,得到更精確的查詢結(jié)果.為了更好的理解XML實現(xiàn)內(nèi)容定義的意義,我們來比較一下下面的兩個例子:
例1: The best pricture award in 1998 went to the film <I>Titanic</I>.
例2: The best pricture award in 1998 went to the film? <FILM>Titanic<FILM>.
在第一例子中,搜索引擎并不能確定所涉及的一艘輪船,一場表演,一部電影,抑或是一個形容詞.這樣的搜索精度比較低.而在第二個例子中,你能知道"Titanic"是一部電影的名字.如果現(xiàn)在搜索引擎要搜索的是電影 "Titanic",那么在這個文檔中就能找到一個精確的匹配項.
?讓用戶選擇顯示的數(shù)據(jù)
????? XML支持用戶端的數(shù)據(jù)處理.用戶可以選擇一個,若干或全部數(shù)據(jù)記錄,也可以按照不同的屬性進(jìn)行排序,或者切換到圖形化查看方式,而且不需要服務(wù)器針對每一次操作發(fā)送數(shù)據(jù).相同的數(shù)據(jù)可以用不同的方式來顯示,也可以僅僅顯示數(shù)據(jù)的一個子集,這些都取決于用戶與這些數(shù)據(jù)的相對關(guān)系.比如,會計部門是可以訪問財務(wù)信息的,而購買東西的顧客卻不能反問這部分信息.
?局部更新
????? 當(dāng)需要更新XML文檔中的數(shù)據(jù)時,并不需要更新整個頁面,而只要重新下載那些變化了的數(shù)據(jù),這顯然加快了更新的速度.例如:股票交易中的數(shù)據(jù)是動態(tài)的,如果每次都更新整個頁面的話,都需要很多時間.而使用XML,將只改變變化了的數(shù)據(jù).
XML的設(shè)計目標(biāo)
?????
XML是針對大規(guī)模的電子出版物的挑戰(zhàn)來設(shè)計的,同時在Web數(shù)據(jù)的交換中也充當(dāng)著越來越重要的角色.
根據(jù)W3C的有關(guān)文件,XML將在如下幾個方面發(fā)揮重要作用:
* 實現(xiàn)國際化,獨(dú)立于媒體的電子出版.
* 允許個產(chǎn)業(yè)部門制訂與平臺無關(guān)的數(shù)據(jù)交換協(xié)議,尤其針對電子商務(wù)數(shù)據(jù)交換的協(xié)議.
* 使用允許自動處理的格式,將信息傳遞給用戶代理商
* 讓人們用低價軟件就可以實現(xiàn)數(shù)據(jù)處理
* 允許人們按照自己的方式顯示信息
* 提供一種有關(guān)信息的數(shù)據(jù)(寫作 metadata),以幫助人們尋找和發(fā)現(xiàn)信息,實現(xiàn)信息的生產(chǎn)者和消費(fèi)者之間的雙向?qū)ふ?
? 任何形式電子商務(wù)的成功,都有賴于一個公共詞匯表的廣泛使用.部分XML詞匯表列舉如下:
? 頻道定義格式(CDF, Channel Definition Format)-一種基于XML的,用于創(chuàng)建web頻道的數(shù)據(jù)格式.所謂web頻道,是一種實現(xiàn)web服務(wù)器到客戶端的數(shù)據(jù)自動發(fā)送的技術(shù).
?
? 開放軟件描述(OSD, Open Software Description)-用于網(wǎng)上自動安裝軟件,而不需要任何人工干預(yù).
? 開放式金融交易(OFX, Open financial Exchange)-被個人金融應(yīng)用程序用來作為個人和金融組織之間進(jìn)行網(wǎng)上交流的工具.
? Meta內(nèi)容框架(MCF, Meta Content Framework)-用來定義關(guān)于信息的數(shù)據(jù),以實現(xiàn)對信息的編目和搜索.
? 資源描述框架(RDF, Resource Description Framework)-用于描述各種類型的資源,以實現(xiàn)對資源的編目,搜索和引用.
? 無線標(biāo)記語言(WML, Wireless Markup Language)-用于在無線網(wǎng)絡(luò)上的數(shù)據(jù)奮發(fā),采用無線訪問協(xié)議.
? 化學(xué)標(biāo)記語言(CML, Chemical Markup Language)-用來定義化學(xué)公式.
?
?? 數(shù)學(xué)標(biāo)記語言(MathML, Mathematical Markup Language)-用來定義復(fù)雜的數(shù)學(xué)公式.
? 編碼:將一個Unicode碼轉(zhuǎn)換為本地字符表示的過程為編碼。
? 解碼:將一個字節(jié)轉(zhuǎn)換為一個字符(用Unicode表示),這個過程叫解碼。
??????? [簡單的說去獲取一個Unicode碼就是解碼]
?code:
import java.util.*;
import java.nio.charset.*;
class CharsetTest
{
?public static void main(String[] args)throws Exception
?{
??/*
??Map m=Charset.availableCharsets();
??Set names=m.keySet();
??Iterator it =names.iterator();
??while(it.hasNext())
??{
???System.out.println(it.next());
??}
??*/
??Properties pps=System.getProperties();
??//pps.list(System.out);
??pps.put("file.encoding","ISO-8859-1");
??int data;
??byte[] buf=new byte[100];
??int i=0;
??while((data=System.in.read())!='q')
??{
???buf[i]=(byte)data;
???i++;
??}
??String str=new String(buf,0,i);
??//String strGBK=new String(str.getBytes("ISO-8859-1"),"GBK");
??//System.out.println(strGBK);
??System.out.println(str);
?}
}
?
???? RandomAccessFile
? RandomAccessFile類同時實現(xiàn)了DataInput和DataOutput接口,提供了對文件隨機(jī)存取的功能,
? 利用這個類可以在文件的任何位置讀取或?qū)懭霐?shù)據(jù)。
? RandomAccessFile類提供了一個文件指針,用來標(biāo)志要進(jìn)行讀寫操作的下一位數(shù)據(jù)的位置。
?
?code:
import java.io.*;
class RandomFileTest
{
?public static void main(String[] args)throws Exception
?{
??Student s1 = new Student(1,"zhangsan",98.5);
??Student s2 = new Student(2,"lisi",90.5);
??Student s3 = new Student(3,"wangwu",78.5);
??
??RandomAccessFile rsf=new RandomAccessFile("student.txt","rw");? //存取模式rw
??s1.WriteStudent(rsf);
??s2.WriteStudent(rsf);
??s3.WriteStudent(rsf);
??
??Student s =new Student();
??rsf.seek(0); //把文件指針移到文件首
??for(long i=0;i<rsf.length();i=rsf.getFilePointer())
??{
???s.ReadStudent(rsf);
???System.out.println(s.num+":"+s.name+":"+s.score);
??}
??rsf.close();
?}
}
class Student
{
?int num;
?String name;
?double score;
?Student()
?{
??
?}
?Student(int num,String name,double score)
?{
??this.num=num;
??this.name=name;
??this.score=score;
?}
?public void WriteStudent(RandomAccessFile raf)throws Exception
?{
??raf.writeInt(num);
??raf.writeUTF(name);
??raf.writeDouble(score);
?}
?public void ReadStudent(RandomAccessFile raf)throws Exception
?{
??raf.readInt();
??raf.readUTF();
??raf.readDouble();??
?}
}
?????????? 對象序列化
?.將對象轉(zhuǎn)換為字節(jié)流保存起來,并在日后還原這個對象,這種機(jī)制叫做對象序列化。
?.將一個對象保存到永久存儲設(shè)備上稱為持續(xù)性。
?.一個對象要想能夠?qū)崿F(xiàn)序列化,必須實現(xiàn)Serializable接口或Externalizable接口。
?.當(dāng)一個對象被序列化時,只保存對象的非靜態(tài)成員變量,不能保存任何的成員變量和靜態(tài)的
? 成員變量。
?.如果一個對象的成員變量是一個對象,那么這個對象的數(shù)據(jù)成員也會被保存。
?.如果一個可序列化的對象包含對某個不可序列化的對象的引用,那么整個序列化操作將會失敗,
? 并且會拋出一個NotSerializableException。我們可以將這個引用標(biāo)記為transient,那么對象
? 仍然可以序列化。
?code:
import java.io.*;
class ObjectSerialTest
{
?public static void main(String[] args)throws Exception
?{
??Employee e1 = new Employee("zhangsan",20,2800.50);
??Employee e2 = new Employee("lisi",22,25000.50);
??Employee e3 = new Employee("wangwu",23,12800.50);
??Employee e4 = new Employee("blovesaga",22,3800.50);
??
??FileOutputStream fos=new FileOutputStream("employee.txt");
??ObjectOutputStream oos=new ObjectOutputStream(fos);
??oos.writeObject(e1);
??oos.writeObject(e2);
??oos.writeObject(e3);
??oos.writeObject(e4);
??oos.close();
??
??FileInputStream fis = new FileInputStream("employee.txt");
??ObjectInputStream ois =new ObjectInputStream(fis);
??Employee e;
??for(int i=0;i<4;i++)
??{
???e=(Employee)ois.readObject();
???System.out.println(e.name+":"+e.age+":"+e.salary);
??}
??ois.close();
?}
}
class Employee implements Serializable
{
?String name;
?int age;
?double salary;
?transient Thread t1 =new Thread();
?Employee(String name,int age,double salary)
?{
??this.name=name;
??this.age=age;
??this.salary=salary;
?}
?//可以寫private void readObject()方法來控制我們自己想要實現(xiàn)的
?private void writeObject(java.io.ObjectOutputStream oos)throws Exception
?{
??//例如我們自己寫想要顯示的順序和那些需要顯示
??oos.writeInt(age);
??oos.writeUTF(name);
??System.out.println("Write Object");
?}
?private void readObject(java.io.ObjectInputStream ois)throws Exception
?{
??//按照寫入的順序來讀取
??age=ois.readInt();
??name=ois.readUTF();
??System.out.println("Read Object");
?}
}
?????????????? File類
?一個File類的對象,表示了磁盤上的文件或目錄。
?File類提供了與平臺無關(guān)的方法來對磁盤上的文件或目錄進(jìn)行操作。
import java.io.*;
class FileTest
{
?public static void main(String[] args) throws Exception
?{
??//File f = new File("1.txt");
??//f.createNewFile();?? 創(chuàng)建文件
??//f.mkdir(); 創(chuàng)建文件夾
??//File f = new File("F:\\Java Develop\\1.txt");//使用絕對路徑
??//f.createNewFile();
??/*
??*WINDOWS平臺下有盤符,LINUX下是沒有的
??*考慮到JAVA語言的平臺性,所有用分隔符seperator/seperatorChar
??*/
??/*
??File fDir = new File(File.separator);//創(chuàng)建了當(dāng)前的根目錄
??String strFile = "Java Develop"+File.separator+"1.txt";
??File f = new File(fDir,strFile);
??f.createNewFile();
??//f.delete();
??f.deleteOnExit();
??Thread.sleep(3000);
??*/
??/*
??for(int i=0;i<5;i++)
??{
???File.createTempFile("linshi",".tmp");
???f.deleteOnExit();
??}
??Thread.sleep(3000);
??*/
??
??File fDir = new File(File.separator);
??String strFile ="Java Develop"+File.separator;
??File f = new File(fDir,strFile);
??//文件過濾器
??String[] names = f.list(new FilenameFilter()
??{
???public boolean accept(File dir,String name)
???{
????return name.indexOf(".java")!=-1;
???}
??});
??for(int i=0;i<names.length;i++)
??{
???System.out.println(names[i]);
??}
?}
}
??????????? 流式I/0
?流(Stream)是字節(jié)的源或目的。
?兩種基本的流是: 輸入流(Input Stream)和輸出流(Output Stream)。從從中讀出一系列字節(jié)的
?對象稱為輸入流。而能向其中寫入一系列字節(jié)的對象稱為輸出流。
?????????? 流的分類
?
?節(jié)點(diǎn)流: 從特定的地方讀寫的流類,例如:磁盤或一塊內(nèi)存區(qū)域。
?過濾流: 使用節(jié)點(diǎn)作為輸入或輸出。過濾流使用的是一個已經(jīng)存在的輸入流或輸出流連接創(chuàng)建的。
?(如下圖)
???????? InputStream(一個抽象的基類)
?.三個基本的讀寫方法
? abstract int read(): 讀取一個字節(jié)數(shù)據(jù),并返回到數(shù)據(jù),如果返回-1,表示讀到了輸入流的
?????????????????????? 末尾。
? int read(byte[] b):? 將數(shù)據(jù)讀入一個字節(jié)數(shù)組,同時返回實際讀取的字節(jié)數(shù)。如果返回-1,
?????????????????????? 表示讀到了輸入流的末尾。
? int read(byte[] b,int off,int len): 將數(shù)據(jù)讀入一個字節(jié)數(shù)組,同時返回是實際讀取的字
?????????????????????? 節(jié)數(shù)。如果返回-1,表示讀到了輸入流的末尾。off指定在數(shù)組b中存放
?????????????????????? 數(shù)據(jù)的起始偏移位置;len指定讀取的最大字節(jié)數(shù)。
?其他的方法
? long-skip(long n): 在輸入流中跳過n個字節(jié),并返回實際跳過的字節(jié)數(shù)。
? int available():?? 返回在不發(fā)生阻塞的情況下,可讀取的字節(jié)數(shù)。
? void close():????? 關(guān)閉輸入流,釋放和這個流相關(guān)的系統(tǒng)資源。
? void mark(int reqdlimit): 在輸入流的當(dāng)前位置放置一個標(biāo)記,如果讀取的字節(jié)數(shù)多余
???????????????????? readlimit設(shè)置的值,則流忽略這個標(biāo)記。
? void reset():????? 返回到上一個標(biāo)記。
? boolean markSupported(): 測試當(dāng)前是否支持mark和reset方法。如果支持返回true,反之false。
???????? java.io包中的InputStream的類層次?(下圖)
??????? OutputStream
?三個基本的寫方法
?abstract void write(int b): 往輸出流中寫入一個字節(jié)
?void write(byte[] b):?????? 往輸出流中寫入數(shù)組b中的所有字節(jié)
?void writte(byte[] b,int off,int len): 往輸出流中寫入數(shù)組b中從偏移量off開始的len個
???????????????????????????? 字節(jié)的數(shù)據(jù)
?其它方法
?void flush(): 刷新輸出流,強(qiáng)制緩沖區(qū)中的輸出字節(jié)被寫出
?void close(): 關(guān)閉輸出流,釋放和這個流相關(guān)的系統(tǒng)資源
??????? java.io包中OutputStream的類層次(如下圖)
??????? 基本的流類
?FileInputStream和FileOutputStream
?節(jié)點(diǎn)流,用于從文件中讀取或往文件中寫入字節(jié)流。如果在構(gòu)造FileOutputStream時,文件已經(jīng)
?存在,則覆蓋這個文件。
?
?BufferedInputStream和BufferedOutputStream
?過濾流,需要使用已經(jīng)存在的節(jié)點(diǎn)流來構(gòu)造,提供帶緩沖的讀寫,提高了讀寫的效率。
?DataInputStream和DataOutputStream
?過濾流,需要使用已經(jīng)存在的節(jié)點(diǎn)流來構(gòu)造,提供了讀寫Java中的基本數(shù)據(jù)類型的功能。
?PipedInputStream和PipedOutputStream
?管道流,用于線程間的通信。一個線程的PipedInputStream對象從另一個線程的PipedOutputStream
?對象讀取輸入。要使管道流有用,必須同時構(gòu)造管道輸入流和管道輸出流。
code:
import java.io.*;
class StreamTest
{
?public static void main(String[] args)throws Exception
?{
??/*
??int data;
??while((data=System.in.read())!=-1)? //從標(biāo)準(zhǔn)設(shè)備讀取數(shù)據(jù)
??{
???System.out.write(data);//從標(biāo)準(zhǔn)設(shè)備輸出數(shù)據(jù)
??}
??*/
??//輸出流寫數(shù)據(jù),只需要關(guān)閉尾端的流就可以了,因為fos連接到了bos
??FileOutputStream fos = new FileOutputStream("1.txt");
??//fos.write("());
??//fos.close();
??BufferedOutputStream bos = new BufferedOutputStream(fos);
??//bos.write("http//www.baidu.com".getBytes());
??//bos.flush();
??//bos.close();
??DataOutputStream dos=new DataOutputStream(bos); //連接到了bos和fis
??byte b=3;
??int i=78;
??char ch='a';
??float f=4.5f;
??dos.writeByte(b);
??dos.writeInt(i);
??dos.writeChar(ch);
??dos.writeFloat(f);
??dos.close(); //必須調(diào)用flush()或者close()不然不會寫入硬盤
??
??//輸入流讀數(shù)據(jù)
??FileInputStream fis=new FileInputStream("1.txt");
??BufferedInputStream bis = new BufferedInputStream(fis);
??//byte[] buf=new byte[100];
??//int len=fis.read(buf);
??//int len=bis.read(buf);
??//System.out.println(new String(buf,0,len));
??//fis.close();
??//bis.close();
??//注意讀取的順序要和寫的順序一樣
??DataInputStream dis = new DataInputStream(bis);
??System.out.println(dis.readByte());
??System.out.println(dis.readInt());
??System.out.println(dis.readChar());
??System.out.println(dis.readFloat());
??dis.close();??
??
?}
}
管道輸入/輸出流 code:
import java.io.*;
class PipedStreamTest
{
?public static void main(String[] args)
?{
??PipedOutputStream pos=new PipedOutputStream();
??PipedInputStream pis=new PipedInputStream();
??//連接
??try
??{
???pos.connect(pis);
???new Producer(pos).start();
???new Consumer(pis).start();
??}
??catch(Exception e)
??{
???e.printStackTrace();
??}
?}
}
class Producer extends Thread
{
?private PipedOutputStream pos;
?public Producer(PipedOutputStream pos)
?{
??this.pos=pos;
?}
?public void run()
?{
??try
??{
???pos.write("hello,welcome!".getBytes());
???pos.close();
??}
??catch(Exception e)
??{
???e.printStackTrace();
??}
?}
}
class Consumer extends Thread
{
?private PipedInputStream pis;
?Consumer(PipedInputStream pis)
?{
??this.pis=pis;
?}
?public void run()
?{
??try
??{
???byte[] buf=new byte[100];
???int len=pis.read(buf);
???System.out.println(new String(buf,0,len));
???pis.close();
??}
??catch(Exception e)
??{
???e.printStackTrace();
??}
?}
}
=================================================================================
????????????? Java I/O庫的設(shè)計原則
?Java的I/O庫提供了一個稱做鏈接的機(jī)制,可以將一個流與另一個流首尾相接,形成一個流管道的鏈接。
?這種機(jī)制實際上是一種被稱做為Decorator(裝飾)的設(shè)計模式的應(yīng)用。
?
?通過流的鏈接,可以動態(tài)的增加流的功能,而這些功能的增加是通過組合一些流的基本功能而動
?態(tài)獲取的。
?我們要獲取一個I/O對象,往往需要產(chǎn)生多個I/O對象,這也是Java I/O庫不大容易掌握的原因,
?但在I/O庫中的Decorator模式的運(yùn)用,給我們提供了實現(xiàn)上的靈活性。
?I/O流的鏈接圖(如下)
?????????????? Reader和Writer
?Java程序語言使用Unicode來表示字符串和字符。
?Reader和Writer這兩個抽象類主要用來讀寫字符流。
?java.io包中Reader的類層次(如下圖)
?java.io包中Writer的類層次(如下圖)
?code:
import java.io.*;
class StreamTest
{
?public static void main(String[] args)throws Exception
?{
??/*
??FileOutputStream fos = new FileOutputStream("1.txt");
??OutputStreamWriter osw = new OutputStreamWriter(fos);?
??BufferedWriter bw = new BufferedWriter(osw);
??
??bw.write("??bw.close();?
??
??FileInputStream fis = new FileInputStream("1.txt");
??InputStreamReader isr = new InputStreamReader(fis);
??BufferedReader br = new BufferedReader(isr);
??System.out.println(br.readLine());
??br.close();
??*/
??//InputStreamReader/OutputStreamWriter是一個中間過度類,連接字符和字符串
??InputStreamReader isr = new InputStreamReader(System.in);
??BufferedReader br = new BufferedReader(isr);
??String strLine;
??while((strLine=br.readLine())!=null)
??{
???System.out.println(strLine);
??}
??br.close();
?}
}
??????????? 字符集的編碼
?ASCII(American Standard Code for Information Interchange,美國信息互換標(biāo)準(zhǔn)代碼),是基
?于常用的英文字符的一套電腦編碼系統(tǒng)。我們知道英文中經(jīng)常使用的字符,數(shù)字符號被計算機(jī)
?處理時都是以二進(jìn)制編碼的形式出現(xiàn)(bit)二進(jìn)制數(shù)對應(yīng)。其最高位是0,相應(yīng)的十進(jìn)制數(shù)是0-127
?如,數(shù)字1,有一些制表符和其他符號組成。ASCII是現(xiàn)金最通用的單字節(jié)編碼系統(tǒng)。
?GB2312: GB2312碼是中華人民共和國國家漢字信息交換用編碼,全稱《信息交換用漢字編碼字
?符集-基本集》。主要用于給每一個中文字符指定相應(yīng)的數(shù)字,也就是進(jìn)行編碼。一個中文字符
?用兩個字節(jié)的數(shù)字來表示,為了和ASCII碼有所區(qū)別,將中文字符每一個字節(jié)的最高位置都用1
?來表示。
?GBK:為了對更多的字符進(jìn)行編碼,國家又發(fā)布了新的編碼系統(tǒng)GBK(GBK的K是“擴(kuò)展”的漢語
?拼音的第一個字母)。在新的編碼系統(tǒng)里,除了完全兼容GB2312外,還對繁體中文,一些不常用
?的漢字和許多符號進(jìn)行了編碼。
?ISO-8859-1:是西方國家所使用的字符編碼集,是一種單字節(jié)的字符集,而英文實際上只用了其
?中數(shù)字小于128的部分。
?Unicode: 這是一種通用的字符集,對所有語言的文字進(jìn)行統(tǒng)一編碼,對每一個字符都采用2個字節(jié)
?來表示,對于英文字符采取前面加“0”字節(jié)的策略實現(xiàn)等長兼容。如"a"的ASCII碼為0x61,
?UNICODE就為0x00,0x61。
?UTF-8: Elight-bit UCS Transformation Format,(UCS,Universal Character Set,通用字符集,
?UCS是所有其他字符集標(biāo)準(zhǔn)的一個超集)。一個7位的ASCII碼值,對應(yīng)的UTF碼是一個字節(jié),如果
?字符是0x0000,或在0x0080與0x007f之間,對應(yīng)的UTF碼是兩個字節(jié),如果字符在0x0800與0xffff
?之間,對應(yīng)的UTF碼是三個字節(jié)。
???? Collection?????????????????? Map(和Collection接口沒任何關(guān)系)
?????? / \???????????????????????? |
????? /?? \??????????????????????? |?????
??? Set?? List????????????????? SortedMap
??? /
?? /
?SortedSet
(接口圖)
所謂框架就是一個類庫的集合。集合框架就是一個用來表示和操作集合的統(tǒng)一框架,包含了實現(xiàn)
集合的接口和類。
?
?集合框架中的接口
?.Collection: 集合層次中的根接口,JDK沒有提供這個接口直接的實現(xiàn)類。
?.Set: 不能包含重復(fù)的元素。SortedSet是一個按照升序排列元素的Set。
?.List: 是一個有序的集合,可以包含重復(fù)的元素。提供了按照索引訪問的方式。
?.Map: 包含了key-value對。Map不能包含重復(fù)的key。SortedMap是一個按照升序排列key的Map。
?
?集合框架中的實現(xiàn)類
?
?實線表示繼承類,虛線表示實現(xiàn)類。
?(圖如下)
?.ArrayList: 我們可以將其看做是能夠自動增長容量的數(shù)組。
?.利用ArrayList的toArray()返回一個數(shù)組。
?.Arrays.asList()返回一個列表。
?.迭代器(Iterator)給我們提供了一種通用的方式來訪問集合中的元素。
?注意: 從集合類中獲取一個數(shù)組 toArray(),從數(shù)組獲取列表利用Arrays.asList()
?例子:
import java.util.*;
class ArrayListTest
{
?public static void printElement(Collection c)
?{
??Iterator it = c.iterator();
??while(it.hasNext())
??{
???System.out.println(it.next());
??}
?}
?public static void main(String[] args)
?{
??ArrayList a = new ArrayList();
??/*
??a.add("abc");
??a.add("def");
??a.add("hjk");
??*/
??
??a.add(new Point(1,1));
??a.add(new Point(2,2));
??a.add(new Point(3,3));
??/*
??Object[] o;
??o=a.toArray();? //將集合類轉(zhuǎn)換為數(shù)組
??for(int i=0;i<o.length;i++)
??{
???System.out.println(o[i]);
??}
??
??List b = new ArrayList();
??b=Arrays.asList(o);
??System.out.println(b);
??
??for(int i=0;i<a.size();i++)
??{
???System.out.println(a.get(i));
??}
??
??System.out.println(a);
??System.out.println(a);
??*/
??
??/*
??Iterator it = a.iterator();
?? 如果要刪除元素,必須先調(diào)用next方法
??it.next();
??it.remove();
??while(it.hasNext())
??{
???System.out.println(it.next());
??}
??*/
??//迭代器的作用: 提供一組通用的訪問方式
??printElement(a);
?}
}
class Point
{
?int x, y;
?Point(int x, int y)
?{
??this.x=x;
??this.y=y;
?}
?public String toString()
?{
??return "x="+x+","+"y="+y;
?}
}
?Collections類
?.排序: Collections.sort(); [區(qū)別與Arrays.sort()]
? (1) 自然排序(natural ordering);
? (2) 實現(xiàn)比較器(Comparator)接口。
?.取最大和最小的元素: Collections.max(),Collections.min();
?.在已排序的List中搜索指定的元素: Collections.binarySearch()。
?代碼示例:
import java.util.*;
class ArrayListTest
{
?public static void printElement(Collection c)
?{
??Iterator it = c.iterator();
??while(it.hasNext())
??{
???System.out.println(it.next());
??}
?}
?public static void main(String[] args)
?{
??/*
??ArrayList a = new ArrayList();
??
??a.add("abc");
??a.add("def");
??a.add("hjk");
??
??
??a.add(new Point(1,1));
??a.add(new Point(2,2));
??a.add(new Point(3,3));
??
??Object[] o;
??o=a.toArray();? //將集合類轉(zhuǎn)換為數(shù)組
??for(int i=0;i<o.length;i++)
??{
???System.out.println(o[i]);
??}
??
??List b = new ArrayList();
??b=Arrays.asList(o);
??System.out.println(b);
??
??for(int i=0;i<a.size();i++)
??{
???System.out.println(a.get(i));
??}
??
??System.out.println(a);
??System.out.println(a);
??*/
??
??/*
??Iterator it = a.iterator();
?? 如果要刪除元素,必須先調(diào)用next方法
??it.next();
??it.remove();
??while(it.hasNext())
??{
???System.out.println(it.next());
??}
??*/
??//迭代器的作用: 提供一組通用的訪問方式
??//printElement(a);
??
??Student s1 = new Student(1,"zhangsan");
??Student s2 = new Student(2,"lisi");
??Student s3 = new Student(3,"wangwu");
??Student s4 = new Student(3,"blovesaga");
??
??ArrayList a = new ArrayList();
??a.add(s1);
??a.add(s2);
??a.add(s3);
??a.add(s4);
??
??//Collections.sort(a);
??Collections.sort(a,new Student.StudentComparator());
??printElement(a);
?}
}
class Point
{
?int x, y;
?Point(int x, int y)
?{
??this.x=x;
??this.y=y;
?}
?public String toString()
?{
??return "x="+x+","+"y="+y;
?}
}
class Student implements Comparable
{
?int num;
?String name;
?//實現(xiàn)比較器,它總是和我們的一個類相關(guān),用內(nèi)部類
?static class StudentComparator implements Comparator? //為了調(diào)用方便聲明為靜態(tài)的
?{
??public int compare(Object o1,Object o2)
??{
???Student s1 = (Student)o1;
???Student s2 = (Student)o2;
???int result=s1.num > s2.num ? 1: (s1.num==s2.num ? 0 : -1);
???if(result==0)
???{
????return s1.name.compareTo(s2.name);
???}
???return result;
??}
?}
?Student(int num,String name)
?{
??this.num=num;
??this.name=name;
?}
?public int compareTo(Object o)
?{
??Student s=(Student)o;
??return num > s.num ? 1 :( (num==s.num) ? 0 : -1);
?}
?
?public String toString()
?{
??return +num+":"+name;
?}
}
?
?
所有圖片均上傳至 MEGAUPLOAD 空間!
若您要查看每集有哪些圖片,請自行瀏覽…在此就不貼出了
各集預(yù)覽: http://www.lin.biz/viewforum.php?f=5
第A001集http://www.megaupload.com/?d=LMRY00AW
第A002集http://www.megaupload.com/?d=MIMTZMHN
第A003集http://www.megaupload.com/?d=JZDNKV70
第A004集http://www.megaupload.com/?d=KB7WS1TN
第A005集http://www.megaupload.com/?d=A8COTU6R
第A006集http://www.megaupload.com/?d=1WJUON4A
第A007集http://www.megaupload.com/?d=DP8C5I4Y
第A008集http://www.megaupload.com/?d=FC71IIUE
第A009集http://www.megaupload.com/?d=7RNVJABQ
第A010集http://www.megaupload.com/?d=BKMAZFQ2
第A011集http://www.megaupload.com/?d=0CUN79QQ
第A012集http://www.megaupload.com/?d=61RYJ8Q2
第A013集http://www.megaupload.com/?d=LG3L8NVL
第A014集http://www.megaupload.com/?d=RCFCV1LH
第A015集http://www.megaupload.com/?d=QFF81PUF
3月21更新
第A016集http://www.megaupload.com/?d=0FEVLSFL
第A017集http://www.megaupload.com/?d=UHLZ7NT5
第A018集http://www.megaupload.com/?d=8L3B4RNG
第A019集http://www.megaupload.com/?d=712YBM8C
第A020集http://www.megaupload.com/?d=82GJA4QI
第A021集http://www.megaupload.com/?d=7J827HKR
第A022集http://www.megaupload.com/?d=9OD2XC7H
第A023集http://www.megaupload.com/?d=QXO4ZMG7
第A024集http://www.megaupload.com/?d=IBT187D7
第A025集http://www.megaupload.com/?d=K52RYT2C
第A026集http://www.megaupload.com/?d=645LT7V4
第A027集http://www.megaupload.com/?d=SXZBFLCN
第A028集http://www.megaupload.com/?d=XU91RTCC
第A029集http://www.megaupload.com/?d=R5ZTF0IX
第A030集http://www.megaupload.com/?d=EAEC9DRK
第A031集http://www.megaupload.com/?d=TUVSJCYV
第A032集http://www.megaupload.com/?d=BOKLM691
第A033集http://www.megaupload.com/?d=5EIDGC25
第A034集http://www.megaupload.com/?d=LUEP78CJ
第A035集http://www.megaupload.com/?d=BQM78MHQ
第A036集http://www.megaupload.com/?d=2D5QVWNN
第A037集http://www.megaupload.com/?d=YHZGWGJR
第A038集http://www.megaupload.com/?d=CBGG07DP
第A039集http://www.megaupload.com/?d=P67HJMK4
第A040集http://www.megaupload.com/?d=Y2K4PDJN
第A041集http://www.megaupload.com/?d=T0TBVI47
第A042集http://www.megaupload.com/?d=EY1PRZ2U
第A043集http://www.megaupload.com/?d=SV35PL36
第A044集http://www.megaupload.com/?d=8COIIHYT
第A045集http://www.megaupload.com/?d=16QT2KJC
3月22更新
第A046集http://www.megaupload.com/?d=P1G8INRJ
第A047集http://www.megaupload.com/?d=8NDN001I
第A048集http://www.megaupload.com/?d=2ZMQNEU3
第A049集http://www.megaupload.com/?d=WR64P2A7
第A050集http://www.megaupload.com/?d=ARM9J9H9
第A051集http://www.megaupload.com/?d=HF1AKEEK
第A052集http://www.megaupload.com/?d=8MX7VZO4
第A053集http://www.megaupload.com/?d=IKXZSRFC
第A054集http://www.megaupload.com/?d=TOI28KAE
第A055集http://www.megaupload.com/?d=4F1ENKTI
第A056集http://www.megaupload.com/?d=X28NSWHR
第A057集http://www.megaupload.com/?d=CT1BI9UH
第A058集http://www.megaupload.com/?d=2SWK4M5J
第A059集http://www.megaupload.com/?d=BGKLGCTE
第A060集http://www.megaupload.com/?d=1YIEWRC4
第A061集http://www.megaupload.com/?d=CVG0I42V
第A062集http://www.megaupload.com/?d=SLPMCYP4
第A063集http://www.megaupload.com/?d=5CEGRWS8
第A064集http://www.megaupload.com/?d=ETOMOETI
第A065集http://www.megaupload.com/?d=G3YGVUEF
第A066集http://www.megaupload.com/?d=YP8WAMLU
第A067集http://www.megaupload.com/?d=1N3Z085J
第A068集http://www.megaupload.com/?d=383CL4DR
第A069集http://www.megaupload.com/?d=F5ADPD9T
3月23更新
第A070集http://www.megaupload.com/?d=HYUV4R8R
第A071集http://www.megaupload.com/?d=IOSS9GME
第A072集http://www.megaupload.com/?d=8PGJEA16
第A073集http://www.megaupload.com/?d=92ROO4NB
第A074集http://www.megaupload.com/?d=164C1FUS
第A075集http://www.megaupload.com/?d=FOCBJI92
第A076集http://www.megaupload.com/?d=HZEOFAV9
第A077集http://www.megaupload.com/?d=2I08TIPR
第A078集http://www.megaupload.com/?d=BT3Q8T90
第A079集http://www.megaupload.com/?d=FLUXH8M1
第A080集http://www.megaupload.com/?d=MFWG9WMW
第A081集http://www.megaupload.com/?d=Y6P70NQJ
第A082集http://www.megaupload.com/?d=3ML82FT1
第A083集http://www.megaupload.com/?d=RYXNIX15
第A084集http://www.megaupload.com/?d=8XF0F3B4
第A085集http://www.megaupload.com/?d=GO4HVW1T
第A086集http://www.megaupload.com/?d=7N18JIZ7
第A087集http://www.megaupload.com/?d=5YQDH9AT
第A088集http://www.megaupload.com/?d=K829N8LI
第A089集http://www.megaupload.com/?d=46OFDJGW
第A090集http://www.megaupload.com/?d=3G13IYZV
第A091集http://www.megaupload.com/?d=KX8K998Q
第A092集http://www.megaupload.com/?d=3YGNUT3Y
第A093集http://www.megaupload.com/?d=5ZFZUDCG
第A094集http://www.megaupload.com/?d=KQF5MD5U
第A095集http://www.megaupload.com/?d=Y7NEVBBX
4月3更新
第A096集http://www.megaupload.com/?d=HR4JBEY5
第A097集http://www.megaupload.com/?d=YLBK3TRP
第A098集http://www.megaupload.com/?d=79PA3MSS
第A099集http://www.megaupload.com/?d=P7ZPQBYW
第A100集http://www.megaupload.com/?d=220YFCNH
第A101集http://www.megaupload.com/?d=CGEP67IR
第A102集http://www.megaupload.com/?d=CILPUMOB
第A103集http://www.megaupload.com/?d=CBB6KRS7
第A104集http://www.megaupload.com/?d=ZU4K6O7G
第A105集http://www.megaupload.com/?d=TW9Z3KHP
第A106集http://www.megaupload.com/?d=7TN5VJEA
第A107集http://www.megaupload.com/?d=44WTE3YE
第A108集http://www.megaupload.com/?d=86EUYGGQ
第A109集http://www.megaupload.com/?d=347NYMQO
第A110集http://www.megaupload.com/?d=6UAA1XBH
第A111集http://www.megaupload.com/?d=EFON6OX2
第A112集http://www.megaupload.com/?d=PBCDTS8E
第A113集http://www.megaupload.com/?d=15XSJIT6
第A114集http://www.megaupload.com/?d=VIO3P9OV
第A115集http://www.megaupload.com/?d=86SEMC44
第A116集http://www.megaupload.com/?d=VG2Z3SDB
第A117集http://www.megaupload.com/?d=C7IFH8FL
第A118集http://www.megaupload.com/?d=0FY7AEEY
第A119集http://www.megaupload.com/?d=E86DJTKI
第A120集http://www.megaupload.com/?d=NFAA05SB
第A121集http://www.megaupload.com/?d=6CQ31JVW
第A122集http://www.megaupload.com/?d=Z9T9GIBH
第A123集http://www.megaupload.com/?d=LZBK52RL
第A124集http://www.megaupload.com/?d=S1N60HYV
第A125集http://www.megaupload.com/?d=L0LQ8L52
第A126集http://www.megaupload.com/?d=OG6T81CZ
第A127集http://www.megaupload.com/?d=PRALKKKF
第A128集http://www.megaupload.com/?d=2J8856C5
第A129集http://www.megaupload.com/?d=SKA24Y7F
清除Windows系統(tǒng).垃.圾.我最行
為你的電腦系統(tǒng)清除淤塞的**!輕松流暢上網(wǎng)你是否注意到你的電腦系統(tǒng)磁盤的可用空間正在一天天在減少呢?是不是像老去的猴王一樣動作一天比一天遲緩呢?沒錯!在Windows在安裝和使用過程中都會產(chǎn)生相當(dāng)多的**文件,包括臨時文件(如:*.tmp、 *._mp)日志文件(*.log)、臨時幫助文件(*.gid)、磁盤檢查文件(*.chk)、臨時備份文件(如:*.old、*.bak)以及其他臨時文件。
特別是如果一段時間不清理IE的臨時文件夾“Temporary Internet Files”,其中的緩存文件有時會占用上百M(fèi)B的磁盤空間。這些**文件不僅僅浪費(fèi)了寶貴的磁盤空間,嚴(yán)重時還會使系統(tǒng)運(yùn)行慢如蝸牛。這點(diǎn)相信你肯定忍受不了吧!所以應(yīng)及時清理系統(tǒng)的**文件的淤塞,保持系統(tǒng)的“苗條”身材,輕松流暢上網(wǎng)!朋友來吧,現(xiàn) 在就讓我們一起來快速清除系統(tǒng)**吧?。?br />
新建一個記事本并輸入以下的內(nèi)容:
@echo off
echo 正在清除系統(tǒng)**文件,請稍等......
del /f /s /q %systemdrive%\*.tmp
del /f /s /q %systemdrive%\*._mp
del /f /s /q %systemdrive%\*.log
del /f /s /q %systemdrive%\*.gid
del /f /s /q %systemdrive%\*.chk
del /f /s /q %systemdrive%\*.old
del /f /s /q %systemdrive%\recycled\*.*
del /f /s /q %windir%\*.bak
del /f /s /q %windir%\prefetch\*.*
rd /s /q %windir%\temp & md %windir%\temp
del /f /q %userprofile%\cookies\*.*
del /f /q %userprofile%\recent\*.*
del /f /s /q "%userprofile%\Local Settings\Temporary Internet Files\*.*"
del /f /s /q "%userprofile%\Local Settings\Temp\*.*"
del /f /s /q "%userprofile%\recent\*.*"
echo 清除系統(tǒng)**完成!
echo. & pause
最后將它保存,然后更名為“清除系統(tǒng)**.bat”!ok!你的**清除器就這樣制作成功了!
以后只要雙擊運(yùn)行該文件,當(dāng)屏幕提示“清除系統(tǒng)**完成!就還你一個“苗條”的系統(tǒng)了??!到時候再看看你的電腦,是不是急速如飛呢?
注:這招比那些所謂的優(yōu)化大師好用!不會破壞系統(tǒng)文件!
???????
?特別提醒:“**” 是 《垃.圾》復(fù)制后改成《垃.圾》就行了
???????? 多線程學(xué)習(xí)
?* 程序,進(jìn)程和線程
程序: 是指計算機(jī)指令的集合,它以文件的形式存儲在磁盤上。
進(jìn)程: 是一個程序在其自身的地址空間中的一次執(zhí)行活動。
進(jìn)程是資源的申請,調(diào)度和獨(dú)立運(yùn)行的單位,因此,它使用系統(tǒng)中的運(yùn)行資源;而程序不能申請
系統(tǒng)資源,不能被系統(tǒng)調(diào)度,也不能作為獨(dú)立運(yùn)行的單位,因此,它不站用系統(tǒng)的運(yùn)行資源。
線程: 是進(jìn)程中一個單一的連接控制流程。一個進(jìn)程可以有多個線程。
線程又稱為輕量級進(jìn)程,它和進(jìn)程一樣擁有獨(dú)立的執(zhí)行控制,由操作系統(tǒng)負(fù)責(zé)調(diào)度,區(qū)別在于線程
沒有獨(dú)立的存儲空間,而是和所屬進(jìn)程中的其它線程共享一個存儲空間,這使得線程間的通信遠(yuǎn)
較進(jìn)程簡單。
?* Java對多線程的支持
Java在語言級提供了對多線程程序設(shè)計的支持。
實現(xiàn)線程程序的兩種方式:
(1)從Thread類繼承;
(2)實現(xiàn)Runnable接口。
Java運(yùn)行時系統(tǒng)實現(xiàn)了一個用于調(diào)度線程執(zhí)行的線程調(diào)度器,用于確定某一時刻由哪一個線程在
CPU上運(yùn)行。
在java技術(shù)中,線程通常是搶占式的而不需要時間片分配進(jìn)程(分配給每個線程相等的CPU時間的
進(jìn)程)。搶占式調(diào)度模型就是許多線程處于可以運(yùn)行狀態(tài)(等待狀態(tài)),但實際上只有一個線程在
運(yùn)行。該線程一直運(yùn)行到它終止進(jìn)入可運(yùn)行狀態(tài)(等待狀態(tài)),或者另一個具有更高優(yōu)級的線程
變成可運(yùn)行狀態(tài)。在后一種情況下,低優(yōu)先級的線程被高優(yōu)先級的線程搶占,高優(yōu)先級的線程獲得
運(yùn)行的機(jī)會。
Java線程調(diào)度器支持不同優(yōu)先級線程的搶占方式,但其本身不支持相同優(yōu)先級線程的時間片輪換。
Java運(yùn)行時系統(tǒng)所在的操作系統(tǒng)(例如:windows2000)支持時間片的輪換,則線程調(diào)度器就支持
相同優(yōu)先級線程的時間片輪換。
用多線程技術(shù)模擬一個售票系統(tǒng)
實現(xiàn)代碼如下:
class TicketSystem
{
?public static void main(String[] args)
?{
??SellTicket st = new SellTicket();
??new Thread(st).start();
??new Thread(st).start();
??new Thread(st).start();
??new Thread(st).start();
?}
}
class SellTicket implements Runnable
{
?int tickets=100;
?Object o = new Object();
?public void run()
?{
??while(true)
??{
???/*
??? synchronized(o)? //同步塊在關(guān)鍵字后得加個對象(任意的對象都可以)
??? {
???? ?if(tickets>0)
??? ?{
?????? try
????? {
???? ??? Thread.sleep(10);
????? }
????? catch(Exception e)
????? {
??????? e.printStackTrace();
????? }
????????? System.out.println(Thread.currentThread().getName()+
????????? "sell tickets"+tickets);
????????? tickets--;????
???? }
??? }
??? */
??? sell();?
??}
?}
?public synchronized void sell()? //同步方法
?{
???? ?if(tickets>0)
??? ?{
?????? try
????? {
???? ??? Thread.sleep(10);
????? }
????? catch(Exception e)
????? {
??????? e.printStackTrace();
????? }
????????? System.out.println(Thread.currentThread().getName()+
????????? "sell tickets"+tickets);
????????? tickets--;????
???? } ??
?}
}
?* 線程的同步
?The code segments within a program that access the same object from separate,concurrent
?thread are called "critical sections"。
?同步的兩種方式:同步塊和同步方法
?沒一個對象都有一個監(jiān)視器(monitor),或者叫做瑣。
?同步方法利用的是this所代表的對象的瑣。
?每個class也有一個瑣,是這個class所對應(yīng)的Class對象的瑣。
完整示例:
class TicketSystem
{
?public static void main(String[] args)
?{
??SellTicket st = new SellTicket();
??new Thread(st).start();
??/*
?? *寫一個try{}catch{}塊讓main()方法所在的線程睡1秒
?? *主要是想要線程優(yōu)先啟動
??*/
??try
??{
???Thread.sleep(1);
??}
??catch(Exception e)
??{
???e.printStackTrace();
??}
??st.b=true;
??new Thread(st).start();
??//new Thread(st).start();
??//new Thread(st).start();
?}
}
class SellTicket implements Runnable
{
?int tickets=100;
?Object obj = new Object();
?boolean b=false;
?public void run()
?{
??if(b==false)
??{
???while(true)
????? sell();
??}
??else
??{
?????while(true)
?? {??
??? synchronized(this)? //同步塊在關(guān)鍵字后得加個對象(任意的對象都可以)
??? {
???? ?if(tickets>0)
??? ?{
?????? try
????? {
???? ??? Thread.sleep(10);
????? }
????? catch(Exception e)
????? {
??????? e.printStackTrace();
????? }
????????? System.out.println("obj:"+Thread.currentThread().getName()+
????????? " sell tickets"+tickets);
????????? tickets--;????
???? }
??? }???
?? // sell();?
??}
??}
?}
?public synchronized void sell()? //同步方法
?{
???? ?if(tickets>0)
??? ?{
?????? try
????? {
???? ??? Thread.sleep(10);
????? }
????? catch(Exception e)
????? {
??????? e.printStackTrace();
????? }
????????? System.out.println("sell():"+Thread.currentThread().getName()+
????????? "sell tickets"+tickets);
????????? tickets--;????
???? } ??
?}
}
?* 線程的死瑣
?哲學(xué)家進(jìn)餐的問題
?一幫哲學(xué)家在一起進(jìn)餐,但是每個人都只有1支筷子,大家都在等待別人拿出一支筷子讓自己
?先吃,然后再把自己的拿出去,但是大家都不愿意拿出自己的筷子。
?線程1瑣住了對象A的監(jiān)視器,等待對象B的監(jiān)視器,線程2鎖住了對象B的監(jiān)視器,等待對象A的
?監(jiān)視器,就造成了死瑣。
?示例代碼:
class TicketSystem
{
?public static void main(String[] args)
?{
??SellTicket st = new SellTicket();
??new Thread(st).start();
??/*
?? *寫一個try{}catch{}塊讓main()方法所在的線程睡1秒
?? *主要是想要線程優(yōu)先啟動
??*/
??try
??{
???Thread.sleep(1);
??}
??catch(Exception e)
??{
???e.printStackTrace();
??}
??st.b=true;
??new Thread(st).start();
??//new Thread(st).start();
??//new Thread(st).start();
?}
}
class SellTicket implements Runnable
{
?int tickets=100;
?Object obj = new Object();
?boolean b=false;
?public void run()
?{
??if(b==false)
??{
???while(true)
????? sell();
??}
??else
??{
?????while(true)
?? {??
??? synchronized(obj)? //同步塊在關(guān)鍵字后得加個對象(任意的對象都可以)
??? {
?????? try
????? {
???? ??? Thread.sleep(10);
????? }
????? catch(Exception e)
????? {
??????? e.printStackTrace();
????? }?
????? synchronized(this)
????? { ??? ?
???? ?????? if(tickets>0)
??? ???????? {
??????????????? System.out.println("obj:"+Thread.currentThread().getName()+
??????????????? " sell tickets"+tickets);
??????????????? tickets--;????
????????????? }
????? }
????? }???
??? }
??}
?}
?public synchronized void sell()? //同步方法
?{
??synchronized(obj)
??{
???? ?if(tickets>0)
??? ?{
?????? try
????? {
???? ??? Thread.sleep(10);
????? }
????? catch(Exception e)
????? {
??????? e.printStackTrace();
????? }
????????? System.out.println("sell():"+Thread.currentThread().getName()+
????????? "sell tickets"+tickets);
????????? tickets--;????
???? }
??}?
?}
}
?* wait,notify,notifyAll
?每個對象除了有一個瑣之外,還有一個等待隊列(wait set),當(dāng)一個對象剛剛創(chuàng)建的時候,它
?的等待隊列是空的。
?我們應(yīng)該在當(dāng)前線程鎖住對象的瑣后,去調(diào)用該對象的wait方法。
?當(dāng)調(diào)用對象的notify方法時,將從該對象的等待隊列中刪除一個任意的線程,這個線程將再次
?成為可運(yùn)行的線程。
?當(dāng)調(diào)用對象的notifyAll方法時,將從該對象的等待隊列中刪除所有等待的線程,這些線程將
?成為可運(yùn)行的線程。
?wait和notify重要用于producer-consumer這種關(guān)系中。
?代碼示例:
?class Test
{
?public static void main(String[] args)
?{
??Queque q = new Queque();
??Procedur p = new Procedur(q);
??Consumer c = new Consumer(q);
??p.start();
??c.start();
??
?}
}
class Procedur extends Thread?? //生產(chǎn)者
{
?Queque q;
?Procedur(Queque q)
?{
??this.q=q;
?}
?public void run()
?{
??for(int i=0;i<10;i++)
??{
???q.put(i);
???System.out.println("Procedur put"+ i);
??}
?}
}
class Consumer extends Thread?? //消費(fèi)者
{
?Queque q;
?Consumer(Queque q)
?{
??this.q=q;
?}
?public void run()
?{
??while(true)
??{
???System.out.println("Consumer get"+q.get());
??}
?}
}
class Queque??? //放置數(shù)據(jù)
{
?int value;
?boolean bFull=false;
?public synchronized void put(int i)
?{
??if(!bFull)
??{
??? value=i;?
??? bFull=true;
??? notify();??
??}
??try
??{
???wait();
??}
??catch(Exception e)
??{
???e.printStackTrace();
??}
?}
?public synchronized int get()
?{
??if(!bFull)
??{
???try
???{
????wait();
???}
???catch(Exception e)
???{
????e.printStackTrace();
???}
??}
??bFull=false;
??notify();
??return value;
?}
}
?線程的狀態(tài)圖
?? |
?? | new Thread
?? |?????????????????? yield????? sleep,wait,suspend,I/O阻塞
? \|/ start???????????????????? |------------------------------------>|
? New----->Runnable|??????????????????????????????????????????????????????? |Not Runnable
??????????????????????????? \??? |<------------------------------------|??????? ?/
???????????????????????????? \???? sleep結(jié)束,notify,resume,I/O操作完成??? /
????????????????????????????? \??????????????????????????????????????????????????????????????? ?/
?????????????????????????????? \???????????????????????????????????????????????????????????? ?/
??????????????????????????????? \??????????????????????????????????????????????????????? ?? /
???????????????????????????????? \?????????????????????????????????????????????????????? ? /
????????????????????????????????? \ run方法退出?????????????????????????????? ?/
?????????????????????????????????? \stop方法調(diào)用??????????????????????????? ?/
??????????????????????????????????? \?????????????????????????????????????????????? ?/
???????????????????????????????????? \?????????????????????????????????????????? ? /?
????????????????????????????????????? \??????????????????????????????????????? ? /? stop方法調(diào)用
?????????????????????????????????????? \????????????????????????????????????? ?/
??????????????????????????????????????? \???????????????????????????????????? /
???????????????????????????????????????? \?????????????????????????????????? /
????????????????????????????????????????? \?????????????????????????????? ?/
?????????????????????????????????????????? \????????????????????????? ?? /
??????????????????????????????????????????? \????????????????????????? ?/
???????????????????????????????????????????? \ ______?_____/
????????????????????????????????????????????? |??? ? Dead?????? ??|
????????????????????????????????????????????? |____________|
?線程的終止
?
?設(shè)置一個flag變量。
?結(jié)合interrupt()方法。
?code:
class TestThread
{
?public static void main(String[] args)
?{
??Thread1 t1=new Thread1();
??t1.start();
??int index=0;
??while(true)
??{
???if(index++==500)
???{
????t1.stopThread();
????break;
???}
???System.out.println(Thread.currentThread().getName());
??}
?}
}
class Thread1 extends Thread
{
?private boolean bStop=false;
?public void run()
?{
??while(!bStop)
??{
???System.out.println(getName());
??}
?}
?public void stopThread()
?{
??bStop=true;
?}
}
視頻目錄:
1.HTTP協(xié)議詳解
????詳細(xì)介紹了 HTTP 協(xié)議的內(nèi)容,包括: HTTP URL 、 HTTP 請求、 HTTP 響應(yīng)和 HTTP 消息。
????最后給出了兩個實驗,幫助大家更好地理解 HTTP 協(xié)議。
??? 本課程將為您深入學(xué)習(xí) Java Web 開發(fā)打下基礎(chǔ)。
2.?
?????Eclipse是一個開放源代碼的、基于 Java 的可擴(kuò)展的開發(fā)平臺,是目前非常流行的Java開發(fā)工具。
??? 本課程將為您介紹Eclipse的安裝、配置和使用。
3. HTML語言速成
??? 幫助您快速掌握HTML語言,為學(xué)習(xí)XML和JSP開發(fā)打下基礎(chǔ)。
4.? MySQL視頻教程
5.? 面向?qū)ο蟪绦蛟O(shè)計
6.? LINUX視屏教程
如果以上有你需要的,就留下email地址,晚上我會統(tǒng)一發(fā)!
匹配中文字符的正則表達(dá)式:
?[\u4e00-\u9fa5]
匹配雙字節(jié)字符
(
包括漢字在內(nèi)
)
:
[^\x00-\xff]
應(yīng)用:計算字符串的長度(一個雙字節(jié)字符長度計
2
,
ASCII
字符計
1
)
String.prototype.len=function(){return?this.replace([^\x00-\xff]/g,"aa").length;}
匹配空行的正則表達(dá)式:
\n[\s|?]*\r
匹配
HTML
標(biāo)記的正則表達(dá)式:
/<(.*)>.*<\/\1>|<(.*)?\/>/?
匹配首尾空格的正則表達(dá)式:
(^\s*)|(\s*$)
應(yīng)用:
javascript
中沒有像
vbscript
那樣的
trim
函數(shù),我們就可以利用這個表達(dá)式來實現(xiàn),如下:
String.prototype.trim?=?function()
{
return?this.replace(/(^\s*)|(\s*$)/g,?"");
}
利用正則表達(dá)式分解和轉(zhuǎn)換
IP
地址:
下面是利用正則表達(dá)式匹配
IP
地址,并將
IP
地址轉(zhuǎn)換成對應(yīng)數(shù)值的
Javascript
程序:
function?IP2V(ip)
{
re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g?//
匹配
IP
地址的正則表達(dá)式
if(re.test(ip))
{
return?RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
{
throw?new?Error("Not?a?valid?IP?address!")
}
}
不過上面的程序如果不用正則表達(dá)式,而直接用
split
函數(shù)來分解可能更簡單,程序如下:
var?ip="10.100.20.168"
ip=ip.split(".")
alert("IP
值是:
"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))
匹配
Email
地址的正則表達(dá)式:
\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配網(wǎng)址
URL
的正則表達(dá)式:
http://(
[\w-]+\.)+[\w-]+(/[\w-?./?%&=]*)?
利用正則表達(dá)式去除字串中重復(fù)的字符的算法程序:
[
注:此程序不正確,原因見本貼回復(fù)
]
var?s="abacabefgeeii"
var?s1=s.replace(/(.).*\1/g,"$1")
var?re=new?RegExp("["+s1+"]","g")
var?s2=s.replace(re,"")?
alert(s1+s2)?//
結(jié)果為:
abcefgi
這個方法對于字符順序有要求的字符串可能不適用。
得用正則表達(dá)式從
URL
地址中提取文件名的
javascript
程序,如下結(jié)果為
page1
s="http://www.9499.net/page1.htm"
s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
alert(s)
利用正則表達(dá)式限制網(wǎng)頁表單里的文本框輸入內(nèi)容:
用正則表達(dá)式限制只能輸入中文:
onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')"?onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"
用正則表達(dá)式限制只能輸入全角字符:
?onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')"?onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"
用正則表達(dá)式限制只能輸入數(shù)字:
onkeyup="value=value.replace(/[^\d]/g,'')?"onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"
用正則表達(dá)式限制只能輸入數(shù)字和英文:
onkeyup="value=value.replace(/[\W]/g,'')?"onbeforepaste="clipboardData.setData
幾個常用正則表達(dá)式:
('text',clipboardData.getData('text').replace(/[^\d]/g,''))"?
Email?:?/^\w+([-+.]\w+)*@\w+([-.]\\w+)*\.\w+([-.]\w+)*$/,????
Phone?:?/^((\(\d{3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}$/,????
Mobile?:?/^((\(\d{3}\))|(\d{3}\-))?13\d{9}$/,????
Url?:?/^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/,????
IdCard?:?/^\d{15}(\d{2}[A-Za-z0-9])?$/,????
Currency?:?/^\d+(\.\d+)?$/,
Number?:?/^\d+$/,????
Zip?:?/^[1-9]\d{5}$/,????
QQ?:?/^[1-9]\d{4,8}$/,????
Integer?:?/^[-\+]?\d+$/,????
Double?:?/^[-\+]?\d+(\.\d+)?$/,????
English?:?/^[A-Za-z]+$/,????
Chinese?:??/^[\u0391-\uFFE5]+$/,????
UnSafe?:/^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/,
JavaScript語法
什么是腳本程序和JavaScript
?*什么是腳本程序
?<html>
?<script language="javascript">
??? alert(new Date());
?</script>
?</html>
?*JavaScript簡介
? 前身叫作Livescript,是一種基于對象(Object)和事件驅(qū)動(Event Driver),并具有安全性能的腳本語言.
?*JavaScript與Java
? 是兩個公司開發(fā)的兩個不同產(chǎn)品,作用與用途大不一樣,但兩者語法上有很多相似之處,JavaScript并不是
? Java的子集.
?*JavaScript,JScript與ECMAScript
?*腳本代碼的位置
? 我們可以把代碼放到<script></script>標(biāo)簽之間:
? <script>
??? var x=3;
? </script>
? <p>This is a HTML 段落</p>
? <script>
??? alert(x);
? </script>
? 也可以放在一個單獨(dú)的文件中:
? <html>
? <script src="script.js" language="javascript">
?*將腳本程序代碼作為屬性值
? <a href="javascript:alert(new Data());">javascript</a>
? </html>
=======================================================================================
JavaScript的基本語法
?*JavaScript中的標(biāo)識符
?標(biāo)識符是指JavaScript中定義的符號,例如,變量名,函數(shù)名,數(shù)組名等.標(biāo)識符可以由任意順序的
?大小寫字母,數(shù)字,下劃線(_)和美元符號($)組成,但標(biāo)識符不能以數(shù)字開頭,不能是JavaScript
?中的保留關(guān)鍵字.
?合法的標(biāo)識符舉例: indentifler,username,user_name,_username,$username
?非法的標(biāo)識符舉例: int,98.3,Hello World
?*Java嚴(yán)格區(qū)分大小寫
?computer和Computer是兩個完全不同的標(biāo)識符
?*JavaScript程序代碼格式
?每條功能語句的最后必須用分號(;)結(jié)束,每個詞之間用空格,制表符,換行符或大括號,小括號這樣
?的分隔符隔開.
?*JavaScript程序的注釋
?/*...*/中可以嵌套"http://"注釋,但不能嵌套"/"...."/".
================================================================================
基本數(shù)據(jù)類型與常量
?*正型常量
?十六進(jìn)制以O(shè)x或OX開頭,例如:Ox8a.八進(jìn)制必須以O(shè)開頭,例如: 0123.十進(jìn)制的第一位不能為0
?(數(shù)字0除外),例如: 123
?*字符常量
?12.32,123.42,5E7,4e5等.
?*布爾值
?true和false.
?*字符串常量
?例如: "a book of JavaScript",'abc',"a",""(空字符串) .
?特殊字符需要用反斜杠(\)來轉(zhuǎn)意.
?例如: \r, \n, \t, \b, \', \\
?在JavaScript中一個連續(xù)的字符串不能分開在兩行中來寫.可以使用"+"號連起來.
?*null常量
?表示變量的值為空
?*undefined常量
?表示一個變量還沒有被復(fù)值時的狀態(tài),或某個對象的屬性不存在.
=========================================================================================
變量
?*定義一個變量,系統(tǒng)就會為之分配一塊內(nèi)存,程序可以用變量名來表示這塊內(nèi)存中的數(shù)據(jù).
?*聲明變量用var關(guān)鍵字
?例如: var x; (這個時候就是undifeined)
?*聲明變量的同時為其賦值
?例如: var name="lisi";
?*對已賦值的變量賦于一個其他類型的數(shù)據(jù)
?例如: name=123;
?*不事先聲明變量而直接使用
?例如: x=1234;
算術(shù)運(yùn)算符
?*+ 加法運(yùn)算符或正值運(yùn)算符,例如, x+5, +6.
? 它還能實現(xiàn)多個字符串的想加,也能將字符串與其他的數(shù)據(jù)類型連成一個新的字符串,條件
? 條件是該表達(dá)式中至少有一個字符串,例如: "x"+123的結(jié)果為"x123".
?*- 減法運(yùn)算符或負(fù)預(yù)算符,例如, 7-3, -8.
?** 乘法運(yùn)算符,例如, 3*7.
?*/ 除法運(yùn)算符,例如 9/4.
?*% 求模運(yùn)算符(算術(shù)中的求余),例如, 5%2
?*++將變量值加1后再將結(jié)果賦給這個變量,分為兩種,例如a++和++a
?*--用法與++預(yù)算符一樣
?
賦值運(yùn)算符
?
? 賦值運(yùn)算符的作用是將一個值賦給一個變量,最常用的是"=",還可以由"="運(yùn)算符和其他的一些
? 預(yù)算符組合成新的運(yùn)算符,例如:
? "+=","-="等.
比較運(yùn)算符
? *>大于
?? 當(dāng)左邊的操作數(shù)大于右邊的操作數(shù)時,返回true.
? *<小與
? *=
? *<=
? *>=
? *==
? *!=
? 注意: 不要把"=="寫成"="
邏輯運(yùn)算符
?
? *&&
? 邏輯與,當(dāng)左右兩邊的操作數(shù)都為true時,返回值為true,否則為false.
? *||
? 邏輯或,當(dāng)左右兩邊的操作數(shù)都為false時,返回值為false,否則為true.
? *!
? 邏輯非,當(dāng)操作數(shù)為ture的時,返回值為false,否則為true.
========================================================================
程序流程控制
?
?*順序結(jié)構(gòu)
?*if條件選擇語句
?*switch選擇語句
?*while循環(huán)語句
?*do while語句
?*for循環(huán)語句
?*break與continue語句
?if條件語句語法1:
?if(條件語句)
?{
?? 執(zhí)行語句塊
?}
?注意:if(x==null)或if(typeof(x)=="undefined")可以簡寫成if(!x)
?if條件語句語法2:
?if(條件語句)
?{
?? 執(zhí)行語句塊1
?}
?else
?{
?? 執(zhí)行語句塊2
?}
?變量=布爾表達(dá)式? 語句1 :語句2
?if條件語句語法3:
?if(條件語句)
?{
?? 執(zhí)行語句塊1
?}
?else if(條件語句2)
?{
?? 執(zhí)行語句塊2
?}
?....
?else if(條件語句塊n)
?{
?? 執(zhí)行語句塊n
?}
?else
?{
?? 執(zhí)行語句塊n+1
?}
?if語句塊的嵌套
?if(x<1)
?{
? if(y==1)
??? alert("x<1,y==1");
? else
??? alert("x<1,y!=1");
? }
? else if(x>10)
? {
??? if(y==1)
????? alert("x>10,y==1);
??? else
????? alert("x>10,y!=1");??
? }
===================================================================
函數(shù)
?
?*函數(shù)的作用與定義
?*全局變量與局部變量
?*參數(shù)個數(shù)可變的函數(shù)
?*創(chuàng)建動態(tài)函數(shù)
?*JavaScript中的系統(tǒng)函數(shù)
? 定義一個函數(shù)的語法如下:
? function 函數(shù)名 (參數(shù)列表)
? {
???? 程序代碼
???? return 表達(dá)式;
? }
? 對函數(shù)調(diào)用的幾種方式:
? 1.函數(shù)名(傳遞函數(shù)的參數(shù)1,傳遞給函數(shù)的參數(shù)2,.....)
? 2.變量=函數(shù)名(傳遞函數(shù)的參數(shù)1,傳遞給函數(shù)的參數(shù)2,.....)
? 3.對于有返回值的函數(shù)調(diào)用,也可以在程序中直接使用返回結(jié)果,例如:
? alert("sum="+square(2,3));
? 全局變量與局部變量,看下面的代碼:
? <script language="javascript">
?? var msg="全局變量";
?? function show()
?? {
????? msg="局部變量";
?? }
?? show();
?? alert(msg);
? </script>
? 參數(shù)個數(shù)可變的的函數(shù):
?<script language="javascript">
? function testparams()
? {
??? var params="";
??? for(var i=0;i<arguments.length;i++)
??? {
????? params +=" "+ arguments[i];
??? }
??? alert(params);
? }
??? testparams("abc",123);
??? testparams(123,456,"abc");
?</script>
? 注意:arguments代表了傳遞給函數(shù)的所有參數(shù)的所有集合。當(dāng)函數(shù)的個數(shù)不確定,
? 獲得參數(shù)個數(shù)很多,你又不想為每個參數(shù)定義一個變量,那么你就可以定義一個
? 像上面那個一樣的,定義一個為空的參數(shù)名,在內(nèi)部用循環(huán)來實現(xiàn)。
?創(chuàng)建動態(tài)函數(shù)的語法:
?var varName=new Function(argument1,....,lastArgument);
?說明:
?所有的參數(shù)都必須是字符串型的,最后的參數(shù)必須是這個動態(tài)函數(shù)的功能程序代碼.
?例子:
?<script>
?? var square=new Function("x","y",
??????????? "var sum;sum=x*x+y*y; return sum;");
?? alert(square(3,2));
?</script>
?動態(tài)函數(shù)有什么作用,在什么情況下使用?
?
?JavaScript中的系統(tǒng)函數(shù):
?.encodeURI方法(比URL的描述的范圍更大,一般情況下可以等同)
?返回一個URI字符串編碼后的效果。例如:
?<script language="javascript">
?? var uriStr=encodeURI("http://www.doit.org/index.html?country=中國&name=z x");
?? alert(uriStr);
?</script>
?.decodeURI方法
?將一個已編碼的URI字符串解碼成最初的字符串并返回.
?.parseInt方法
? 第一字符串按指定的進(jìn)制轉(zhuǎn)換成一個整數(shù),語法格式為:parseInt(numString,[redix])。
? 如果沒有指定第二個參數(shù),則前綴為'Ox'的字符串被視為十六進(jìn)制,前綴為'O'的字符串
? 被視為八進(jìn)制,所有其他的字符串被視為十進(jìn)制。
? 例如: alert(parseInt("123abc",10));
?.parseFloat方法
? 將一個字符串轉(zhuǎn)換為小數(shù)。
?.isNaN方法(用與檢測)
?.escape方法(用于對文本的簡單加密)
? 返回對一個字符串進(jìn)行編碼后的結(jié)果字符串。所有空格,標(biāo)點(diǎn),重音符號以及任何其他
? ASCII字符都用%xx編碼替換,其中xx等于表示該字符的Unicode編碼的十六進(jìn)制數(shù),字符
? 值大于255字符以%uxxxx格式表示。
?.unescape方法
? 將一個用escape方法編碼的字符串解碼成原始字符串。
?.eval方法
? 將其中的參數(shù)字符串作為一個JavaScript表達(dá)式執(zhí)行。
=======================================================================
? 對象
?*對象與對象實例
?*構(gòu)造方法與this關(guān)鍵字的作用
?*在函數(shù)中修改參數(shù)值的問題
?對象與對象實例
?.對象中所包含的變量就是對象的屬性,對象中所包含的對屬性進(jìn)行操作的函數(shù)就是對象的
? 方法,對象的屬性和方法都叫對象的成員。
?.對象是某一類事物的描述,是抽象的概念;而對象實例是一類事物中的具體個例。
?.能夠被用來創(chuàng)建對象實例的函數(shù)就是對象的構(gòu)造函數(shù),只要定義一個對象的構(gòu)造函數(shù),就
? 等于被定義了一個對象。使用new關(guān)鍵字和對象的構(gòu)造函數(shù)就可以創(chuàng)建對象實例,語法格式
? 如下: var ObjectInstance = new ObjName(傳遞給該對象的實際參數(shù)列表)。
? <script language="javascript">
? function Person()
? {
??? //這是一個構(gòu)造函數(shù)
? }
? var person1 = new Person();? //創(chuàng)建了一個實例變量(對象實例)
? person1.age = 18;
? person1.name = "blovesaga"; //age和name為對象屬性
? //alert(person1.name+"."+person1.age);
? function sayFunc()
? {
??? alert(person1.name+"."+person1.age);//我們也可以使用person["age"](對象實例["成員變量"])來訪問
? }
? person1.say=sayFunc;? //把方法名賦值給了person1.say成員,我們可以在其他地方像
??????????????????????? //調(diào)用方法一樣來調(diào)用
? person1.say();
? </script>
看下面的例子:
<html>
?<script language="javascript">
?? //定義一個構(gòu)造函數(shù),也就是對象的名稱為person
?? function Person()
?? {
?? }
?? //創(chuàng)建一個對象實例
?? var person1=new Person();
?? person1.age=18;
?? person1.name="zxy";
?? //編寫一個成員方法
?? function sayFunc()
?? {
????? var x="name";
????? eval("alert(person1."+ x + ");");? //這個字符串中的內(nèi)容將被作為JavaScipt代碼來執(zhí)行
????? alert(person1.name+":"+person1.age);
?? }
?? person1.say=sayFunc; //把方法名賦值給了person1.say成員
?? person1.say=sayFunc(); //寫了括號表示執(zhí)行sayFunc()函數(shù)在復(fù)值
?? person1.say();
?</script>
</html>
===================================================================
構(gòu)造方法與this關(guān)鍵字
?.為一個對象實例新增加的屬性和方法,不會增加到同一個對象所產(chǎn)生的其它對象實例上。
?.所有的實例對象在創(chuàng)建都會自動調(diào)用構(gòu)造函數(shù),在構(gòu)造函數(shù)中增加的屬性和方法會被
? 增加到每個對象實例上。
?.對象實例是使用new關(guān)鍵字創(chuàng)建的,在構(gòu)造方法中不要有返回結(jié)果的return語句。
?.調(diào)用對象的成員方法時,需要使用“對象實例.成員方法"的形式,很顯然,用作成
? 員方法的函數(shù)被調(diào)用,一定伴隨有某個對象實例。this關(guān)鍵字代表某個成員方法執(zhí)行時
?? ,引用該方法的當(dāng)前對象實例,所以,this關(guān)鍵字一般只在用作對象成員方法的
? 函數(shù)中出現(xiàn)。
? <script language="javascript">
?? function Person(name,age)
?? {
???? this.age=age;
???? this.name=name;
???? this.say=sayFunc;
?? }
?? function sayFunc()
?? {
????? alert(this.name+":"+this.age);
?? }
?? var person1=new Person("張山",18);
?? person1.say();
?? var person2 = new Person("里四",30);
?? person2.say();
? </script>
例子代碼:
<html>
?<script language="javascript">
?? //定義一個構(gòu)造函數(shù)
?? function Person(name,age)
?? {
???? this.name=name;//當(dāng)前的對象實例增加一個成員變量name,成員變量的通過Person()參數(shù)name傳遞進(jìn)來
???? this.age=age;//當(dāng)前的對象實例增加一個成員變量age,成員變量的通過Person()參數(shù)age傳遞進(jìn)來
???? this.say=sayFunc; //增加一個sayFunc()函數(shù)
?? }
?? function sayFunc()
?? {
???? alert(this.name + ":" + this.age);
?? }
?? //創(chuàng)建一個對象實例
?? var person1=new Person("張三",18);
?? person1.say();? //調(diào)用person1的say()成員方法
?? var person2=new Person("李四",29);
?? person2.say();? //調(diào)用person2的say()成員方法
?</script>
</html>
=====================================================================
在函數(shù)中修改參數(shù)值的問題
?將基本數(shù)據(jù)類型的變量作為函數(shù)參數(shù)傳遞的情況:
?<script language="javascript">
? function changeValue(x)
? {
??? x=5;
? }
? var x=3;
? changeValue(x);
? alert(x);
?</script>
注意: 在函數(shù)changeValue(x)中的x=5并不能修改主程序中的x值,函數(shù)接受的參數(shù)
就相當(dāng)于一個局部變量,當(dāng)函數(shù)調(diào)用完也就沒用了。所以該程序的結(jié)果為x=3;如果
我們把一個對象的實例傳遞給函數(shù),而我們有在函數(shù)中修改了對象實例的屬性,那么
最后的結(jié)果也會變化的。
>>>>>>>>>>>>>>>>Runtime和Process類<<<<<<<<<<<<<<<<<<<
1> 每一個Java程序都有一個Runtime類的單一實例。
2> 通過Runtime.getRuntime()獲取Runtime類的實例。
3> Runtime類是使用單例模式的一個例子。
?? Runtime沒有public的構(gòu)造方法。我們必須用Runtime的靜態(tài)方法getRuntime();我們可以用
?? Runtime的exec來執(zhí)行一個外部程序,也可以用來編譯一個源文件(用來做圖形界面的編譯器)。
import java.io.*;
class RuntimeTest
{
?public static void main(String[] args)
?{
??Runtime rt=Runtime.getRuntime();
??//System.out.println(rt.freeMemory());
??try
??{
???//rt.exec("notepad");
???Process p=rt.exec("java ArrayTest");
???InputStream is=p.getInputStream(); //從執(zhí)行ArrayTest類所得來的
???int data;
???while((data=is.read())!=-1)
???{
????System.out.print((char)data);
???}
??}
??catch(Exception e)
??{
???e.printStackTrace();
??}
?}
}
------------->>設(shè)計模式<<-------------
1> 在我們進(jìn)行程序設(shè)計時,逐漸形成了一些典型問題和問題解決方案,這就是軟件模式。
2> 每一個模式描述了一個在我們程序設(shè)計中經(jīng)常發(fā)生的問題,以及該問題的解決方案。
3> 當(dāng)我們碰到模式所描述的問題,就可以直接用相應(yīng)的解決方法去解決這個問題,這就是設(shè)計模式。
<$>單例(Singleton)模式
1> 一個類只有一個實例,而且自行實例化并像整個系統(tǒng)提供這個實例,這個類稱為單例類。
2> 單例類的一個重要特點(diǎn)就是類的構(gòu)造方法是私有的,從而避免了外部用利用構(gòu)造方法直接創(chuàng)建多個實例。
?? 如:Runtime類。
單例類的實現(xiàn):(code)
class Singleton
{
?private static final Singleton st=new Singleton();
?private Singleton()
?{
??
?}
?public static Singleton getInstance()
?{
??return st;
?}
}
=============================封裝類===============
針對八種基本數(shù)據(jù)類型定義的相應(yīng)的引用類型-封裝類(包裝類,包裹類)
基本數(shù)據(jù)類型????????? 封裝類
?boolean?????????????? Boolean
?byte????????????????? Byte
?short???????????????? Short
?int?????????????????? Integer
?long????????????????? Long
?char????????????????? Character
?float???????????????? Float
?double??????????????? Double
所有的封狀類都是一個只讀類(不能修改的).針對沒個基本類型我們只能建立一個這讀的。
class Test
{
?public static void main(String[] args)
?{
??int i=3;
??Integer in=new Integer(i);
??int j=in.intValue();
??System.out.println(j);
??String str=in.toString();? //把Integer對象轉(zhuǎn)換為String類型
??System.out.println("str="+str);
??
??String str1="123";
??System.out.println(Integer.valueOf(str1));? //把String類型轉(zhuǎn)換為Integer類型
??
??boolean b1=false;
??Boolean b=new Boolean(b1);
??String s1=b.toString();
??System.out.println(s1);
??
??String s2="NO";
??System.out.println(Boolean.valueOf(s2));
?}
}
*****************Class*********************
1> 在Java中,每個class都有一個相應(yīng)的Class對象。也就是說,當(dāng)我們編寫一個類,編譯完成后,在生成
?? 的.class文件中,就會產(chǎn)生一個Class對象,用于表示這個類的類型信息。
2> 獲取Class實例的方法有三種:
?? <1>利用對象調(diào)用getClass()方法獲得該對象的Class實例。
?? <2>使用Class類的靜態(tài)方法forName(),用類的名字獲取一個Class的是實例。
?? <3>運(yùn)用.class的方式來獲取Class實例,對于基本數(shù)據(jù)類型的封裝類,還可以用.TYPE來獲取相應(yīng)的
????? 基本數(shù)據(jù)類型的Class實例。
?? <4>在運(yùn)行期間,如果我們要產(chǎn)生某個類的對象,JAVA虛擬機(jī)(JVM)會檢查該類型的Class對象是否被
????? 加載,如果沒有加載,JVM會根據(jù)類的名稱找到.class文件并加載它。一旦某個類型的Class對象已
????? 經(jīng)被加載到內(nèi)存,就可以用它來產(chǎn)生該類型所有的對象。
?? <5>newInstance()調(diào)用類中缺省的構(gòu)造方法。(好處是我們在不知道類的名字的情況下去創(chuàng)造一個實例)
import java.lang.reflect.*;?????? //子包必須手動導(dǎo)入
class ClassTest
{
?public static void main(String[] args)//throws Exception
?{
??/*
??Point pt=new Point();?????????????
??Class c1=pt.getClass();//利用對象調(diào)用getClass()方法獲得該對象的Class實例
??System.out.println(c1.getName());
??
??Class c2=Class.forName("Point");//使用Class類的靜態(tài)方法forName(),用類的名字獲取一個Class的是實例
??System.out.println(c2.getName());
??
??Class c3=Point.class;//運(yùn)用.class的方式來獲取Class實例
??System.out.println(c3.getName());
??
??Class c4=Integer.TYPE;//封裝類用.TYPE來獲取相應(yīng)的基本數(shù)據(jù)類型的Class實例。
??System.out.println(c4.getName());
??*/
??/*
??System.out.println("before new Point()");
??new Point();
??System.out.println("after new Point()");
??Class.forName("Line");
??*/
??/*
??if(args.length!=1)
??{
???return;
??}
??try
??{
???Class c=Class.forName(args[0]);
???Point pt=(Point)c.newInstance();
???pt.output();
??}
??catch(Exception e)
??{
???e.printStackTrace();
??}
??*/
??if(args.length!=1)
??{
???return;
??}
??try
??{
???Class c=Class.forName(args[0]);
???Constructor[] cons=c.getDeclaredConstructors();
???/*
???for(int i=0;i<cons.length;i++)
???{
????System.out.println(cons[i]);
???}
???Method[] ms=c.getDeclaredMethods();
???for(int i=0;i<ms.length;i++)
???{
????System.out.println(ms[i]);
???}*/
???Class[] params=cons[0].getParameterTypes();
???Object[] paramValues=new Object[params.length];
???for(int i=0;i<params.length;i++)
???{
????if(params[i].isPrimitive())
????{
?????paramValues[i]=new Integer(i+3);
????}
???}
???Object o=cons[0].newInstance(paramValues);
???Method[] ms=c.getDeclaredMethods();
???ms[0].invoke(o,null);
??}
??catch(Exception e)
??{
???e.printStackTrace();
??}
??
?}
}
class Point
{
?static
?{
??System.out.println("Loading Point");
?}
?int x,y;
?void output()
?{
??System.out.println("x="+x+","+"y="+y);
?}
?Point(int x,int y)
?{
??this.x=x;
??this.y=y;
?}
}
class Line
{
?static
?{
??System.out.println("Loading Line");
?}
}
1> 在java中,傳參時,都是以傳值的形式驚行。
2> 對于基本數(shù)據(jù)類型,傳遞的是數(shù)據(jù)的拷貝,對于引用類型,傳遞的引用的拷貝。
3> 當(dāng)我們在打印一個對象的時候,比如System.out.println(pt);,它會自動調(diào)用類的toString()方法
?? ,所以建議在所有的子類中重寫toString()方法。
我們寫一個函數(shù)用來交換兩個變量(x,y)的值.
?code:
{
?public static void change(int x, int y)
?{
??x=x+y;
??y=x-y;
??x=x-y;
?}
?/*
?public static void change(int[] num)
?{
??num[0]=num[0]+num[1];
??num[1]=num[0]-num[1];
??num[0]=num[0]-num[1];
?}
?public static void change(Point pt)
?{
??pt.x=pt.x+pt.y;
??pt.y=pt.x-pt.y;
??pt.x=pt.x-pt.y;
?}
?*/
?public static void main(String[] args)
?{
?int x=3;
?int y=4;
?change(3,4);
?System.out.println("x="+x+","+"y="+y);
?}
我們期望的輸出結(jié)果是 x=4,y=3 然后你運(yùn)行后發(fā)現(xiàn)結(jié)果為x=3,y=4,并沒有達(dá)到我們的要求,為什么呢?那是因為對于基本數(shù)據(jù)類型,傳遞的是數(shù)據(jù)的拷貝,對于引用類型,傳遞的是引用(首地址)的拷貝??纯聪旅娴膬?nèi)存圖解應(yīng)該你就能看出來了.看看引用類型怎么來實現(xiàn):
{
?/*
?public static void change(int x, int y)
?{
??x=x+y;
??y=x-y;
??x=x-y;
?}
?*/
?public static void change(int[] num)
?{
??num[0]=num[0]+num[1];
??num[1]=num[0]-num[1];
??num[0]=num[0]-num[1];
?}
?public static void change(Point pt)
?{
??pt.x=pt.x+pt.y;
??pt.y=pt.x-pt.y;
??pt.x=pt.x-pt.y;
?}
?public static void main(String[] args)
?{
??/*
?? int x=3;
?? int y=4;
?? change(3,4);
?? System.out.println("x="+x+","+"y="+y);
?? */
?? int[] num=new int[]{3,4};
?? change(num);
?? System.out.println("x="+num[0]+","+"y="+num[1]);
??
?? Point pt=new Point();
?? pt.x=3;
?? pt.y=4;
?? change(pt);
?? System.out.println("x="+pt.x+","+"y="+pt.y);?
?}
class Point
{
?int x,y;?
}
再看看引用類型的內(nèi)存變化圖:
b> 對于基本數(shù)據(jù)類型,傳遞的是數(shù)據(jù)的拷貝,對于引用類型,傳遞的是引用(首地址)的拷貝。
^^^^^^^^^^^^^^^對象的克隆^^^^^^^^^^^^^
1> 為了獲取對象的一份拷貝,我們可以利用Object類的clone()方法。
2> 在派生類中覆蓋基類的clone(),并聲明為public。
3> 在派生類的clone()方法中,調(diào)用super.clone()。
4> 在派生類中實現(xiàn)Cloneable接口。
4> 沒有抽象方法的接口叫標(biāo)識接口。
5> 為什么我們在派生類中覆蓋Object的clone()方法時,一定要調(diào)用super.clone()呢?在運(yùn)行時刻,Object
?? 的clone()方法能識別出你要復(fù)制的是哪一個對象,然后為此對象分配空間,并進(jìn)行對象的復(fù)制,將原
?? 始對象的內(nèi)容一一復(fù)制到新的對象空間去。
{
?public static void main(String[] args)
?{
?? Professor p=new Professor("feiyang",23);
?? Student s1=new Student("zhangshan",18,p);
?? Student s2=(Student)s1.clone();
?? s2.p.name="feifei";
?? s2.p.age=30;
?? System.out.println("name="+s1.p.name+","+"age="+s1.p.age);
?}
}
{
?String name;
?int age;
?Professor(String name,int age)
?{
??this.name=name;
??this.age=age;
?}
}
class Student implements Cloneable
{
?Professor p;
?String name;
?int age;
?Student(String name, int age,Professor p)
?{
??this.name=name;
??this.age=age;
??this.p=p;
?}
?public Object clone()
?{
??Object o=null;
??try
??{
???o=super.clone();
??}
??catch(CloneNotSupportedException e)
??{
???e.printStackTrace();
??}
??return o;
?}
}
{
?public static void main(String[] args)
?{
?? Professor p=new Professor("feiyang",23);
?? Student s1=new Student("zhangshan",18,p);
?? Student s2=(Student)s1.clone();
?? s2.p.age=30;
?? System.out.println("name="+s1.p.name+","+"age="+s1.p.age);
?}
}
{
?String name;
?int age;
?Professor(String name,int age)
?{
??this.name=name;
??this.age=age;
?}
?public Object clone()
?{
??Object o=null;
??try
??{
???o=super.clone();
??}
??catch(CloneNotSupportedException e)
??{
???e.printStackTrace();
??}
??return o;
?}
}
class Student implements Cloneable
{
?Professor p;
?String name;
?int age;
?Student(String name, int age,Professor p)
?{
??this.name=name;
??this.age=age;
??this.p=p;
?}
?public Object clone()
?{
??//Object o=null;
??Student o=null;
??try
??{
???o=(Student)super.clone();
??}
??catch(CloneNotSupportedException e)
??{
???e.printStackTrace();
??}
??o.p=(Professor)p.clone();
??return o;
?}
}