您的当前位置:首页正文

Java中System的解析第二期

2023-06-29 来源:帮我找美食网

简介

  接着上回说的InputStream(“标准”输入流)和PrintStream(“标准”输出流)之后,本期来说说“标准”的错误输出流和SecurityManager(安全管理器)。

内容

PrintStream err
官方解释

  “标准”错误输出流。此流已打开并准备接受输出数据。通常,此流对应于显示输出或主机环境或用户指定的另一个输出目的地。按照惯例,此输出流用于显示错误消息或其他应立即引起用户注意的信息,即使主要输出流(变量out的值)已被重定向到通常不受持续监控的文件或其他目标。

具体使用
System.err.print("错误信息-不换行01");
System.err.print("错误信息-不换行02");
System.err.println("错误信息-换行01");
System.err.println("错误信息-换行02");

结果

  思考一下:执行下面的代码和执行上面代码的差异。

System.err.println("错误信息-换行01");
System.err.println("错误信息-换行02");
System.err.print("错误信息-不换行01");
System.err.print("错误信息-不换行02");
个人解析

  对比PrintStream out的官方解释:“标准”输出流。此流已打开并准备接受输出数据。通常,此流对应于显示输出或主机环境或用户指定的另一个输出目的地。

  除了基本的使用方式相似外,“标准”错误输出流的除了比“标准”输出流更能引起用户注意外,更具有实时性。因为目的是为了用户及时发现错误。与之相比 “标准”输出流优先级就不高,为了减少资源开支,会缓存在JVM和操作系统中,有时候会积攒到一定数量才会输出。可以运行下面代码,每次输出的结果可能不一样

System.err.println("错误信息01");
System.err.println("错误信息02");
System.out.println("正常信息01");
System.out.println("正常信息02");
SecurityManager
官方解释

 安全管理器是一个允许应用程序实现安全策略的类。它允许应用程序在执行可能不安全或敏感的操作之前,确定该操作是什么,以及是否在允许执行该操作的安全上下文中尝试该操作。应用程序可以允许或不允许该操作。

主要功能
具体使用
// 初始化
System.setSecurityManager(new SecurityManager());
SecurityManager sm = System.getSecurityManager();
// 校验
if (sm == null) {
    System.out.println("Security manager couldn’t established");
    return;
}else {
    System.out.println("Security manager connection is established");
}
// 方便测试,直接获取本机的环境变量
Map<String,String> envs  = System.getenv();
System.out.println("测试完成:"+envs.size());

正常结果 

因为安全策略的限制,是不能直接获取的。有两种方式解决:

  • 修改安全策略文件
  • 自定义安全策略

第一种修改安全策略文件,在打开jdk下面的java.policy。一般的路径是  jdk路径\jre\lib\security\

打开文件后添加下面语句后保存即可。

// 表示关闭所有安全策略
permission java.security.AllPermission;

再次执行,可以看到获取到了本机的65个环境变量。

第二种自定义安全策略(推荐

import java.security.Permission;

public class MySecurityManager extends SecurityManager {
    @Override
    public void checkPermission(Permission perm) {
        // super.checkPermission(perm);
    }
}
// 初始化 用自己定义的安全策略器
System.setSecurityManager(new MySecurityManager());
SecurityManager sm = System.getSecurityManager();
// 校验
if (sm == null) {
    System.out.println("Security manager couldn’t established");
    return;
}else {
    System.out.println("Security manager connection is established");
}
// 获取环境变量
Map<String,String> envs  = System.getenv();
System.out.println("测试完成:"+envs.size());

结果

结语

  以上就是本期内容,下期内容继续!

因篇幅问题不能全部显示,请点此查看更多更全内容

热门图文

Top