System类是一个系统类,是一个陪伴我们时间最长的一个类,例如 System.out.println();就是类中提供的操作。 1.取得计算时间 使用此类可以取得计算的时间。例如:想知道一个程序执行时一共花了多少时间。 .得到当前的时间: 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; // 会产生大量的垃圾 } long end = System.currentTimeMillis(); // 取得当前时间 System.out.println(end - begin);// 取得计算的时间 } } 2.System与垃圾收集 在System类中存在一个gc()方法。public static void gc(); 调用此方法实际上就是调用了Runtime类中的gc()方法。 如果一个对象不用的话,则就有可能进行垃圾回集。但是如果一个对象在被收集前需要做一些收尾工作。 在Object类中存在一个方法,此方法在对象被回收前调用: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();// 强制进行垃圾收集 } } 从一般的开发角度上看,很少说有专门的开发在对象回收前进行操作的,所以,此操作理解即可。 面试题:请说出final,finally,finalize的区别? 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());// 输出内容 out.close(); } } 2.System.err:表示的是错误输出。看下面代码: 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); } } } 从代码本身观察不出任何本质问题,只有在eclipse下才会出现红色的字。实际上对于以上两个常量想区分区别, 只能从概念上讲: System.out:一般的信息是愿意展示给用户看见的 System.err:一般的信息是不愿意展示给用户看见的 3.System.in实际上表示的就是一个键盘的输入,使用此操作可以完成键盘输入数据的功能。看下面代码: package org.lxh.sytemiodemo; import java.io.InputStream; public class SystemInDemo01 { public static void main(String[] args) throws Exception { InputStream input = System.in; // 准备键盘输入数据 byte b[] = new byte[20]; // 开辟空间接收内容 System.out.print("请输入内容:"); int len = input.read(b); // 接收内容 System.out.println("输入的内容是:" + new String(b, 0, len)); } } 此时,已经实现了键盘输入功能。但此程序在使用时会存在长度限制。而且输入中文时,也会存在问题,那么, 此时就可以通过另一种方法,不指定大小,边读边判断是否结束。请看下面代码: package org.lxh.sytemiodemo; import java.io.InputStream; public class SystemInDemo03 { public static void main(String[] args) throws Exception { InputStream input = System.in; // 准备键盘输入数据 System.out.print("请输入内容:"); int temp = 0; // 接收内容 StringBuffer buf = new StringBuffer(); while ((temp = input.read()) != -1) { char c = (char) temp; // 转型 if (c == '\n') {// 判断是否是回车 break;// 退出循环 } buf.append(c); } System.out.println("输入的内容是:" + buf); } } 此时,数据读取的时候没有长度限制了。但是在输入中文时,就无法正确地读取,因为每次读的是一个字节。 应该按照整体读取,那么要想完成更好的读取操作,则只能使用后续的BufferReader类来完成。 BufferReader类: 该类表示的是缓冲区读取,可以一次性的将内容全部读取出来。 BufferReader类的构造方法:BufferedReader(Reader in); 那么,如果想要使用BufferReader类接收键盘的输入内容的话,则此时就无法直接实例化了, System.in属于InputStream类型的。 在java中,提供了两个专门的类。字节到字符流的转换: InputStreamReader:表示将字节的输入流转换成字符流 OutputStreamWriter:表示将字符的输出流转换成字节的输出流 直接使用以上的类,就可以完成转换功能。使用public String readLine() throws IOException方法可以读取数据。该方法表示 一次性读取一行数据,而且一定要记住的是,如果返回的类容是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; // 将字节输入流变为字符输入流放在字符流的缓冲区之中 buf = new BufferedReader(new InputStreamReader(System.in)); System.out.print("请输入内容:"); String str = buf.readLine(); System.out.println("输入的内容是:" + str); } } 如果想要完成键盘的输入功能,使用以上的操作是最合适的。也是键盘输入数据的标准格式。 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") ; } } 提示:之前曾经说过System.err是不希望用户看到的,而System.out是希望用户看到的。所以在开发中, 不建议改变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]; // 开辟空间接收内容 int len = input.read(b); // 接收内容 System.out.println("内容是:" + new String(b, 0, len)); } } 一般,System.in的操作最好不要去修改。 |
|