java基础类System源码分析

本文深入探讨了Java中的System类,包括其简介、构造方法、与标准输入输出流相关的变量和方法(in, out, err)的设置,以及重要的数组复制功能。通过对System类的源码分析,读者可以更好地理解Java系统级操作的本质。" 109578351,8317045,JavaWeb_EleVue_Pro: 基于SpringBoot+Vue+ElementUI的前后端分离框架,"['前端开发', '后端开发', 'Vue框架', 'Spring Boot', 'MybatisPlus']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

简介

构造方法

与流有关的变量和方法

in,out,err

设置in,out,err

数组复制


简介

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

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

构造方法


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

与流有关的变量和方法

in,out,err

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

    /**
     * 标准输出流。这个流已经打开并且准备好接受输出数据。
     * 典型地,这个流对应显式输出(console)或者由主机环境或用户指定的其他输出地点。
     * <p>
     * 对于一个普通的独立的java程序,写出一行输出数据的典型方式是
     * <blockquote><pre>
     *     System.out.println(data)
     * </pre></blockquote>
     * <p>
     * 
     * 看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;

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

设置in,out,err

    /**
     * 重新设置标准输入流。
     *
     * <p>最初,如果有一个安全管理器,则调用其<code>RuntimePermission("setIO")</code>来调用它的checkPermission方法,
     *  来看是否可以重新设置标准输入流。
     * <p>
     *
     * @param in the new standard input stream.
     *
     * @throws SecurityException
     *        if a security manager exists and its
     *        <code>checkPermission</code> 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.
     *
     * <p>First, if there is a security manager, its <code>checkPermission</code>
     * method is called with a <code>RuntimePermission("setIO")</code> 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
     *        <code>checkPermission</code> 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.
     *
     * <p>First, if there is a security manager, its <code>checkPermission</code>
     * method is called with a <code>RuntimePermission("setIO")</code> 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
     *        <code>checkPermission</code> 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的类都是用这个方法

    /**
     * <p>从指定的源头数组复制一个数组,以特定的位置开始,到结果数组的特定位置。
     * 数组成员的一个子序列被复制,从源头数组src到结果数组dest。
     * 被复制的成员的个数与参数length相同。
     * 源头数组的成员,从srcPos的位置到srcPos+length-1的位置,被复制到
     * 结果数组的位置,从destPos到destPos+length-1。
     * 
     * <p>如果src和dest参数引用了同一个数组对象,
     * 那么复制行为就仿佛从srcPos到srcPos+length-1的成员被第一次复制
     * 到一个长度为length的临时数组,然后临时数组的内容被复制到结果数组的destPos到destPos+length-1
     * 
     * <p>如果dest是null,就抛出NullPointerException
     * 
     * <p>如果src是null,抛出NullPointerException,并且结果数组不会被修改。
     * 
     * <p>然而,如果下面的有一项为true,抛出ArrayStoreException,并且结果数组不会被修改。
     * 
     * <ul>
     * <li>参数src引用的对象不是一个数组。
     * 
     * <li>参数dest引用的对象不是一个数组。
     * 
     * <li>参数src和dest引用的数组的成员类型是不用的原始类型。
     *     
     * <li>参数src引用的数组的成员是原始类型,dest引用的数组的成员是引用类型(是类)
     *     
     * <li>参数src引用的数组的成员是引用类型(是类),dest引用的数组的成员是原始类型
     * 
     * </ul>
     * 
     * <p> 然而,如果下面有一项为true,那么抛出IndexOutOfBoundsException,并且结果数组不会被修改。
     * 
     * <ul>
     * <li>参数srcPos是负的
     * 
     * <li>参数destPos是负的
     * 
     * <li>参数length是负的
     * 
     * <li>srcPos+length大于src.length
     *     
     * <li>destPos+length大于dest.length
     *     
     * </ul>
     * 
     * <p>然而,如果源头数组的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);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值