System.getProperty()方法获取系统变量

  今天在阅读JDBC的DriverManager类源码时,看到了这么一句代码:

System.getProperty(“jdbc.drivers”);

  getProperty()这个方法是获取指定键指示的系统属性的,也就是说上面的代码获取的是jdbc.drivers这个属性。我写了个测试测试输出,发现是null值。于是就打算看看系统属性中有没有jdbc.drivers这个值。
  查看了一下java api中的getProperty()这个方法,后通过getProperties()找到了能获取到的属性,如下图所示:
getProperties()能获取到的属性

  但是居然没有我的jdbc.drivers,于是本着负责的态度,我决定将所有的属性都输出看一看。以下是通过System.getPropertys()和System.getProperty()变量所有系统属性的方法。

    @Test
    public void test(){
        //获取所有的属性
        Properties properties = System.getProperties();
        //遍历所有的属性
        for (String key : properties.stringPropertyNames()) {
            //输出对应的键和值
            System.out.println(key + "=" + properties.getProperty(key));
        }

    }

  对应的结果如下:

java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=C:\javaweb\jdk1.8.0_101_64\jre\bin
java.vm.vendor=Oracle Corporation
java.vendor.url=http://java.oracle.com/
path.separator=;
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
file.encoding.pkg=sun.io user.script= user.country=CN
sun.java.launcher=SUN_STANDARD sun.os.patch.level=
java.vm.specification.name=Java Virtual Machine Specification
user.dir=E:\7.ProjectCodeSource\jdbc
java.runtime.version=1.8.0_101-b13
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=C:\javaweb\jdk1.8.0_101_64\jre\lib\endorsed
os.arch=amd64 java.io.tmpdir=C:\Users\ADMINI~1\AppData\Local\Temp\
line.separator=

java.vm.specification.vendor=Oracle Corporation user.variant=
os.name=Windows 10 sun.jnu.encoding=GBK
java.library.path=C:\javaweb\jdk1.8.0_101_64\bin;
java.specification.name=Java Platform API Specification
java.class.version=52.0
sun.management.compiler=HotSpot 64-Bit Tiered
Compilers os.version=10.0
user.home=C:\Users\Administrator
user.timezone=
java.awt.printerjob=sun.awt.windows.WPrinterJob
file.encoding=UTF-8
java.specification.version=1.8
user.name=Administrator
java.class.path=E:\7.ProjectCodeSource\jdbc\target\test-classes;
java.vm.specification.version=1.8 sun.arch.data.model=64
java.home=C:\javaweb\jdk1.8.0_101_64\jre
sun.java.command=org.eclipse.jdt.internal.junit.runner.RemoteTestRunner
-version 3 -port 57975 -testLoaderClass org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader
-loaderpluginname org.eclipse.jdt.junit4.runtime -test com.jim.jdbc.JDBCTest:test java.specification.vendor=Oracle
Corporation user.language=zh awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode
java.version=1.8.0_101
java.ext.dirs=C:\javaweb\jdk1.8.0_101_64\jre\lib\ext;C:\Windows\Sun\Java\lib\ext
sun.boot.class.path=C:\javaweb\jdk1.8.0_101_64\jre\lib\resources.jar;C:\javaweb\jdk1.8.0_101_64\jre\lib\rt.jar;C:\javaweb\jdk1.8.0_101_64\jre\lib\sunrsasign.jar;
java.vendor=Oracle Corporation
file.separator=\
java.vendor.url.bug=http://bugreport.sun.com/bugreport/
sun.cpu.endian=little
sun.io.unicode.encoding=UnicodeLittle
sun.desktop=windows
sun.cpu.isalist=amd64

  输出的东西也太乱了,我就加了一句判断看有没有jdbc.drivers这个属性。代码如下:

@Test
    public void test(){
        //获取所有的属性
        Properties properties = System.getProperties();
        //为了看看系统的属性有几个,加了一个计数器
        int count = 0;
        //遍历所有的属性
        for (String key : properties.stringPropertyNames()) {
            System.out.println(key + "=" + properties.getProperty(key));
            count++;
            if (key.equalsIgnoreCase("jdbc.drivers")){
                System.out.println("YES");
                return ;
            }

        }
        System.out.println(count);
    }

  结果是根本没有jdbc.drivers这个属性,系统的属性有57个,比java api中列出来的要多,所以如果你的属性不再java api的所列出的列表中,不要灰心,可以使用上面的代码判断一下。

  我后来看了java api之后,加了一句代码在方法最前面:


System.setProperty("jdbc.drivers","aaa.bbb.ccc");

  结果就显示有了。也就是说,DriverManager中的jdbc.drivers这个系统属性不是本来系统自带的,需要用户自己设定采用。如果不设定,则为null。这样看来,一切都说通了。

### Java `System.getProperty` 获取数据库属性返回错误值解决方案 当遇到通过 `System.getProperty("database")` 方法获取到的值不正确的情况时,可能的原因有多个方面。通常情况下,`System.getProperty()` 是用于访问 JVM 启动参数中的系统属性[^1]。 如果目标是从 properties 文件中读取特定键对应的值而不是依赖于 JVM 的系统属性,则应采用不同的方法来加载这些资源文件的内容。对于这种情况,推荐使用 `java.util.Properties` 配合输入流的方式来读取外部配置文件的数据[^2]。 下面是一个改进后的代码片段展示如何从指定路径下的 `.properties` 文件中读取名为 `"database"` 的键所关联的值: ```java import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class DatabasePropertyReader { private static final String PROPERTY_FILE_PATH = "config/database.properties"; // 替换成实际路径 public static void main(String[] args) { Properties prop = new Properties(); InputStream input = null; try { input = DatabasePropertyReader.class.getClassLoader().getResourceAsStream(PROPERTY_FILE_PATH); if(input==null){ System.out.println("Sorry, unable to find " + PROPERTY_FILE_PATH); return; } // load a properties file from class path, inside static method prop.load(input); // get the property value and print it out String dbValue = prop.getProperty("database"); System.out.println("Database Value : " + dbValue); } catch (IOException ex) { ex.printStackTrace(); } finally { if (input != null) { try { input.close(); } catch (IOException e) { e.printStackTrace(); } } } } } ``` 此段程序尝试从路径下找到名称为 `database.properties` 的文件,并从中检索键 `"database"` 对应的字符串值。注意这里假设该文件位于项目的根目录下的 config 文件夹内;如果是其他位置,请调整变量 `PROPERTY_FILE_PATH` 中的相对路径以匹配实际情况。 另外,在 Spring 应用环境中可以直接利用框架提供的工具如 `org.springframework.core.io.support.PropertiesLoaderUtils` 来简化这一过程。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值