java基础类System源码分析

目录

 

简介

构造方法

与流有关的变量和方法

in,out,err

设置in,out,err

数组复制


简介

在API中system类介绍的比较简单,我们给出定义,system中代表程序所在系统,提供了对应的一些系统属性信息和系统操作。

/**
 * System类包含了几个有用的类字段和方法。他不能被实例化。
 * 
 * 

System类提供的功能包括标准输入,标准输出,错误输出流; * 访问外部定义的属性和环境变量; * 加载文件和库的方法; * 一个工具方法,能够快速复制一个数组的一部分。 * * @author unascribed * @since JDK1.0 */ public final class System

java基础类System源码分析_第1张图片

java基础类System源码分析_第2张图片

构造方法


    /** 这个类不能初始化*/
    private System() {
    }

与流有关的变量和方法

in,out,err

    /**
     * 标准输入流。这个流已经代开,并且准备好提供输入数据。
     * 典型地,这个流对应于键盘输入或者由主机环境或用户指定的其他输入来源。
     * 
     */
    public final static InputStream in = null;

    /**
     * 标准输出流。这个流已经打开并且准备好接受输出数据。
     * 典型地,这个流对应显式输出(console)或者由主机环境或用户指定的其他输出地点。
     * 

* 对于一个普通的独立的java程序,写出一行输出数据的典型方式是 *

     *     System.out.println(data)
     * 
*

* * 看PrintStream类的println方法 * * @see java.io.PrintStream#println() * @see java.io.PrintStream#println(boolean) * @see java.io.PrintStream#println(char) * @see java.io.PrintStream#println(char[]) * @see java.io.PrintStream#println(double) * @see java.io.PrintStream#println(float) * @see java.io.PrintStream#println(int) * @see java.io.PrintStream#println(long) * @see java.io.PrintStream#println(java.lang.Object) * @see java.io.PrintStream#println(java.lang.String) */ public final static PrintStream out = null; /** * 典型的错误输出流。这个流已经打开并且准备好接受输出数据。 *

* 典型地,这个流对应显式输出(console)或者由主机环境或用户指定的其他输出地点。 * 按照惯例,这个输出流用于展示错误信息或者其他即使在主要输出流,但是用户应该快速注意到的信息。 * 变量out的值,应该被重定向到一个文件或者其他目的地,通常不被持续监控 * */ public final static PrintStream err = null;

设置in,out,err

    /**
     * 重新设置标准输入流。
     *
     * 

最初,如果有一个安全管理器,则调用其RuntimePermission("setIO")来调用它的checkPermission方法, * 来看是否可以重新设置标准输入流。 *

* * @param in the new standard input stream. * * @throws SecurityException * if a security manager exists and its * checkPermission method doesn't allow * reassigning of the standard input stream. * * @see SecurityManager#checkPermission * @see java.lang.RuntimePermission * * @since JDK1.1 */ public static void setIn(InputStream in) { checkIO(); setIn0(in); } /** * Reassigns the "standard" output stream. * *

First, if there is a security manager, its checkPermission * method is called with a RuntimePermission("setIO") permission * to see if it's ok to reassign the "standard" output stream. * * @param out the new standard output stream * * @throws SecurityException * if a security manager exists and its * checkPermission method doesn't allow * reassigning of the standard output stream. * * @see SecurityManager#checkPermission * @see java.lang.RuntimePermission * * @since JDK1.1 */ public static void setOut(PrintStream out) { checkIO(); setOut0(out); } /** * Reassigns the "standard" error output stream. * *

First, if there is a security manager, its checkPermission * method is called with a RuntimePermission("setIO") permission * to see if it's ok to reassign the "standard" error output stream. * * @param err the new standard error output stream. * * @throws SecurityException * if a security manager exists and its * checkPermission method doesn't allow * reassigning of the standard error output stream. * * @see SecurityManager#checkPermission * @see java.lang.RuntimePermission * * @since JDK1.1 */ public static void setErr(PrintStream err) { checkIO(); setErr0(err); }

   private static void checkIO() {
        SecurityManager sm = getSecurityManager();
        if (sm != null) {
            sm.checkPermission(new RuntimePermission("setIO"));
        }
    }

    private static native void setIn0(InputStream in);
    private static native void setOut0(PrintStream out);
    private static native void setErr0(PrintStream err);

数组复制

很多jdk的类都是用这个方法

    /**
     * 

从指定的源头数组复制一个数组,以特定的位置开始,到结果数组的特定位置。 * 数组成员的一个子序列被复制,从源头数组src到结果数组dest。 * 被复制的成员的个数与参数length相同。 * 源头数组的成员,从srcPos的位置到srcPos+length-1的位置,被复制到 * 结果数组的位置,从destPos到destPos+length-1。 * *

如果src和dest参数引用了同一个数组对象, * 那么复制行为就仿佛从srcPos到srcPos+length-1的成员被第一次复制 * 到一个长度为length的临时数组,然后临时数组的内容被复制到结果数组的destPos到destPos+length-1 * *

如果dest是null,就抛出NullPointerException * *

如果src是null,抛出NullPointerException,并且结果数组不会被修改。 * *

然而,如果下面的有一项为true,抛出ArrayStoreException,并且结果数组不会被修改。 * *

    *
  • 参数src引用的对象不是一个数组。 * *
  • 参数dest引用的对象不是一个数组。 * *
  • 参数src和dest引用的数组的成员类型是不用的原始类型。 * *
  • 参数src引用的数组的成员是原始类型,dest引用的数组的成员是引用类型(是类) * *
  • 参数src引用的数组的成员是引用类型(是类),dest引用的数组的成员是原始类型 * *
* *

然而,如果下面有一项为true,那么抛出IndexOutOfBoundsException,并且结果数组不会被修改。 * *

    *
  • 参数srcPos是负的 * *
  • 参数destPos是负的 * *
  • 参数length是负的 * *
  • srcPos+length大于src.length * *
  • destPos+length大于dest.length * *
* *

然而,如果源头数组的srcPos到srcPos+length-1的成员不能通过赋值转换, * 转换到结果数组的成员类型,抛出ArrayStoreException。 * 在这种情况,让k为小于length的,而且src[srcPos+k]不能被转换为结果数组的成员类型,的最小的非负整数。 * 当抛出异常时,源头数组从srcPos到srcPos+k-1的成员已经被复制到 * 结果数组的destPos到destPos+k-1,并且结果数组的其他地方不被修改。 * (因为已经列出了一些限制,这一段只适用于两个数组的成员都是引用类型的情况) * * @param src 源头数组 * @param srcPos 源头数组的开始位置 * @param dest 结果数组 * @param destPos 结果数组的开始位置 * @param length 数组元素被复制的数量 * @exception IndexOutOfBoundsException 如果复制会产生访问超出数组限制的元素 * @exception ArrayStoreException 如果src数组的元素不能存进dest数组,因为类型不匹配 * @exception NullPointerException 如果src或dest有一个为null */ public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(java,源码分析)