System類是一個系統(tǒng)類,,是一個陪伴我們時間最長的一個類,例如 System.out.println();就是類中提供的操作,。 1.取得計算時間 使用此類可以取得計算的時間,。例如:想知道一個程序執(zhí)行時一共花了多少時間。 .得到當前的時間: Public static long currentTimeMills(); 看下面代碼: package org.lxh.systemdemo; public class SystemDemo01 { public static void main(String[] args) { long begin = System.currentTimeMillis(); // 取得當前時間 String str = ""; for (int i = 0; i < 10000; i++) { str += i; // 會產(chǎn)生大量的垃圾 } long end = System.currentTimeMillis(); // 取得當前時間 System.out.println(end - begin);// 取得計算的時間 } } 2.System與垃圾收集 在System類中存在一個gc()方法,。public static void gc(); 調(diào)用此方法實際上就是調(diào)用了Runtime類中的gc()方法,。 如果一個對象不用的話,則就有可能進行垃圾回集,。但是如果一個對象在被收集前需要做一些收尾工作,。 在Object類中存在一個方法,此方法在對象被回收前調(diào)用:protected void finalize() throws Throwable.看下面代碼: package org.lxh.systemdemo; class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String toString() { return "姓名:" + this.name + ",,年齡:" + this.age; } public void finalize() throws Throwable { System.out.println("我被回收了,,我完蛋了。,。,。(" + this + ")"); } } public class SystemDemo02 { public static void main(String[] args) { Person per = new Person("張三", 99); per = null; // 取消引用 System.gc();// 強制進行垃圾收集 } } 從一般的開發(fā)角度上看,很少說有專門的開發(fā)在對象回收前進行操作的,,所以,,此操作理解即可。 面試題:請說出final,finally,finalize的區(qū)別,? System對IO的支持: System類中存在三個常量:
為OutputStream類實例化,。如下代碼: package org.lxh.sytemiodemo; import java.io.OutputStream; public class SysteOutDemo { public static void main(String[] args) throws Exception { OutputStream out = System.out; // 此時具備了向屏幕輸出的能力 out.write("hello world".getBytes());// 輸出內(nèi)容 out.close(); } } 2.System.err:表示的是錯誤輸出,??聪旅娲a: package org.lxh.sytemiodemo;public class SystemErrDemo { public static void main(String[] args) { try { Integer.parseInt("hello"); } catch (Exception e) { System.out.println(e); System.err.println(e); } } } 從代碼本身觀察不出任何本質(zhì)問題,,只有在eclipse下才會出現(xiàn)紅色的字。實際上對于以上兩個常量想?yún)^(qū)分區(qū)別,, 只能從概念上講: System.out:一般的信息是愿意展示給用戶看見的 System.err:一般的信息是不愿意展示給用戶看見的 3.System.in實際上表示的就是一個鍵盤的輸入,,使用此操作可以完成鍵盤輸入數(shù)據(jù)的功能??聪旅娲a: package org.lxh.sytemiodemo; import java.io.InputStream; public class SystemInDemo01 { public static void main(String[] args) throws Exception { InputStream input = System.in; // 準備鍵盤輸入數(shù)據(jù) byte b[] = new byte[20]; // 開辟空間接收內(nèi)容 System.out.print("請輸入內(nèi)容:"); int len = input.read(b); // 接收內(nèi)容 System.out.println("輸入的內(nèi)容是:" + new String(b, 0, len)); } } 此時,,已經(jīng)實現(xiàn)了鍵盤輸入功能。但此程序在使用時會存在長度限制,。而且輸入中文時,,也會存在問題,,那么, 此時就可以通過另一種方法,,不指定大小,邊讀邊判斷是否結(jié)束,。請看下面代碼: package org.lxh.sytemiodemo; import java.io.InputStream; public class SystemInDemo03 { public static void main(String[] args) throws Exception { InputStream input = System.in; // 準備鍵盤輸入數(shù)據(jù) System.out.print("請輸入內(nèi)容:"); int temp = 0; // 接收內(nèi)容 StringBuffer buf = new StringBuffer(); while ((temp = input.read()) != -1) { char c = (char) temp; // 轉(zhuǎn)型 if (c == '\n') {// 判斷是否是回車 break;// 退出循環(huán) } buf.append(c); } System.out.println("輸入的內(nèi)容是:" + buf); } } 此時,,數(shù)據(jù)讀取的時候沒有長度限制了。但是在輸入中文時,,就無法正確地讀取,,因為每次讀的是一個字節(jié)。 應該按照整體讀取,,那么要想完成更好的讀取操作,,則只能使用后續(xù)的BufferReader類來完成。 BufferReader類: 該類表示的是緩沖區(qū)讀取,,可以一次性的將內(nèi)容全部讀取出來,。 BufferReader類的構(gòu)造方法:BufferedReader(Reader in); 那么,如果想要使用BufferReader類接收鍵盤的輸入內(nèi)容的話,,則此時就無法直接實例化了,, System.in屬于InputStream類型的。 在java中,,提供了兩個專門的類,。字節(jié)到字符流的轉(zhuǎn)換: InputStreamReader:表示將字節(jié)的輸入流轉(zhuǎn)換成字符流 OutputStreamWriter:表示將字符的輸出流轉(zhuǎn)換成字節(jié)的輸出流 直接使用以上的類,就可以完成轉(zhuǎn)換功能,。使用public String readLine() throws IOException方法可以讀取數(shù)據(jù),。該方法表示 一次性讀取一行數(shù)據(jù),而且一定要記住的是,,如果返回的類容是String是最好操作的,。 例如: package org.lxh.bufferdemo; import java.io.BufferedReader; import java.io.InputStreamReader; public class BufferedReaderDemo { public static void main(String[] args) throws Exception { BufferedReader buf = null; // 將字節(jié)輸入流變?yōu)樽址斎肓鞣旁谧址鞯木彌_區(qū)之中 buf = new BufferedReader(new InputStreamReader(System.in)); System.out.print("請輸入內(nèi)容:"); String str = buf.readLine(); System.out.println("輸入的內(nèi)容是:" + str); } } 如果想要完成鍵盤的輸入功能,使用以上的操作是最合適的,。也是鍵盤輸入數(shù)據(jù)的標準格式,。 4.輸出輸入重定向 System.out、Sytem.err都有固定的輸出目標,,都是屏幕 System.in有固定輸入目標,,是鍵盤 但,在System類中提供了一系列的輸出輸入重定向方法 ,,可以改變System.out,、Sytem.err、System.in的輸入輸出位置,。 System.out重定向:public static void setOut(PrintStream out) Sytem.err重定向:public static void setErr(PrintStream err) System.in重定向:public static void setIn(InputStream in) 范例:輸出重定向 package org.lxh.sytemiodemo; import java.io.File; import java.io.FileOutputStream; import java.io.PrintStream; public class RedirectSystemOutDemo { public static void main(String[] args) throws Exception { File file = new File("d:" + File.separator + "demo.txt"); System.setOut(new PrintStream(new FileOutputStream(file))); System.out.println("hello world") ; } } 范例:錯誤重定向 package org.lxh.sytemiodemo; import java.io.File; import java.io.FileOutputStream; import java.io.PrintStream; public class RedirectSystemErrDemo { public static void main(String[] args) throws Exception { File file = new File("d:" + File.separator + "demo.txt"); System.setErr(new PrintStream(new FileOutputStream(file))); System.err.println("hello world") ; } } 提示:之前曾經(jīng)說過System.err是不希望用戶看到的,,而System.out是希望用戶看到的,。所以在開發(fā)中, 不建議改變System.err的輸出位置,,而只建議修改System.out的輸出位置,。 package org.lxh.sytemiodemo; import java.io.File; import java.io.FileOutputStream; import java.io.PrintStream; public class ErrDemo { public static void main(String[] args) throws Exception { File file = new File("d:" + File.separator + "err.log"); System.setOut(new PrintStream(new FileOutputStream(file))); try { Integer.parseInt("hello"); } catch (Exception e) { System.out.println(e); System.err.println(e); } } } 范例:輸入重定向 package org.lxh.sytemiodemo; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; public class RedirectSystemInDemo { public static void main(String[] args) throws Exception { File file = new File("d:" + File.separator + "demo.txt"); System.setIn(new FileInputStream(file)); InputStream input = System.in; byte b[] = new byte[20]; // 開辟空間接收內(nèi)容 int len = input.read(b); // 接收內(nèi)容 System.out.println("內(nèi)容是:" + new String(b, 0, len)); } } 一般,System.in的操作最好不要去修改,。 |
|