23-System+Runtime+Process

一、java.lang.System

1、System:系统类,为用户程序提供当前环境下的系统资源。使用前不需要用new语句进行初始化,因为在系统启动时,已自动对系统类进行初始化,分配了相应的内存区

2、System类被final修饰,不能实例化。类中的方法和属性都是静态的

3、方法

(1)static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length):从指定源数组中复制一个数组,指定起止位置。速度较快

(2)static void exit(int status):终止当前正在运行的Java虚拟机。非0的状态码表示异常终止

(3)static void gc():运行垃圾回收器。System.gc();  ==  Runtime.getRuntime().gc();

(4)static String getProperty(String key):获取用指定键描述的系统属性。下面是部分key值:

         user.dir:用户目录

         user.name:用户名

         os.name:当前操作系统的名字

扫描二维码关注公众号,回复: 2911154 查看本文章

         java.version:java版本号

         file.separator:文件分隔符

         path.separator:路径分隔符

(5)static Properties getProperties():确定当前的系统属性(所有系统属性)。Properties extends Hashtable,存储的都是String类型的键值对。但Properties类没有泛型,因为它里面的键和值都是String类型,其方法会直接操作字符串

    public static void main(String[] args) {

        //获取系统的属性信息,并存储到Properties集合中
        Properties properties = System.getProperties();
        //Properties集合中存储的都是String类型的键值对
        Set<String> keySet = properties.stringPropertyNames();
        for (String name : keySet) {
            //get()方法是Properties从其父类Hashtable继承而来的
            //get():返回的是Object,需要强转
//            String value = (String) properties.get(name);
            //getProperty():返回值类型是String
            //建议使用Properties类自己的方法getProperty()
            String value = properties.getProperty(name);
            System.out.println(name + ":" + value);
        }

    }

(5)static String setProperty(String key, String value):设置指定键指示的系统属性(全局的),返回系统属性以前的值。经过用户程序修改的系统属性是暂时性的,如果系统重新启动,系统属性会恢复原始属性

(6)static void setProperties(Properties props):将系统属性设置为Properties参数

(7)static void load(String filename):从作为动态库的本地文件系统中以指定的文件名加载代码文件。文件名参数必须是完整的路径名。System.load(filename);  ==  Runtime.getRuntime().load(filename);

(8)static void loadLibrary(String libname):加载由libname参数指定的系统库。将库名映射到实际系统库的方法取决于系统。System.loadLibrary(name);  ==  Runtime.getRuntime().loadLibrary(name);

4、关于getProperty()方法

(1)不同的操作系统,键都是固定的,先根据键获取值,再对值进行使用,提高程序的移植性(无论哪个系统,JVM启动时都会先获取系统信息)

eg:根据键(line.separator)获取行分隔符

    //任何系统都能获取当前系统的回车符
    System.getProperty("line.separator")

(2)将从系统中获取的信息直接定义成常量,系统一启动就可以立即获取

二、java.lang.Runtime

1、每个java应用程序都有一个Runtime类实例,使应用程序能够与其运行的环境相连接。应用程序不能创建自己的Runtime类实例,但可以通过getRuntime()方法获取。一旦得到了当前Runtime对象的实例,就可以调用Runtime对象的方法去控制Java虚拟机的状态和行为

注:java应用程序运行的环境实际上就是JVM,java application通过Runtime对象和其运行环境(JVM)打交道

2、当applet与其他不被信任的代码调用任何Runtime类的方法时,常常会引起SecurityException异常

3、如果一个类没有提供构造函数,而这个类中又有非静态方法,那么这个类至少有一个方法是静态的,并返回本类对象 -- 单例。Runtime类使用了单例设计模式,保证了运行时的Java程序的对象唯一性

注:如果有两个方法能返回本类对象,就不是单例。因为返回的是不同的内部创建对象

4、方法

(1)static Runtime getRuntime():返回与当前java应用程序相关的运行时对象

(2)void gc():运行垃圾回收器。Runtime.getRuntime().gc();  ==  System.gc();

(3)void exit(int status):通过启动虚拟机的关闭序列,终止当前正在运行的Java虚拟机。此方法从不正常返回,可以将变量作为一个状态码,非零的状态码表示非正常终止。Runtime.getRuntime().exit(-1);  ==  System.exit(-1);

(4)void halt(int status) :强行终止目前正在运行的Java虚拟机。此方法从不正常返回,非零的状态码表示非正常终止

