学习 java.lang.System 类
java.lang.System类应该说是JDK提供的一个很好的工具类。这个类设计成final,就是不让你继承。不提供构造函数,就是说不让你实例化。它却给我们提供了很多有用的方法和属性。
System 类提供了标准输入(in),输出(out)和错误(err)流。
什么是标准输入输出流?这是一个Unix概念,用来表示被程序使用的单个的信息流。还不不明白。还有什么不标准的吗?哈哈。其实我看了wiki上的解释后认为翻译成默认的流更好。停下来想一想。当你想在你的程序里面输出一个字符串的时候,操作系统怎么知道你要输出到哪里去呢?现在你当然会想当然的认为输出到显示器上啊。那时你习惯了。其实很久以前的操作系统中,在你准备输出之前,你要先连接好输出设备,是不是很麻烦。所以OS后来就预先为你连接了一个设备用于你的输入输出,通常都是控制台了。这样你就不用连接就可以用了。所以我认为理解成默认的更好。当然既然大家都认为它是默认的,那他不就是标准的了?
还有一个问题,既然都是输出,为什么还分out和err。这个问题好!要知道,系统既然可以默认,程序就能修改,也就是从定向。就是说通过设置,让System.out把信息输出到你想要的地方,比如文件,也就成了日志文件。你想想,一般的信息和错误信息能同等对待吗?那必须得分开啊。比如你可以把一般的信息和错误信息打印到不同的文件里面,你就可以很快找到错误信息,而不至于被淹没在大量的一般信息里面。这就是为什么你的系统日志分一般日志和错误日志。
还有一个区别是,out是缓存输出的,err是不缓存的,因为它紧急嘛。刻不容缓。呵呵。
这里注意是字节流,out和err都是java.io.PrintStream,继承了java.io.OutputStream。
而err是InputStream。关于字节流和字符流以后再说,这里不展开。
你用的最多的应该就是System.out这个静态属性了。利用这个标准输出流对象,你可以把字符串打印到控制台。
public static void main(String[] args) { System.out.println("Hello System.out!"); System.err.println("Hello System.err!");}
try {int input = System.in.read();System.out.println("read int: " + input);} catch (IOException e) {e.printStackTrace();}
private static void initializeSystemClass() { FileInputStream fdIn = new FileInputStream(FileDescriptor.in);FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);setIn0(new BufferedInputStream(fdIn));setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true));}
private final StreamEncoder se;public void write(char cbuf[], int off, int len) throws IOException {se.write(cbuf, off, len); }
byte[] buff = new byte[4];System.out.print("input:");System.in.read(buff);String s = new String(buff);System.out.println("output String: " + (s+2));int i = Integer.valueOf(s);System.out.println("output int: " + (i+2));
Console console = System.console();String line = console.readLine();System.out.print(line);
public static void setIn(InputStream in);public static void setOut(PrintStream out);public static void setErr(PrintStream err);
FileOutputStream fos = new FileOutputStream("d:\\system.out.log");PrintStream out = new PrintStream(fos);System.setOut(out);System.out.println("Hello new out");