??????? 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() 這樣的方法替換為像 -> 這樣的操作符。
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位.
???????? Java技術自問世時光已經過去了9個年頭。作為一名一直關注其成長的記者,曾經一段時間有過這樣的想法:“Java技術已經成熟,是不是發展速度該放慢一些了呢”。然而,這種想法錯了。近來Java技術的進化相當顯著。Java技術正在迎來“又一次革命”的風暴。這就是本文的結論。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
*/
/* 主要使用的是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;
}
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()已經過時
????? * 使用 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將內容寫入文本文件
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("文本已經成功寫入文件!");
?? }
}