(5)int availableProcessors():向Java虚拟机返回可用处理器的数目

(6)long totalMemory():返回Java虚拟机中的内存总量。返回的值取决于主机环境

(7)long freeMemory():返回Java虚拟机中的空闲内存量。调用gc()方法可能导致freeMemory()返回值的增加

(8)long maxMemory():返回Java虚拟机试图使用的最大内存量。如果内存本身没有限制,则返回值Long.MAX_VALUE

(9)Process exec(String command) throws IOException:在单独的进程中执行指定的字符串命令

(10)Process exec(String[] cmdarray) throws IOException:在单独的进程中执行指定命令和变量

    public static void main(String[] args) throws IOException {

        Runtime runtime = Runtime.getRuntime();
        //exec():开启硬盘上的执行文件(指定路径下)
        //打开一个记事本文件,当前目录没有就到path下找。如果指定文件不存在,抛出IOException
        runtime.exec("notepad.exe");
        //绝对路径也可以,双反斜杠\\是防止\被转义
        runtime.exec("C:\\tencent\\QQ.exe");
        //运行记事本程序(notepad.exe),用这个程序打开指定路径下的xxx.java文件。程序和文件路径之间用空格隔开
        runtime.exec("notepad.exe E:\\xxx.java");

    }

(11)void load(String filename):加载作为动态库的指定文件名。文件名变量必须是一个完整的路径名。

                                                       Runtime.getRuntime().load(filename);  ==  System.load(filename);

(12)void loadLibrary(String libname):加载具有指定库名的动态库。从以前获取库文件的本地文件系统中加载含有本机代码的文件。这一过程的细节取决于实现方法,可以以某种特定于系统的方式完成从库名到特定文件名的映射

(13)void runFinalization():运行挂起finalization的所有对象的终止方法。

                                                Runtime.getRuntime().runFinalization();  ==  System.runFinalization();

三、java.lang.Process

1、public abstract class Process:进程(本地进程)

2、Process类提供了执行从进程输入、执行输出到进程、等待进程完成、检查进程的退出状态以及销毁(杀掉)进程的方法

3、ProcessBuilder.start()和Runtime.exec()方法创建一个本机进程,并返回Process子类的一个实例,该实例可用来控制进程并获得相关信息

4、构造方法

(1)Process()

5、方法

(1)abstract void destroy():杀掉子进程。强制终止此Process对象表示的子进程

(2)abstract int exitValue():返回子进程的出口值。0表示正常终止

(3)abstract InputStream getErrorStream():获取子进程的错误流。错误流获得由该Process对象表示的进程的错误输出流传送的数据

(4)abstract InputStream getInputStream():获取子进程的输入流。输入流获得由该Process对象表示的进程的标准输出流

(5)abstract OutputStream getOutputStream():获取子进程的输出流。输出流被传送给由该Process对象表示的进程的标准输入流

(6)abstract int waitFor() throws InterruptedException:导致当前线程等待。如有必要,一直要等到由该Process对象表示的进程已经终止。如果已终止该子进程,此方法立即返回。如果没有终止该子进程,调用的线程将被阻塞,直到退出子进程。返回进程的出口值,0表示正常终止

    public static void main(String[] args) throws IOException, InterruptedException {

        /**
         * 功能:打开一个记事本,5秒后关闭
         */
        Runtime runtime = Runtime.getRuntime();
        //只有存在着应用程序,才能去创建进程
        Process process = runtime.exec("notepad.exe");
        Thread.sleep(5000);
        //只能杀掉runtime对象自己开启的进程
        process.destroy();

    }

四、System.gc()和System.runFinalization()

1、System.gc():告诉垃圾收集器打算进行垃圾收集,而垃圾收集器进不进行收集是不确定的

                             占了内存但是没有利用,把没有被垃圾回收机制处理的对象尽可能的处理掉

2、System.runFinalization():强制调用已经失去引用的对象的finalize方法

                                                强制垃圾回收机制尽可能的回收没有被利用的对象,以释放出其占用的内存

        System.gc();
        //要在runFinalization()之前执行gc()
        System.runFinalization();

3、finalize():Object的方法。当垃圾收集器认为没有指向对象实例的引用时,会在销毁该对象之前调用finalize()方法。该方法最常见的作用是确保释放实例占用的全部资源。java并不保证定时为对象实例调用该方法,甚至不保证方法会被调用,所以该方法不应该用于正常内存处理

猜你喜欢

转载自blog.csdn.net/ruyu00/article/details/81673307