1:清除sam文件:
WinNT系列的系統(tǒng)賬戶信息是存在%systemroot%\system32\config\sam這個(gè)注冊(cè)表文件里的。 如果系統(tǒng)里沒(méi)有重要的賬戶,或者賬戶比較少,用刪除%systemroot%\system32\config\sam的方法是比較簡(jiǎn)單的,不過(guò)因?yàn)橄到y(tǒng)會(huì)還原為只有administrator(密碼為空)和guest二個(gè)賬戶,所以有些程序因?yàn)樗鼈兯蕾嚨馁~戶丟失了,如iis、vmware就不能啟動(dòng)了。
原來(lái)聽說(shuō)這種方法只能適用于nt workstation系列(2kpro),不能用于server,我在2000professional和2000 advanced server上試驗(yàn)都是成功的。不知道為什么會(huì)有上述說(shuō)法,可能是活動(dòng)目錄ad下不行吧。
當(dāng)然首先你要能夠訪問(wèn)系統(tǒng)分區(qū),來(lái)把sam文件改名或者刪除。如果是fat32、fat分區(qū),使用98啟動(dòng)盤就行了。如果是ntfs分區(qū),可以使用winternal的ntfs for dos、ntfs for 98或者是支持ntfs的啟動(dòng)光盤,再或者掛到其他win2000、linux等機(jī)器上,再再或者重新安裝一個(gè)新的win2000。
2:專用工具:
windows管理員密碼丟失還有一個(gè)解決方法是使用Petter Nordahl-Hagen的The Offline NT Password Editor(http://home.eunet.no/~pnordahl/ntpasswd/),這個(gè)工具是離線修改注冊(cè)表文件sam來(lái)設(shè)置密碼的。需要用他的映像文件制作啟動(dòng)盤來(lái)引導(dǎo),進(jìn)而訪問(wèn)ntfs分區(qū)重新設(shè)置密碼;雖然作者經(jīng)常更新他的程序,不過(guò)我還是會(huì)擔(dān)心他直接操作sam文件的安全性,可能有時(shí)會(huì)導(dǎo)致系統(tǒng)出錯(cuò)。可能還有其他類似工具吧,恕我無(wú)知。
3:還有一種想法就是用一個(gè)修改密碼的小程序來(lái)替換系統(tǒng)啟動(dòng)的必要程序,然后系統(tǒng)啟動(dòng)時(shí)就會(huì)替換密碼,隨后把被替換的程序在還原就行了。當(dāng)然首先你還是要能夠訪問(wèn)系統(tǒng)分區(qū),來(lái)替換隨系統(tǒng)啟動(dòng)的程序。
替換系統(tǒng)啟動(dòng)的必要程序的一種方法是我寫的一個(gè)清除administrator密碼的小程序(CleanPwd:http://www.BingleSite.net/myprog/CleanPwd/CleanPwd.rar),他所作的就是把a(bǔ)dministrator密碼清空。使用方法如下:
1):用雙系統(tǒng)或者啟動(dòng)盤或者掛到別的系統(tǒng)上,如果是NTFS分區(qū)其他系統(tǒng)或啟動(dòng)盤要能讀寫NTFS分區(qū),把windows安裝目錄下的system32\svchost.exe改名svchost.bak.exe備份,把CleanPwd.exe拷貝成svchost.exe。
2):?jiǎn)?dòng)該系統(tǒng),就把a(bǔ)dministrator的密碼清空了,可以直接登陸。
3):把svchost.bak.exe 恢復(fù)就行了(如果使用替換的是svchost,最好再啟動(dòng)rpc服務(wù))。為什么選用svchost.exe而不是其他程序,因?yàn)槊總€(gè)windows2000系統(tǒng)都有這幾個(gè)進(jìn)程,System(kernel Executive and kernel)、smss(session manager)、csrss(win32 subsystem)、winlogon(logon process)、services(Service control manager)、lsass(local security authentication server ) 如果任何一個(gè)被殺掉或者出錯(cuò),系統(tǒng)將重新啟動(dòng)。不過(guò)在lsass啟動(dòng)之前你不能修改密碼,所以不能選用這幾個(gè)程序。
另外系統(tǒng)中一般還有以下一些程序:svchost.exe(Remote Procedure Call (RPC) 還有其他一些服務(wù))、WBEM\WinMgmt.exe(Windows Management Instrumentation)、mstask.exe(Task Scheduler)、regsvc.exe(Remote Registry Service) 可能還有其他服務(wù)程序,你可能禁止了除RPC之外的其他服務(wù),但不會(huì)禁止rpc,否則系統(tǒng)工作就不正常了。所以我選擇了svchost,如果你知道其他服務(wù)會(huì)自動(dòng)啟動(dòng),你也可以選擇它。當(dāng)然如果系統(tǒng)安裝了殺毒軟件的話,你替換殺毒軟件也可以,因?yàn)橐话銡⒍拒浖紩?huì)在系統(tǒng)啟動(dòng)是啟動(dòng)殺毒防火墻來(lái)殺毒的。
??????? 2007 年將是載入史冊(cè)的一年,Sun Microsystems 公司將于這一年在開源許可協(xié)議下發(fā)布 Java 開發(fā)包(JDK),從而放棄了對(duì) Java? 平臺(tái)的統(tǒng)馭,將權(quán)力交給了 Java 開發(fā)人員社區(qū)!在本文中,Java 開發(fā)人員 Elliotte Rusty Harold 從各個(gè)方面預(yù)測(cè)了 Java 平臺(tái)的新方向,從腳本到 bug 修復(fù)到新語(yǔ)法。
2006 年又是 Java 平臺(tái)繁榮的一年。盡管遭遇了來(lái)自 Microsoft(C#)和腳本語(yǔ)言社區(qū)(Ruby)的沖擊,但 Java 語(yǔ)言仍然保持著其世界頭號(hào)編程語(yǔ)言的地位。同時(shí),盡管 Java 6 的發(fā)布很值得慶祝,但比起宣布 Java 將在 GNU General Public License 下完全開源這一事件來(lái)說(shuō),卻不免有些黯然失色。Java 在 2007 年還能保持這種勢(shì)頭嗎?讓我們來(lái)看一下成敗的可能。
Java 平臺(tái)將成為開源平臺(tái)
2007 年上半年,Sun 將在一個(gè)開源許可協(xié)議下發(fā)布 Java 開發(fā)包(JDK)。解除 JDK 的禁錮對(duì)于 Java 開發(fā)人員社區(qū)來(lái)說(shuō)是巨大的一步,它將在今后的十年中推動(dòng) Java 平臺(tái)的發(fā)展。
JDK 的質(zhì)量將會(huì)顯著改善,因?yàn)槌绦騿T們不再僅僅報(bào)告 bug 并開始修復(fù)。Java Developer Connection 的 bug 報(bào)告將會(huì)包括對(duì) JDK 中的問(wèn)題部分的詳細(xì)分析,并提供修復(fù)的補(bǔ)丁。正如Linus 法則 所陳述的那樣,“只要給予足夠的關(guān)注,任何 bug 都是顯而易見”,即調(diào)試是可并行進(jìn)行的。優(yōu)化也是一樣。開源使兩者得以 并行。
分支項(xiàng)目
遺憾的是,設(shè)計(jì)并不是和調(diào)試、優(yōu)化一樣可以并行完成的。清潔的 API 有時(shí)也需要有一只獨(dú)裁的手。但獨(dú)裁者的缺點(diǎn)是:有時(shí)他們知道在做什么,有時(shí)卻不知道。意圖成為獨(dú)裁者的各方面之間的競(jìng)爭(zhēng)往往是發(fā)現(xiàn)問(wèn)題最佳解決方案的惟一方式。
很少有公司能夠負(fù)擔(dān)得起這樣的代價(jià),為一個(gè)產(chǎn)品開發(fā)多個(gè)獨(dú)立的實(shí)現(xiàn),以便在多個(gè)產(chǎn)品中選定保留一個(gè)而摒棄其余的產(chǎn)品,但開源社區(qū)卻在朝這個(gè)方向努力。所以,您會(huì)在 Java 平臺(tái)的各個(gè)層次中發(fā)現(xiàn)分支產(chǎn)品:語(yǔ)言、虛擬機(jī)和庫(kù)。大多數(shù)的分支產(chǎn)品會(huì)失敗,但這沒(méi)什么。好主意會(huì)脫穎而出。一些分支產(chǎn)品會(huì)一直存在下去,一些會(huì)重新并入標(biāo)準(zhǔn) JDK 中。明年的這個(gè)時(shí)候,分支產(chǎn)品與主流產(chǎn)品之間的差異也許不會(huì)很明顯,但這個(gè)過(guò)程會(huì)繼續(xù)下去。
Sun 會(huì)在幾個(gè)月后發(fā)布 Java 7,Dolphin 的一個(gè)早期的 beta 版,以此作為開端。Sun 無(wú)法發(fā)布更早的 JDK 版本,因?yàn)榇嬖谝恍┲挥性?Dolphin 中才能解決的構(gòu)建問(wèn)題和許可協(xié)議問(wèn)題。盡管如此,仍有望看到第三方著手進(jìn)一步細(xì)分 Sun 的版本,來(lái)提供 Java 6、Java 5、Java 1.4,甚至更早版本的流行開源實(shí)現(xiàn)。
早期的一些探尋分支產(chǎn)品的人們可能會(huì)侵犯 Sun 公司的商標(biāo),收到 Sun 的律師寄來(lái)的討厭的律師信。我們需要一個(gè)通用的未注冊(cè)為商標(biāo)的名字,讓所有人都能使用。我建議用 “J” —— 我希望沒(méi)人用單字母作商標(biāo)。
開源項(xiàng)目從未消亡,只是有些褪色。就像之前的 Blackdown Project、GNU Classpath、Kaffe 和其他開源 JDK 項(xiàng)目一樣,他們的開發(fā)人員都轉(zhuǎn)向其他事情了。如果一個(gè)項(xiàng)目至今還沒(méi)有達(dá)到 1.0,那么恐怕以后永遠(yuǎn)也達(dá)不到了。
期待 Java 7
Dolphin 不會(huì)在 2007 年發(fā)布。2008 年是更為現(xiàn)實(shí)的目標(biāo)。那就是說(shuō),工作尚在進(jìn)行中,它的一些功能也許會(huì)作為早期的標(biāo)準(zhǔn)擴(kuò)展或至少作為 beta 登場(chǎng)。
遺憾的是,為一門語(yǔ)言添加功能遠(yuǎn)比刪除功能要簡(jiǎn)單得多。幾乎不可避免地,隨著時(shí)間的推移,語(yǔ)言不是朝著簡(jiǎn)單的方向發(fā)展,而是越來(lái)越復(fù)雜,越來(lái)越讓人困惑。即使是那些單獨(dú)看起來(lái)很好的功能,在彼此疊加后也會(huì)出現(xiàn)問(wèn)題。
令人遺憾,Java 社區(qū)沒(méi)有接受這個(gè)教訓(xùn),盡管這種失敗并無(wú)特殊性。但總有一些太酷又太讓人激動(dòng)的新語(yǔ)法令語(yǔ)言設(shè)計(jì)者難以抗拒 —— 即便這樣的新語(yǔ)法不能解決任何實(shí)際問(wèn)題。于是對(duì) Java 7 的新語(yǔ)言功能就有了巨大的要求,包括閉包、多繼承和操作符重載。
我猜想在這一年結(jié)束前,會(huì)在 Java 7 beta 中看到閉包,也許還能看到操作符重載(有五成的把握),但不會(huì)出現(xiàn)多繼承。Java 中有太多東西是基于單個(gè)根的繼承層次。沒(méi)有可行的方式改進(jìn)多繼承,使之適應(yīng)這門語(yǔ)言。
目前有許多語(yǔ)法糖方面的提議,有一些有意義,有一些沒(méi)有。許多提議都專注于將像 getFoo() 這樣的方法替換為像 -> 這樣的操作符。
import java.lang.reflect.*;
/*************************************************
md5 類實(shí)現(xiàn)了RSA Data Security, Inc.在提交給IETF
的RFC1321中的MD5 message-digest 算法。
*************************************************/
public class MD5
{
// 下面這些S11-S44實(shí)際上是一個(gè)4*4的矩陣,這樣寫是方便修改
static final int S11 = 7;
static final int S12 = 12;
static final int S13 = 17;
static final int S14 = 22;
static final int S21 = 5;
static final int S22 = 9;
static final int S23 = 14;
static final int S24 = 20;
static final int S31 = 4;
static final int S32 = 11;
static final int S33 = 16;
static final int S34 = 23;
static final int S41 = 6;
static final int S42 = 10;
static final int S43 = 15;
static final int S44 = 21;
static final byte[] PADDING = { -128, 0, 0, 0, 0, 0, 0, 0, 0,
???? 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
???? 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
???? 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
// 下面的三個(gè)成員是MD5計(jì)算過(guò)程中用到的3個(gè)核心數(shù)據(jù),在原始的C實(shí)現(xiàn)中
// 被定義到MD5_CTX結(jié)構(gòu)中
private long[] state = new long[4];??? // state (ABCD)
private long[] count = new long[2];??? // number of bits, modulo 2^64 (lsb first)
private byte[] buffer = new byte[64]; // input buffer
// digestHexStr是MD5的唯一一個(gè)公共成員,是最新一次計(jì)算結(jié)果的
//??? 16進(jìn)制ASCII表示.
public String digestHexStr;
// digest,是最新一次計(jì)算結(jié)果的2進(jìn)制內(nèi)部表示,表示128bit的MD5值.
private byte[] digest = new byte[16];
// getMD5ofStr是類MD5最主要的公共方法,入口參數(shù)是你想要進(jìn)行MD5變換的字符串
//??? 返回的是變換完的結(jié)果,這個(gè)結(jié)果是從公共成員digestHexStr取得的.
??
public String getMD5ofStr(String inbuf)
{
??? md5Init();
??? md5Update(inbuf.getBytes(), inbuf.length());
??? md5Final();
??? digestHexStr = "";
??? for (int i = 0; i < 16; i++)
??? {
???? digestHexStr += byteHEX(digest[i]);
??? }
??? return digestHexStr;
}
// 這是MD5這個(gè)類的標(biāo)準(zhǔn)構(gòu)造函數(shù),JavaBean要求有一個(gè)public的并且沒(méi)有參數(shù)的構(gòu)造函數(shù)
public MD5()
{
??? md5Init();
??? return;
}
// md5Init是一個(gè)初始化函數(shù),初始化核心變量,裝入標(biāo)準(zhǔn)的幻數(shù)
private void md5Init()
{
??? count[0] = 0L;
??? count[1] = 0L;
??? // Load magic initialization constants.
??? state[0] = 0x67452301L;
??? state[1] = 0xefcdab89L;
??? state[2] = 0x98badcfeL;
??? state[3] = 0x10325476L;
??? return;
}
// F, G, H ,I 是4個(gè)基本的MD5函數(shù),在原始的MD5的C實(shí)現(xiàn)中,由于它們是
//??? 簡(jiǎn)單的位運(yùn)算,可能出于效率的考慮把它們實(shí)現(xiàn)成了宏,在java中,我們把它們
// 實(shí)現(xiàn)成了private方法,名字保持了原來(lái)C中的。
??
private long F(long x, long y, long z) {
??? return (x & y) | ((~x) & z);
}
private long G(long x, long y, long z) {
??? return (x & z) | (y & (~z));
}
private long H(long x, long y, long z) {
??? return x ^ y ^ z;
}
private long I(long x, long y, long z) {
??? return y ^ (x | (~z));
}
// FF,GG,HH和II將調(diào)用F,G,H,I進(jìn)行近一步變換
private long FF(long a, long b, long c, long d, long x, long s,long ac) {
??? a += F (b, c, d) + x + ac;
??? a = ((int) a << s) | ((int) a >>> (32 - s));
??? a += b;
??? return a;
}
private long GG(long a, long b, long c, long d, long x, long s,long ac) {
??? a += G (b, c, d) + x + ac;
??? a = ((int) a << s) | ((int) a >>> (32 - s));
??? a += b;
??? return a;
}
private long HH(long a, long b, long c, long d, long x, long s,long ac) {
??? a += H (b, c, d) + x + ac;
??? a = ((int) a << s) | ((int) a >>> (32 - s));
??? a += b;
??? return a;
}
private long II(long a, long b, long c, long d, long x, long s,long ac) {
??? a += I (b, c, d) + x + ac;
??? a = ((int) a << s) | ((int) a >>> (32 - s));
??? a += b;
??? return a;
}
// md5Update是MD5的主計(jì)算過(guò)程,inbuf是要變換的字節(jié)串,inputlen是長(zhǎng)度,這個(gè)
// 函數(shù)由getMD5ofStr調(diào)用,調(diào)用之前需要調(diào)用md5init,因此把它設(shè)計(jì)成private的
??
private void md5Update(byte[] inbuf, int inputLen) {
??? int i, index, partLen;
??? byte[] block = new byte[64];
??? index = (int)(count[0] >>> 3) & 0x3F;
??? // /* Update number of bits */
??? if ((count[0] += (inputLen << 3)) < (inputLen << 3))
???? count[1]++;
??? count[1] += (inputLen >>> 29);
??? partLen = 64 - index;
??? // Transform as many times as possible.
??? if (inputLen >= partLen) {
???? md5Memcpy(buffer, inbuf, index, 0, partLen);
???? md5Transform(buffer);
???? for (i = partLen; i + 63 < inputLen; i += 64) {
????? md5Memcpy(block, inbuf, 0, i, 64);
????? md5Transform (block);
???? }
???? index = 0;
??? } else
???? i = 0;
??? ///* Buffer remaining input */
??? md5Memcpy(buffer, inbuf, index, i, inputLen - i);
}
private void md5Final () {
??? byte[] bits = new byte[8];
??? int index, padLen;
??? ///* Save number of bits */
??? Encode (bits, count, 8);
??? ///* Pad out to 56 mod 64.
??? index = (int)(count[0] >>> 3) & 0x3f;
??? padLen = (index < 56) ? (56 - index) : (120 - index);
??? md5Update (PADDING, padLen);
??? ///* Append length (before padding) */
??? md5Update(bits, 8);
??? ///* Store state in digest */
??? Encode (digest, state, 16);
}
// md5Memcpy是一個(gè)內(nèi)部使用的byte數(shù)組的塊拷貝函數(shù),從input的inpos開始把len長(zhǎng)度的
??? //??? 字節(jié)拷貝到output的outpos位置開始
??
private void md5Memcpy (byte[] output, byte[] input,int outpos, int inpos, int len){
??? int i;
??? for (i = 0; i < len; i++)
???? output[outpos + i] = input[inpos + i];
}
// md5Transform是MD5核心變換程序,有md5Update調(diào)用,block是分塊的原始字節(jié)
??
private void md5Transform (byte block[]) {
??? long a = state[0], b = state[1], c = state[2], d = state[3];
??? long[] x = new long[16];
??? Decode (x, block, 64);
??? /* Round 1 */
??? a = FF (a, b, c, d, x[0], S11, 0xd76aa478L); /* 1 */
??? d = FF (d, a, b, c, x[1], S12, 0xe8c7b756L); /* 2 */
??? c = FF (c, d, a, b, x[2], S13, 0x242070dbL); /* 3 */
??? b = FF (b, c, d, a, x[3], S14, 0xc1bdceeeL); /* 4 */
??? a = FF (a, b, c, d, x[4], S11, 0xf57c0fafL); /* 5 */
??? d = FF (d, a, b, c, x[5], S12, 0x4787c62aL); /* 6 */
??? c = FF (c, d, a, b, x[6], S13, 0xa8304613L); /* 7 */
??? b = FF (b, c, d, a, x[7], S14, 0xfd469501L); /* 8 */
??? a = FF (a, b, c, d, x[8], S11, 0x698098d8L); /* 9 */
??? d = FF (d, a, b, c, x[9], S12, 0x8b44f7afL); /* 10 */
??? c = FF (c, d, a, b, x[10], S13, 0xffff5bb1L); /* 11 */
??? b = FF (b, c, d, a, x[11], S14, 0x895cd7beL); /* 12 */
??? a = FF (a, b, c, d, x[12], S11, 0x6b901122L); /* 13 */
??? d = FF (d, a, b, c, x[13], S12, 0xfd987193L); /* 14 */
??? c = FF (c, d, a, b, x[14], S13, 0xa679438eL); /* 15 */
??? b = FF (b, c, d, a, x[15], S14, 0x49b40821L); /* 16 */
??? /* Round 2 */
??? a = GG (a, b, c, d, x[1], S21, 0xf61e2562L); /* 17 */
??? d = GG (d, a, b, c, x[6], S22, 0xc040b340L); /* 18 */
??? c = GG (c, d, a, b, x[11], S23, 0x265e5a51L); /* 19 */
??? b = GG (b, c, d, a, x[0], S24, 0xe9b6c7aaL); /* 20 */
??? a = GG (a, b, c, d, x[5], S21, 0xd62f105dL); /* 21 */
??? d = GG (d, a, b, c, x[10], S22, 0x2441453L); /* 22 */
??? c = GG (c, d, a, b, x[15], S23, 0xd8a1e681L); /* 23 */
??? b = GG (b, c, d, a, x[4], S24, 0xe7d3fbc8L); /* 24 */
??? a = GG (a, b, c, d, x[9], S21, 0x21e1cde6L); /* 25 */
??? d = GG (d, a, b, c, x[14], S22, 0xc33707d6L); /* 26 */
??? c = GG (c, d, a, b, x[3], S23, 0xf4d50d87L); /* 27 */
??? b = GG (b, c, d, a, x[8], S24, 0x455a14edL); /* 28 */
??? a = GG (a, b, c, d, x[13], S21, 0xa9e3e905L); /* 29 */
??? d = GG (d, a, b, c, x[2], S22, 0xfcefa3f8L); /* 30 */
??? c = GG (c, d, a, b, x[7], S23, 0x676f02d9L); /* 31 */
??? b = GG (b, c, d, a, x[12], S24, 0x8d2a4c8aL); /* 32 */
??? /* Round 3 */
??? a = HH (a, b, c, d, x[5], S31, 0xfffa3942L); /* 33 */
??? d = HH (d, a, b, c, x[8], S32, 0x8771f681L); /* 34 */
??? c = HH (c, d, a, b, x[11], S33, 0x6d9d6122L); /* 35 */
??? b = HH (b, c, d, a, x[14], S34, 0xfde5380cL); /* 36 */
??? a = HH (a, b, c, d, x[1], S31, 0xa4beea44L); /* 37 */
??? d = HH (d, a, b, c, x[4], S32, 0x4bdecfa9L); /* 38 */
??? c = HH (c, d, a, b, x[7], S33, 0xf6bb4b60L); /* 39 */
??? b = HH (b, c, d, a, x[10], S34, 0xbebfbc70L); /* 40 */
??? a = HH (a, b, c, d, x[13], S31, 0x289b7ec6L); /* 41 */
??? d = HH (d, a, b, c, x[0], S32, 0xeaa127faL); /* 42 */
??? c = HH (c, d, a, b, x[3], S33, 0xd4ef3085L); /* 43 */
??? b = HH (b, c, d, a, x[6], S34, 0x4881d05L); /* 44 */
??? a = HH (a, b, c, d, x[9], S31, 0xd9d4d039L); /* 45 */
??? d = HH (d, a, b, c, x[12], S32, 0xe6db99e5L); /* 46 */
??? c = HH (c, d, a, b, x[15], S33, 0x1fa27cf8L); /* 47 */
??? b = HH (b, c, d, a, x[2], S34, 0xc4ac5665L); /* 48 */
??? /* Round 4 */
??? a = II (a, b, c, d, x[0], S41, 0xf4292244L); /* 49 */
??? d = II (d, a, b, c, x[7], S42, 0x432aff97L); /* 50 */
??? c = II (c, d, a, b, x[14], S43, 0xab9423a7L); /* 51 */
??? b = II (b, c, d, a, x[5], S44, 0xfc93a039L); /* 52 */
??? a = II (a, b, c, d, x[12], S41, 0x655b59c3L); /* 53 */
??? d = II (d, a, b, c, x[3], S42, 0x8f0ccc92L); /* 54 */
??? c = II (c, d, a, b, x[10], S43, 0xffeff47dL); /* 55 */
??? b = II (b, c, d, a, x[1], S44, 0x85845dd1L); /* 56 */
??? a = II (a, b, c, d, x[8], S41, 0x6fa87e4fL); /* 57 */
??? d = II (d, a, b, c, x[15], S42, 0xfe2ce6e0L); /* 58 */
??? c = II (c, d, a, b, x[6], S43, 0xa3014314L); /* 59 */
??? b = II (b, c, d, a, x[13], S44, 0x4e0811a1L); /* 60 */
??? a = II (a, b, c, d, x[4], S41, 0xf7537e82L); /* 61 */
??? d = II (d, a, b, c, x[11], S42, 0xbd3af235L); /* 62 */
??? c = II (c, d, a, b, x[2], S43, 0x2ad7d2bbL); /* 63 */
??? b = II (b, c, d, a, x[9], S44, 0xeb86d391L); /* 64 */
??? state[0] += a;
??? state[1] += b;
??? state[2] += c;
??? state[3] += d;
}
// Encode把long數(shù)組按順序拆成byte數(shù)組,因?yàn)閖ava的long類型是64bit的,
// 只拆低32bit,以適應(yīng)原始C實(shí)現(xiàn)的用途
??
private void Encode (byte[] output, long[] input, int len)
{
??? int i, j;
??? for (i = 0, j = 0; j < len; i++, j += 4) {
???? output[j] = (byte)(input[i] & 0xffL);
???? output[j + 1] = (byte)((input[i] >>> 8) & 0xffL);
???? output[j + 2] = (byte)((input[i] >>> 16) & 0xffL);
???? output[j + 3] = (byte)((input[i] >>> 24) & 0xffL);
??? }
}
// Decode把byte數(shù)組按順序合成成long數(shù)組,因?yàn)閖ava的long類型是64bit的,
??? //??? 只合成低32bit,高32bit清零,以適應(yīng)原始C實(shí)現(xiàn)的用途
??
private void Decode (long[] output, byte[] input, int len)
{
??? int i, j;
??? for (i = 0, j = 0; j < len; i++, j += 4)
???? output[i] = b2iu(input[j]) |
????? (b2iu(input[j + 1]) << 8) |
????? (b2iu(input[j + 2]) << 16) |
????? (b2iu(input[j + 3]) << 24);
???? return;
}
// b2iu是一個(gè)把byte按照不考慮正負(fù)號(hào)的原則的"升位"程序,因?yàn)閖ava沒(méi)有unsigned運(yùn)算
??
public static long b2iu(byte b) {
??? return b < 0 ? b & 0x7F + 128 : b;
}
// byteHEX(),用來(lái)把一個(gè)byte類型的數(shù)轉(zhuǎn)換成十六進(jìn)制的ASCII表示,
//???? 因?yàn)閖ava中的byte的toString無(wú)法實(shí)現(xiàn)這一點(diǎn),我們又沒(méi)有C語(yǔ)言中的
//???? sprintf(outbuf,"%02X",ib)
??
??? public static String byteHEX(byte ib)
{
???? char[] Digit = { '0','1','2','3','4','5','6','7','8','9',
????? 'A','B','C','D','E','F' };
???? char [] ob = new char[2];
???? ob[0] = Digit[(ib >>> 4) & 0X0F];
???? ob[1] = Digit[ib & 0X0F];
???? String s = new String(ob);
???? return s;
}
public static String toMD5(String source)
{
??? MD5 md5 = new MD5();
??? return md5.getMD5ofStr(source);
}
public static void main(String[] args)
{
MD5 md5 = new MD5();
System.out.println(md5.toMD5(args[0]));
}
}
先編譯javac MD5.java,后帶字符串參數(shù)運(yùn)行,如:java MD5 abc
//結(jié)果生成 32位的加密字符串,有的實(shí)例中截取的是加密字串的 8--24位,長(zhǎng)度為16位.
???????? Java技術(shù)自問(wèn)世時(shí)光已經(jīng)過(guò)去了9個(gè)年頭。作為一名一直關(guān)注其成長(zhǎng)的記者,曾經(jīng)一段時(shí)間有過(guò)這樣的想法:“Java技術(shù)已經(jīng)成熟,是不是發(fā)展速度該放慢一些了呢”。然而,這種想法錯(cuò)了。近來(lái)Java技術(shù)的進(jìn)化相當(dāng)顯著。Java技術(shù)正在迎來(lái)“又一次革命”的風(fēng)暴。這就是本文的結(jié)論。
“又一次”指的是什么?“革命”指的又是什么?光看結(jié)論的話肯定是一頭霧水。其實(shí),筆者要講的并不是變化這樣一個(gè)事實(shí),而是“促進(jìn)變化的原動(dòng)力”。是什么讓Java技術(shù)發(fā)生變化?讓我們從這一角度出發(fā),先看一下Java的變化歷程。
Java正處于轉(zhuǎn)變期
回顧Java技術(shù)的發(fā)展歷程,人們一定會(huì)感慨:2004年到2005年發(fā)生的變化如此之大,可以說(shuō)“現(xiàn)在”正是Java技術(shù)的轉(zhuǎn)換期。 Java技術(shù)由編程語(yǔ)言(Java語(yǔ)言)、運(yùn)行環(huán)境(JVM:Java虛擬機(jī))、框架(Java API群)組成,目前在每一個(gè)層面上都發(fā)生著巨大的變化。
(1)編程語(yǔ)言的變化
Java語(yǔ)言標(biāo)準(zhǔn)出現(xiàn)明顯變化。在2004年9月發(fā)布的正式版本J2SE5.0(J2SE:Java2 Standard, Standard Edition,Java技術(shù)的核心運(yùn)行環(huán)境)中,對(duì)Java語(yǔ)言標(biāo)準(zhǔn)中的Generics與元數(shù)據(jù)進(jìn)行了大幅擴(kuò)展。出現(xiàn)了被認(rèn)為是“自Java問(wèn)世以來(lái)的最大一次語(yǔ)言標(biāo)準(zhǔn)變化”(美國(guó)Sun Microsystems)。這次語(yǔ)言標(biāo)準(zhǔn)的變化給許多Java API帶來(lái)了影響。許多企業(yè)API的新版本都引入了基于元數(shù)據(jù)的注解(程序中記錄的附加信息),以較短的編碼記述更多的信息。
(2)Java運(yùn)行環(huán)境的變化
在J2SE5.0中,大幅度強(qiáng)化了JVM的管理功能與實(shí)用性,換句話說(shuō)就是具備了Java執(zhí)行OS(操作系統(tǒng))的特征。例如,原來(lái)在J2EE (Java2 Platform, Enterprise Edition,構(gòu)筑企業(yè)系統(tǒng)的Java技術(shù))領(lǐng)域,標(biāo)準(zhǔn)配備有作為管理功能的應(yīng)用軟件管理框架JMX。不僅如此,還配備有JVM自身監(jiān)控功能((JSR 174: Monitoring and Management Specification for the Java Virtual Machine)。在標(biāo)準(zhǔn)功能架構(gòu)中可以實(shí)時(shí)監(jiān)視JVM運(yùn)行時(shí)的狀態(tài),也就是內(nèi)存使用量、線程狀態(tài)等。
J2SE5.0中新追加的功能中包括并行處理實(shí)用程序(JSR 166),其基礎(chǔ)是紐約州立大學(xué)Doug Lea提供的程序庫(kù)。也就是說(shuō),標(biāo)準(zhǔn)規(guī)格中采用了來(lái)自民間的程序庫(kù)。
(3)框架的變化
服務(wù)器端的Java框架也發(fā)生了巨大變化。企業(yè)級(jí)Java技術(shù)--J2EE的“使用方法”說(shuō)明文件“J2EE Blueprint”中,提出了將應(yīng)用軟件分為Web層、EJB層(Enterprise JavaBeans,將包括事務(wù)處理在內(nèi)的業(yè)務(wù)進(jìn)程模塊化的框架)來(lái)構(gòu)筑的思路。這兩種層次都迎來(lái)了架構(gòu)更替時(shí)期。Web層的新框架為JSF (JavaServer Faces,將模塊組合起來(lái)構(gòu)筑Web應(yīng)用程序的框架),EJB層為標(biāo)準(zhǔn)方案中剛剛公布的下一代EJB規(guī)格“EJB3.0”。
值得注意的是,促成框架發(fā)生變化的正是來(lái)自民間的源碼開放軟件。
對(duì)JSF產(chǎn)生影響的是作為源碼開放的Web層框架得到普及的Apache Struts。JSF是對(duì)Struts的思路進(jìn)行改進(jìn)的產(chǎn)物,JSF的Spec Lead(規(guī)格制定領(lǐng)袖)之一Craig R. McClanahan就是Struts的作者。
??????? 對(duì)EJB3.0造成影響的也是民間源碼開放軟件。EJB3.0引入了DI(Dependency Injection,依賴注入)容器類(Container)與POJO(Plain Old Java Object)持久類這些新功能,大大減輕了編程的復(fù)雜性。這些概念因PicoContainer、Spring等源碼開放軟件的導(dǎo)入而引人注目。
其背景在于用戶對(duì)“目前的EJB過(guò)于復(fù)雜”的批評(píng)。原本由EJB反對(duì)派提出的設(shè)計(jì)思想與源碼開放軟件,卻變成了EJB3.0的中心概念,顯出了巨大的影響力。
(4)腳本語(yǔ)言
在Java技術(shù)標(biāo)準(zhǔn)中新增加了編程語(yǔ)言Groovy(JSR 241)。這是一種可與Java語(yǔ)言無(wú)縫連接的腳本語(yǔ)言,有望以極短的程序完成相關(guān)處理。“在Java技術(shù)中添加Java以外的語(yǔ)言”,這聽起來(lái)也許有些別扭,其實(shí)以前就有這樣的呼聲,希望將可以充分利用Java技術(shù)資源的腳本作為語(yǔ)言使用。Groovy本來(lái)是源碼開放軟件,最終得到認(rèn)可,被采納為標(biāo)準(zhǔn)規(guī)格。
由上述可以看出,Java技術(shù)的構(gòu)成要素正在發(fā)生巨大變化。就在不久以前,一提起服務(wù)器Java,“Servlet、JSP、EJB是重要的 API”這樣的說(shuō)明還占主流,但現(xiàn)在基于JSF和EJB3.0的應(yīng)用程序已經(jīng)變成了“面目全非”的程序。而在運(yùn)行短程序或測(cè)試時(shí),甚至還出現(xiàn)了不僅是 Java語(yǔ)言,連腳本語(yǔ)言都開始調(diào)用Java框架的情況。
這些變化從大的方面來(lái)看的話,可以說(shuō)是進(jìn)一步發(fā)揮了Java面向?qū)ο蟮膬?yōu)勢(shì)。當(dāng)然,也包括提高開發(fā)效率、提高運(yùn)行穩(wěn)定性、簡(jiǎn)化運(yùn)行管理等業(yè)務(wù)上的優(yōu)勢(shì)。
開發(fā)者團(tuán)體是真正的“變革推動(dòng)者”
那么,這些變化的原動(dòng)力來(lái)自哪里呢?為什么說(shuō)“目前”正面臨著“又一次變革”呢?理由如下:
在Java技術(shù)的發(fā)展過(guò)程中,1999年到2000年是一個(gè)大的轉(zhuǎn)折點(diǎn)。J2EE概念于1999年出現(xiàn)。日本國(guó)內(nèi)的J2EE也在隨后2~3年內(nèi)得到正式普及,但這一技術(shù)體系早在5年前就已經(jīng)確立。在我們眼前,新一代Java技術(shù)的輪廓正逐漸顯現(xiàn)出來(lái)。
JCP(Java Community Process)2.0于2000年問(wèn)世。以會(huì)員制的組織形式推進(jìn)Java技術(shù)的規(guī)格制訂、總體發(fā)展方向則以委員會(huì)的方式?jīng)Q定。從而形成了不依賴特定企業(yè)的規(guī)格制訂流程。這一組織形式歷經(jīng)近5年的時(shí)間,逐漸發(fā)展成“變革的推動(dòng)者”。
J2EE此前一直飽受批評(píng),認(rèn)為“Web層與EJB層的差距太大”、“EJB過(guò)于復(fù)雜”,但這也是因?yàn)檫@是一項(xiàng)實(shí)際使用的技術(shù)。JCP同樣也遇到很多批評(píng),稱其“沒(méi)有完全公開”、“制定的技術(shù)標(biāo)準(zhǔn)卻不可思議地讓Sun擁有知識(shí)產(chǎn)權(quán)”,但JCP卻作為一個(gè)團(tuán)體不斷發(fā)展壯大。
直接推動(dòng)Java技術(shù)變化的當(dāng)事者為5年前形成的基于團(tuán)體的標(biāo)準(zhǔn)制訂流程--JCP,但真正將討論與技術(shù)納入JCP的卻是包括Java技術(shù)批評(píng)者在內(nèi)的眾多Java開發(fā)者團(tuán)體。他們也是早期開展Java技術(shù)變革的先行者。由此誕生的下一代技術(shù)將會(huì)在2~3年后逐漸波及主流企業(yè)用戶。
Java技術(shù)的“變革推動(dòng)者”為開發(fā)者團(tuán)體。不受制于特定企業(yè),通過(guò)眾多需要Java的開發(fā)者的建議,Java技術(shù)正在不斷發(fā)展進(jìn)步。
import java.security.*;
public class MD5 {
????? /**
????? * 字符串加密方法。傳入一個(gè)字符串,返回經(jīng)過(guò)<b>MD5</b>加密后的一個(gè)字符串
????? *?? @param?? strInput
????? *?? @return
?????? */
????? public??? static?? String encryptMD5(String strInput) {
???????? StringBuffer buf=null;
???????? try {
???????????? MessageDigest md = MessageDigest.getInstance("MD5");
???????????? md.update(strInput.getBytes());
???????????? byte b[] = md.digest();
????????????? buf = new StringBuffer(b.length * 2);
???????????? for(int i=0;i<b.length;i++) {
???????????????? if (((int)b[i] & 0xff) < 0x10) { // & 0xff轉(zhuǎn)換無(wú)符號(hào)整型
???????????????????? buf.append("0");
???????????????? }
??????????????? // buf.append(Long.toString((int) b[i] & 0xff, 16));//轉(zhuǎn)換16進(jìn)制,下方法同
??????????????? buf.append(Long.toHexString((int)b[i] & 0xff));
???????????? }
???????? }catch(NoSuchAlgorithmException ex) {
????????????? ex.printStackTrace();
???????? }
??????? return buf.toString();
???? }
????? public??? static??? void?? main(String args[]) {
???????? String test?? =??? "abc" ;
???????? System.out.println(encryptMD5(test));
???? }
}
/**
* 下面是一些測(cè)試數(shù)據(jù):
*?? MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
*
*?? MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
*
*?? MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
*
*?? MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
*
*?? MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
*/
/* 主要使用的是java.util.Robot類來(lái)捕獲屏幕,
* 可以實(shí)現(xiàn)對(duì)屏幕一個(gè)矩形區(qū)域的捕獲,通過(guò)這個(gè)類,
* 我們也可以實(shí)現(xiàn)一個(gè)遠(yuǎn)程桌面控制的程序
*/
package com.qiu.util;
import java.io.*;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;
public class ScreenCapture {
//test main
public static void main(String[] args) throws Exception{
?? String userdir = System.getProperty("user.dir");
?? File tempFile = new File("d:","temp.png");
?? ScreenCapture capture = ScreenCapture.getInstance();
?? capture.captureImage();??
?? JFrame frame = new JFrame();
?? JPanel panel = new JPanel();
?? panel.setLayout(new BorderLayout());
?? JLabel imagebox = new JLabel();
?? panel.add(BorderLayout.CENTER,imagebox);??
?? imagebox.setIcon(capture.getPickedIcon());
?? capture.saveToFile(tempFile);
?? capture.captureImage();
?? imagebox.setIcon(capture.getPickedIcon());
?? frame.setContentPane(panel);
?? frame.setSize(400,300);
?? frame.show();
?? System.out.println("Over");
}
private ScreenCapture() {
??
?? try{
??? robot = new Robot();
?? }
?? catch(AWTException e) {
??? System.err.println("Internal Error: " + e);
??? e.printStackTrace();
?? }??
?? JPanel cp = (JPanel)dialog.getContentPane();
?? cp.setLayout(new BorderLayout());??
?? labFullScreenImage.addMouseListener(new MouseAdapter() {
???? public void mouseReleased(MouseEvent evn) {
?????? isFirstPoint = true;
?????? pickedImage = fullScreenImage.getSubimage(recX,recY,recW,recH);
?????? dialog.setVisible(false);?????
???? }
??? });
???
?? labFullScreenImage.addMouseMotionListener(new MouseMotionAdapter() {
???? public void mouseDragged(MouseEvent evn) {
????? if(isFirstPoint) {
?????? x1 = evn.getX();
?????? y1 = evn.getY();
?????? isFirstPoint = false;??
????? }
????? else {
?????? x2 = evn.getX();
?????? y2 = evn.getY();
?????? int maxX = Math.max(x1,x2);
?????? int maxY = Math.max(y1,y2);
?????? int minX = Math.min(x1,x2);
?????? int minY = Math.min(y1,y2);
?????? recX = minX;
?????? recY = minY;
?????? recW = maxX-minX;
?????? recH = maxY-minY;
?????? labFullScreenImage.drawRectangle(recX,recY,recW,recH);????
????? }
???? }
????
???? public void mouseMoved(MouseEvent e) {
????? labFullScreenImage.drawCross(e.getX(),e.getY());
???? }
??? });
???
?? cp.add(BorderLayout.CENTER,labFullScreenImage);
?? dialog.setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
?? dialog.setAlwaysOnTop(true);
?? dialog.setMaximumSize(
??? Toolkit.getDefaultToolkit().getScreenSize());
?? dialog.setUndecorated(true);
?? dialog.setSize(dialog.getMaximumSize());
?? dialog.setModal(true);
}
//Singleton Pattern
public static ScreenCapture getInstance() {
?? return defaultCapturer;
}
/**捕捉全屏慕*/
public Icon captureFullScreen() {
?? fullScreenImage = robot.createScreenCapture(new Rectangle(
??? Toolkit.getDefaultToolkit().getScreenSize()));
?? ImageIcon icon = new ImageIcon(fullScreenImage);
?? return icon;
}
/**捕捉屏幕的一個(gè)矯形區(qū)域
?? */
public void captureImage() {
?? fullScreenImage = robot.createScreenCapture(new Rectangle(
??? Toolkit.getDefaultToolkit().getScreenSize()));
?? ImageIcon icon = new ImageIcon(fullScreenImage);
?? labFullScreenImage.setIcon(icon);??
?? dialog.setVisible(true);
}
/**得到捕捉后的BufferedImage*/
public BufferedImage getPickedImage() {
?? return pickedImage;
}
/**得到捕捉后的Icon*/
public ImageIcon getPickedIcon() {
?? return new ImageIcon(getPickedImage());
}
/**儲(chǔ)存為一個(gè)文件,為PNG格式
??*@deprecated
?? *replaced by saveAsPNG(File file)
?? **/
@Deprecated
public void saveToFile(File file) throws IOException{
?? ImageIO.write(getPickedImage(),defaultImageFormater,file);
}
/**儲(chǔ)存為一個(gè)文件,為PNG格式*/
public void saveAsPNG(File file) throws IOException {
?? ImageIO.write(getPickedImage(),"png",file);
}
/**儲(chǔ)存為一個(gè)JPEG格式圖像文件*/
public void saveAsJPEG(File file) throws IOException {
?? ImageIO.write(getPickedImage(),"JPEG",file);
}
/**寫入一個(gè)OutputStream*/
public void write(OutputStream out) throws IOException{
?? ImageIO.write(getPickedImage(),defaultImageFormater,out);
}
//singleton design pattern
private static ScreenCapture defaultCapturer = new ScreenCapture();
private int x1,y1,x2,y2;
private int recX,recY,recH,recW; //截取的圖像
private boolean isFirstPoint?? = true;
private BackgroundImage labFullScreenImage = new BackgroundImage();
private Robot robot;
private BufferedImage fullScreenImage;
private BufferedImage pickedImage;
private String defaultImageFormater = "png";
private JDialog dialog = new JDialog();
}
/**顯示圖片的Label*/
class BackgroundImage extends JLabel{
public void paintComponent(Graphics g) {
?? super.paintComponent(g);
?? g.drawRect(x,y,w,h);
?? String area = Integer.toString(w)+" * "+ Integer.toString(h);
?? g.drawString(area,x+(int)w/2-15,y+(int)h/2);
?? g.drawLine(lineX,0,lineX,getHeight());
?? g.drawLine(0,lineY,getWidth(),lineY);
}
public void drawRectangle(int x,int y,int width,int height) {
?? this.x = x;
?? this.y = y;
?? h = height;
?? w = width;
?? repaint();
}
public void drawCross(int x,int y) {
?? lineX = x;
?? lineY = y;
?? repaint();
}
int lineX,lineY;
int x,y,h,w;
}
import java.io.*;
public class FileReadTest
{
public static void main(String[] args)
{
?? FileReadTest t = new FileReadTest();
?? t.readMyFile();
}
void readMyFile()
{
?? String temp = null;
?? int count = 0;
?? try
?? {
??? FileReader fr = new FileReader("mydata.txt");
??? BufferedReader br = new BufferedReader(fr);
??? temp = new String();
??? while((temp = br.readLine()) != null)
??? {
???? count++;
???? System.out.println(count + ":" + temp);
??? }
??? br.close();
??? fr.close();
?? }
?? catch(IOException e)
?? {
??? System.out.println("OH,got an IOException error!");
??? e.printStackTrace();
?? }
}
}
import java.io.*;
public class FileInputDemo
{
public static void main(String[] args)
{
?? try
?? {
??? FileInputStream f = new FileInputStream("mydata.txt");
??? DataInputStream in = new DataInputStream(f);
??? //BufferedReader br = new BufferedReader(new InputStreamReader(f));
??? while(in.available() != 0)
???? System.out.println(in.readLine());
???? /**
????? * DataInputStream.readLine()已經(jīng)過(guò)時(shí)
????? * 使用 DataInputStream 類讀取文本行的程序可以改為使用BufferedReader類
????? * 改用BufferedReader.readLine()方法
????? * 只要將以下形式的代碼:DataInputStream d = new DataInputStream(in);
????? * 替換為:BufferedReader d = new BufferedReader(new InputStreamReader(in));
????? */
??? in.close();
?? }
?? catch(Exception e)
?? {
??? System.err.println("File input error!");
?? }
}
}
import java.io.*;
public class FileWriterTest
{
public static void main(String[] args)
{
?? FileWriterTest t = new FileWriterTest();
?? t.WriteMyFile();
}
void WriteMyFile()
{
?? try
?? {
??? FileWriter fw = new FileWriter("mydata.txt");
??? PrintWriter out =new PrintWriter(fw);
??? out.print("Hello,World!");
??? out.close();
??? fw.close();
?? }
?? catch(IOException e)
?? {
??? System.out.println("OH,got an IOException error!");
??? e.printStackTrace();
?? }
}
}
1
//用FileOutputStream將內(nèi)容寫入文本文件
import java.io.*;
public class FileOutputDemo
{
public static void main(String[] args)
{
?? FileOutputStream out;
?? PrintStream p;
?? try
?? {
??? out = new FileOutputStream("myfile.txt");
??? p = new PrintStream(out);
??? p.println("Hello,World!");
??? p.close();
?? }
?? catch(Exception e)
?? {
??? System.err.println("Error writing to file!");
?? }
}
}
2
import java.io.*;
class FSODemo
{
?? public static void main(String args[]) throws Exception
?? {
???? String source="Beijing is the capital of China\n"
???? +"and it is a very beautiful city.\n"
???? +"Welcome to Beijing!";
???? byte buf[] = source.getBytes();
???? FileOutputStream f=new FileOutputStream("file.txt");
???? f.write(buf);
???? f.close();
???? System.out.println("文本已經(jīng)成功寫入文件!");
?? }
}