posts - 495,  comments - 11,  trackbacks - 0
           
            1:清除sam文件:

            WinNT系列的系統賬戶信息是存在%systemroot%\system32\config\sam這個注冊表文件里的。 如果系統里沒有重要的賬戶,或者賬戶比較少,用刪除%systemroot%\system32\config\sam的方法是比較簡單的,不過因為系統會還原為只有administrator(密碼為空)和guest二個賬戶,所以有些程序因為它們所依賴的賬戶丟失了,如iis、vmware就不能啟動了。

             原來聽說這種方法只能適用于nt workstation系列(2kpro),不能用于server,我在2000professional和2000 advanced server上試驗都是成功的。不知道為什么會有上述說法,可能是活動目錄ad下不行吧。

             當然首先你要能夠訪問系統分區,來把sam文件改名或者刪除。如果是fat32、fat分區,使用98啟動盤就行了。如果是ntfs分區,可以使用winternal的ntfs for dos、ntfs for 98或者是支持ntfs的啟動光盤,再或者掛到其他win2000、linux等機器上,再再或者重新安裝一個新的win2000。   

            2:專用工具:

            windows管理員密碼丟失還有一個解決方法是使用Petter Nordahl-Hagen的The Offline NT Password Editor(http://home.eunet.no/~pnordahl/ntpasswd/),這個工具是離線修改注冊表文件sam來設置密碼的。需要用他的映像文件制作啟動盤來引導,進而訪問ntfs分區重新設置密碼;雖然作者經常更新他的程序,不過我還是會擔心他直接操作sam文件的安全性,可能有時會導致系統出錯。可能還有其他類似工具吧,恕我無知。

            3:還有一種想法就是用一個修改密碼的小程序來替換系統啟動的必要程序,然后系統啟動時就會替換密碼,隨后把被替換的程序在還原就行了。當然首先你還是要能夠訪問系統分區,來替換隨系統啟動的程序。   

            替換系統啟動的必要程序的一種方法是我寫的一個清除administrator密碼的小程序(CleanPwd:http://www.BingleSite.net/myprog/CleanPwd/CleanPwd.rar),他所作的就是把administrator密碼清空。使用方法如下:

            1):用雙系統或者啟動盤或者掛到別的系統上,如果是NTFS分區其他系統或啟動盤要能讀寫NTFS分區,把windows安裝目錄下的system32\svchost.exe改名svchost.bak.exe備份,把CleanPwd.exe拷貝成svchost.exe。   

            2):啟動該系統,就把administrator的密碼清空了,可以直接登陸。   

            3):把svchost.bak.exe 恢復就行了(如果使用替換的是svchost,最好再啟動rpc服務)。為什么選用svchost.exe而不是其他程序,因為每個windows2000系統都有這幾個進程,System(kernel Executive and kernel)、smss(session manager)、csrss(win32 subsystem)、winlogon(logon process)、services(Service control manager)、lsass(local security authentication server ) 如果任何一個被殺掉或者出錯,系統將重新啟動。不過在lsass啟動之前你不能修改密碼,所以不能選用這幾個程序。

            另外系統中一般還有以下一些程序:svchost.exe(Remote Procedure Call (RPC) 還有其他一些服務)、WBEM\WinMgmt.exe(Windows Management Instrumentation)、mstask.exe(Task Scheduler)、regsvc.exe(Remote Registry Service) 可能還有其他服務程序,你可能禁止了除RPC之外的其他服務,但不會禁止rpc,否則系統工作就不正常了。所以我選擇了svchost,如果你知道其他服務會自動啟動,你也可以選擇它。當然如果系統安裝了殺毒軟件的話,你替換殺毒軟件也可以,因為一般殺毒軟件都會在系統啟動是啟動殺毒防火墻來殺毒的。
          posted @ 2007-05-28 11:56 jadmin 閱讀(78) | 評論 (0)編輯 收藏

          ??????? 2007 年將是載入史冊的一年,Sun Microsystems 公司將于這一年在開源許可協議下發布 Java 開發包(JDK),從而放棄了對 Java? 平臺的統馭,將權力交給了 Java 開發人員社區!在本文中,Java 開發人員 Elliotte Rusty Harold 從各個方面預測了 Java 平臺的新方向,從腳本到 bug 修復到新語法。

            2006 年又是 Java 平臺繁榮的一年。盡管遭遇了來自 Microsoft(C#)和腳本語言社區(Ruby)的沖擊,但 Java 語言仍然保持著其世界頭號編程語言的地位。同時,盡管 Java 6 的發布很值得慶祝,但比起宣布 Java 將在 GNU General Public License 下完全開源這一事件來說,卻不免有些黯然失色。Java 在 2007 年還能保持這種勢頭嗎?讓我們來看一下成敗的可能。

            Java 平臺將成為開源平臺

            2007 年上半年,Sun 將在一個開源許可協議下發布 Java 開發包(JDK)。解除 JDK 的禁錮對于 Java 開發人員社區來說是巨大的一步,它將在今后的十年中推動 Java 平臺的發展。

            JDK 的質量將會顯著改善,因為程序員們不再僅僅報告 bug 并開始修復。Java Developer Connection 的 bug 報告將會包括對 JDK 中的問題部分的詳細分析,并提供修復的補丁。正如Linus 法則 所陳述的那樣,“只要給予足夠的關注,任何 bug 都是顯而易見”,即調試是可并行進行的。優化也是一樣。開源使兩者得以 并行。

            分支項目

            遺憾的是,設計并不是和調試、優化一樣可以并行完成的。清潔的 API 有時也需要有一只獨裁的手。但獨裁者的缺點是:有時他們知道在做什么,有時卻不知道。意圖成為獨裁者的各方面之間的競爭往往是發現問題最佳解決方案的惟一方式。

            很少有公司能夠負擔得起這樣的代價,為一個產品開發多個獨立的實現,以便在多個產品中選定保留一個而摒棄其余的產品,但開源社區卻在朝這個方向努力。所以,您會在 Java 平臺的各個層次中發現分支產品:語言、虛擬機和庫。大多數的分支產品會失敗,但這沒什么。好主意會脫穎而出。一些分支產品會一直存在下去,一些會重新并入標準 JDK 中。明年的這個時候,分支產品與主流產品之間的差異也許不會很明顯,但這個過程會繼續下去。

            Sun 會在幾個月后發布 Java 7,Dolphin 的一個早期的 beta 版,以此作為開端。Sun 無法發布更早的 JDK 版本,因為存在一些只有在 Dolphin 中才能解決的構建問題和許可協議問題。盡管如此,仍有望看到第三方著手進一步細分 Sun 的版本,來提供 Java 6、Java 5、Java 1.4,甚至更早版本的流行開源實現。

            早期的一些探尋分支產品的人們可能會侵犯 Sun 公司的商標,收到 Sun 的律師寄來的討厭的律師信。我們需要一個通用的未注冊為商標的名字,讓所有人都能使用。我建議用 “J” —— 我希望沒人用單字母作商標。

            開源項目從未消亡,只是有些褪色。就像之前的 Blackdown Project、GNU Classpath、Kaffe 和其他開源 JDK 項目一樣,他們的開發人員都轉向其他事情了。如果一個項目至今還沒有達到 1.0,那么恐怕以后永遠也達不到了。

            期待 Java 7

            Dolphin 不會在 2007 年發布。2008 年是更為現實的目標。那就是說,工作尚在進行中,它的一些功能也許會作為早期的標準擴展或至少作為 beta 登場。

            遺憾的是,為一門語言添加功能遠比刪除功能要簡單得多。幾乎不可避免地,隨著時間的推移,語言不是朝著簡單的方向發展,而是越來越復雜,越來越讓人困惑。即使是那些單獨看起來很好的功能,在彼此疊加后也會出現問題。

            令人遺憾,Java 社區沒有接受這個教訓,盡管這種失敗并無特殊性。但總有一些太酷又太讓人激動的新語法令語言設計者難以抗拒 —— 即便這樣的新語法不能解決任何實際問題。于是對 Java 7 的新語言功能就有了巨大的要求,包括閉包、多繼承和操作符重載。

            我猜想在這一年結束前,會在 Java 7 beta 中看到閉包,也許還能看到操作符重載(有五成的把握),但不會出現多繼承。Java 中有太多東西是基于單個根的繼承層次。沒有可行的方式改進多繼承,使之適應這門語言。

            目前有許多語法糖方面的提議,有一些有意義,有一些沒有。許多提議都專注于將像 getFoo() 這樣的方法替換為像 -> 這樣的操作符。

          posted @ 2007-05-28 01:51 jadmin 閱讀(44) | 評論 (0)編輯 收藏

          import java.lang.reflect.*;

          /*************************************************
          md5 類實現了RSA Data Security, Inc.在提交給IETF
          的RFC1321中的MD5 message-digest 算法。
          *************************************************/

          public class MD5
          {
          // 下面這些S11-S44實際上是一個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 };

          // 下面的三個成員是MD5計算過程中用到的3個核心數據,在原始的C實現中
          // 被定義到MD5_CTX結構中

          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的唯一一個公共成員,是最新一次計算結果的
          //??? 16進制ASCII表示.

          public String digestHexStr;

          // digest,是最新一次計算結果的2進制內部表示,表示128bit的MD5值.

          private byte[] digest = new byte[16];

          // getMD5ofStr是類MD5最主要的公共方法,入口參數是你想要進行MD5變換的字符串
          //??? 返回的是變換完的結果,這個結果是從公共成員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這個類的標準構造函數,JavaBean要求有一個public的并且沒有參數的構造函數
          public MD5()
          {
          ??? md5Init();
          ??? return;
          }

          // md5Init是一個初始化函數,初始化核心變量,裝入標準的幻數

          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個基本的MD5函數,在原始的MD5的C實現中,由于它們是
          //??? 簡單的位運算,可能出于效率的考慮把它們實現成了宏,在java中,我們把它們
          // 實現成了private方法,名字保持了原來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將調用F,G,H,I進行近一步變換

          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的主計算過程,inbuf是要變換的字節串,inputlen是長度,這個
          // 函數由getMD5ofStr調用,調用之前需要調用md5init,因此把它設計成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是一個內部使用的byte數組的塊拷貝函數,從input的inpos開始把len長度的
          ??? //??? 字節拷貝到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調用,block是分塊的原始字節
          ??
          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數組按順序拆成byte數組,因為java的long類型是64bit的,
          // 只拆低32bit,以適應原始C實現的用途
          ??
          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數組按順序合成成long數組,因為java的long類型是64bit的,
          ??? //??? 只合成低32bit,高32bit清零,以適應原始C實現的用途
          ??
          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是一個把byte按照不考慮正負號的原則的"升位"程序,因為java沒有unsigned運算
          ??
          public static long b2iu(byte b) {
          ??? return b < 0 ? b & 0x7F + 128 : b;
          }

          // byteHEX(),用來把一個byte類型的數轉換成十六進制的ASCII表示,
          //???? 因為java中的byte的toString無法實現這一點,我們又沒有C語言中的
          //???? 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,后帶字符串參數運行,如:java MD5 abc

          //結果生成 32位的加密字符串,有的實例中截取的是加密字串的 8--24位,長度為16位.

          posted @ 2007-05-28 01:41 jadmin 閱讀(65) | 評論 (0)編輯 收藏
          ???????? Java技術自問世時光已經過去了9個年頭。作為一名一直關注其成長的記者,曾經一段時間有過這樣的想法:“Java技術已經成熟,是不是發展速度該放慢一些了呢”。然而,這種想法錯了。近來Java技術的進化相當顯著。Java技術正在迎來“又一次革命”的風暴。這就是本文的結論。

            “又一次”指的是什么?“革命”指的又是什么?光看結論的話肯定是一頭霧水。其實,筆者要講的并不是變化這樣一個事實,而是“促進變化的原動力”。是什么讓Java技術發生變化?讓我們從這一角度出發,先看一下Java的變化歷程。

            Java正處于轉變期

            回顧Java技術的發展歷程,人們一定會感慨:2004年到2005年發生的變化如此之大,可以說“現在”正是Java技術的轉換期。 Java技術由編程語言(Java語言)、運行環境(JVM:Java虛擬機)、框架(Java API群)組成,目前在每一個層面上都發生著巨大的變化。

            (1)編程語言的變化

            Java語言標準出現明顯變化。在2004年9月發布的正式版本J2SE5.0(J2SE:Java2 Standard, Standard Edition,Java技術的核心運行環境)中,對Java語言標準中的Generics與元數據進行了大幅擴展。出現了被認為是“自Java問世以來的最大一次語言標準變化”(美國Sun Microsystems)。這次語言標準的變化給許多Java API帶來了影響。許多企業API的新版本都引入了基于元數據的注解(程序中記錄的附加信息),以較短的編碼記述更多的信息。

            (2)Java運行環境的變化

            在J2SE5.0中,大幅度強化了JVM的管理功能與實用性,換句話說就是具備了Java執行OS(操作系統)的特征。例如,原來在J2EE (Java2 Platform, Enterprise Edition,構筑企業系統的Java技術)領域,標準配備有作為管理功能的應用軟件管理框架JMX。不僅如此,還配備有JVM自身監控功能((JSR 174: Monitoring and Management Specification for the Java Virtual Machine)。在標準功能架構中可以實時監視JVM運行時的狀態,也就是內存使用量、線程狀態等。

            J2SE5.0中新追加的功能中包括并行處理實用程序(JSR 166),其基礎是紐約州立大學Doug Lea提供的程序庫。也就是說,標準規格中采用了來自民間的程序庫。

            (3)框架的變化

            服務器端的Java框架也發生了巨大變化。企業級Java技術--J2EE的“使用方法”說明文件“J2EE Blueprint”中,提出了將應用軟件分為Web層、EJB層(Enterprise JavaBeans,將包括事務處理在內的業務進程模塊化的框架)來構筑的思路。這兩種層次都迎來了架構更替時期。Web層的新框架為JSF (JavaServer Faces,將模塊組合起來構筑Web應用程序的框架),EJB層為標準方案中剛剛公布的下一代EJB規格“EJB3.0”。

            值得注意的是,促成框架發生變化的正是來自民間的源碼開放軟件。

            對JSF產生影響的是作為源碼開放的Web層框架得到普及的Apache Struts。JSF是對Struts的思路進行改進的產物,JSF的Spec Lead(規格制定領袖)之一Craig R. McClanahan就是Struts的作者。

          ??????? 對EJB3.0造成影響的也是民間源碼開放軟件。EJB3.0引入了DI(Dependency Injection,依賴注入)容器類(Container)與POJO(Plain Old Java Object)持久類這些新功能,大大減輕了編程的復雜性。這些概念因PicoContainer、Spring等源碼開放軟件的導入而引人注目。

            其背景在于用戶對“目前的EJB過于復雜”的批評。原本由EJB反對派提出的設計思想與源碼開放軟件,卻變成了EJB3.0的中心概念,顯出了巨大的影響力。

            (4)腳本語言

            在Java技術標準中新增加了編程語言Groovy(JSR 241)。這是一種可與Java語言無縫連接的腳本語言,有望以極短的程序完成相關處理。“在Java技術中添加Java以外的語言”,這聽起來也許有些別扭,其實以前就有這樣的呼聲,希望將可以充分利用Java技術資源的腳本作為語言使用。Groovy本來是源碼開放軟件,最終得到認可,被采納為標準規格。

            由上述可以看出,Java技術的構成要素正在發生巨大變化。就在不久以前,一提起服務器Java,“Servlet、JSP、EJB是重要的 API”這樣的說明還占主流,但現在基于JSF和EJB3.0的應用程序已經變成了“面目全非”的程序。而在運行短程序或測試時,甚至還出現了不僅是 Java語言,連腳本語言都開始調用Java框架的情況。

            這些變化從大的方面來看的話,可以說是進一步發揮了Java面向對象的優勢。當然,也包括提高開發效率、提高運行穩定性、簡化運行管理等業務上的優勢。

            開發者團體是真正的“變革推動者”

            那么,這些變化的原動力來自哪里呢?為什么說“目前”正面臨著“又一次變革”呢?理由如下:

            在Java技術的發展過程中,1999年到2000年是一個大的轉折點。J2EE概念于1999年出現。日本國內的J2EE也在隨后2~3年內得到正式普及,但這一技術體系早在5年前就已經確立。在我們眼前,新一代Java技術的輪廓正逐漸顯現出來。

            JCP(Java Community Process)2.0于2000年問世。以會員制的組織形式推進Java技術的規格制訂、總體發展方向則以委員會的方式決定。從而形成了不依賴特定企業的規格制訂流程。這一組織形式歷經近5年的時間,逐漸發展成“變革的推動者”。

            J2EE此前一直飽受批評,認為“Web層與EJB層的差距太大”、“EJB過于復雜”,但這也是因為這是一項實際使用的技術。JCP同樣也遇到很多批評,稱其“沒有完全公開”、“制定的技術標準卻不可思議地讓Sun擁有知識產權”,但JCP卻作為一個團體不斷發展壯大。

            直接推動Java技術變化的當事者為5年前形成的基于團體的標準制訂流程--JCP,但真正將討論與技術納入JCP的卻是包括Java技術批評者在內的眾多Java開發者團體。他們也是早期開展Java技術變革的先行者。由此誕生的下一代技術將會在2~3年后逐漸波及主流企業用戶。

            Java技術的“變革推動者”為開發者團體。不受制于特定企業,通過眾多需要Java的開發者的建議,Java技術正在不斷發展進步。
          posted @ 2007-05-28 01:30 jadmin 閱讀(45) | 評論 (0)編輯 收藏

          import java.security.*;

          public class MD5 {

          ????? /**
          ????? * 字符串加密方法。傳入一個字符串,返回經過<b>MD5</b>加密后的一個字符串
          ????? *?? @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轉換無符號整型
          ???????????????????? buf.append("0");
          ???????????????? }
          ??????????????? // buf.append(Long.toString((int) b[i] & 0xff, 16));//轉換16進制,下方法同
          ??????????????? 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));
          ???? }
          }

          /**
          * 下面是一些測試數據:
          *?? MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
          *
          *?? MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
          *
          *?? MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
          *
          *?? MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
          *
          *?? MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
          */

          posted @ 2007-05-28 01:24 jadmin 閱讀(50) | 評論 (0)編輯 收藏

          /* 主要使用的是java.util.Robot類來捕獲屏幕,
          * 可以實現對屏幕一個矩形區域的捕獲,通過這個類,
          * 我們也可以實現一個遠程桌面控制的程序
          */

          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;
          }
          /**捕捉屏幕的一個矯形區域
          ?? */
          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());
          }
          /**儲存為一個文件,為PNG格式
          ??*@deprecated
          ?? *replaced by saveAsPNG(File file)
          ?? **/
          @Deprecated
          public void saveToFile(File file) throws IOException{
          ?? ImageIO.write(getPickedImage(),defaultImageFormater,file);
          }
          /**儲存為一個文件,為PNG格式*/
          public void saveAsPNG(File file) throws IOException {
          ?? ImageIO.write(getPickedImage(),"png",file);
          }
          /**儲存為一個JPEG格式圖像文件*/
          public void saveAsJPEG(File file) throws IOException {
          ?? ImageIO.write(getPickedImage(),"JPEG",file);
          }

          /**寫入一個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;
          }

          posted @ 2007-05-28 00:54 jadmin 閱讀(59) | 評論 (0)編輯 收藏

          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();
          ?? }
          }
          }

          posted @ 2007-05-28 00:32 jadmin 閱讀(52) | 評論 (0)編輯 收藏

          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()已經過時
          ????? * 使用 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!");
          ?? }
          }
          }

          posted @ 2007-05-28 00:29 jadmin 閱讀(91) | 評論 (0)編輯 收藏


          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();
          ?? }
          }
          }

          posted @ 2007-05-28 00:28 jadmin 閱讀(53) | 評論 (0)編輯 收藏

          1


          //用FileOutputStream將內容寫入文本文件

          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("文本已經成功寫入文件!");
          ?? }
          }

          posted @ 2007-05-28 00:27 jadmin 閱讀(359) | 評論 (0)編輯 收藏
          僅列出標題
          共50頁: First 上一頁 39 40 41 42 43 44 45 46 47 下一頁 Last 
          主站蜘蛛池模板: 偃师市| 灯塔市| 永嘉县| 剑阁县| 济南市| 报价| 宁乡县| 南岸区| 龙州县| 林芝县| 红河县| 巴中市| 泸定县| 栾川县| 新丰县| 淮滨县| 东安县| 句容市| 阳原县| 天等县| 寿宁县| 玛沁县| 大邑县| 芦溪县| 七台河市| 临高县| 文化| 大厂| 分宜县| 白玉县| 和静县| 绥化市| 阳春市| 平塘县| 互助| 石柱| 彭阳县| 安西县| 河东区| 达日县| 丁青县|