系統(tǒng)實(shí)用工具
System類實(shí)現(xiàn)了許多系統(tǒng)實(shí)用程序,其中一些已在上一節(jié)配置實(shí)用程序中介紹過(guò),本節(jié)介紹一些其他系統(tǒng)實(shí)用程序。
命令行I/O對(duì)象系統(tǒng)提供了幾個(gè)預(yù)定義的I/O對(duì)象,這些對(duì)象在Java應(yīng)用程序中非常有用,可以從命令行啟動(dòng),它們實(shí)現(xiàn)了大多數(shù)操作系統(tǒng)提供的標(biāo)準(zhǔn)I/O流,以及用于輸入密碼的控制臺(tái)對(duì)象,有關(guān)更多信息,請(qǐng)參閱基礎(chǔ)I/O課程中的命令行I/O。
系統(tǒng)屬性在屬性中,我們研究了應(yīng)用程序可以使用Properties對(duì)象來(lái)維護(hù)其配置的方式,Java平臺(tái)本身使用Properties對(duì)象來(lái)維護(hù)自己的配置,System類維護(hù)一個(gè)Properties對(duì)象,該對(duì)象描述當(dāng)前工作環(huán)境的配置,系統(tǒng)屬性包括有關(guān)當(dāng)前用戶、Java運(yùn)行時(shí)的當(dāng)前版本以及用于分隔文件路徑名的組件的字符的信息。
下表描述了一些最重要的系統(tǒng)屬性。
鍵 | 含義 |
---|---|
"file.separator" | 用于分隔文件路徑組件的字符,這在UNIX上是“/”,在Windows上是“” |
"java.class.path" | 用于查找包含類文件的目錄和JAR存檔的路徑,類路徑的元素由path.separator屬性中指定的特定于平臺(tái)的字符分隔 |
"java.home" | Java Runtime Environment(JRE)的安裝目錄 |
"java.vendor" | JRE vendor名稱 |
"java.vendor.url" | JRE vendor URL |
"java.version" | JRE版本號(hào) |
"line.separator" | 操作系統(tǒng)用于分隔文本文件中的行的序列 |
"os.arch" | 操作系統(tǒng)架構(gòu) |
"os.name" | 操作系統(tǒng)名稱 |
"path.separator" | java.class.path中使用的路徑分隔符 |
"user.dir" | 用戶工作目錄 |
"user.home" | 用戶主目錄 |
"user.name" | 用戶帳戶名稱 |
安全考慮:安全管理器可以限制對(duì)系統(tǒng)屬性的訪問(wèn),這通常是applet中的一個(gè)問(wèn)題,它無(wú)法讀取某些系統(tǒng)屬性,也無(wú)法寫(xiě)入任何系統(tǒng)屬性,有關(guān)訪問(wèn)applet中的系統(tǒng)屬性的更多信息,請(qǐng)參閱“使用Java Rich Internet Applications進(jìn)行更多操作”課程中的“系統(tǒng)屬性”。讀取系統(tǒng)屬性
System類有兩個(gè)用于讀取系統(tǒng)屬性的方法:getProperty和getProperties。
System類有兩個(gè)不同版本的getProperty,兩者都檢索參數(shù)列表中指定的屬性的值,兩個(gè)getProperty方法中較簡(jiǎn)單的方法是使用單個(gè)參數(shù),即屬性鍵。例如,要獲取path.separator的值,請(qǐng)使用以下語(yǔ)句:
System.getProperty("path.separator");
getProperty方法返回包含屬性值的字符串,如果該屬性不存在,則此版本的getProperty返回null。
另一個(gè)版本的getProperty需要兩個(gè)String參數(shù):第一個(gè)參數(shù)是查找的鍵,如果無(wú)法找到鍵或沒(méi)有值,則第二個(gè)參數(shù)是要返回的默認(rèn)值。例如,以下對(duì)getProperty的調(diào)用會(huì)查找名為subliminal.message的System屬性,這不是有效的系統(tǒng)屬性,因此該方法不是返回null,而是返回作為第二個(gè)參數(shù)提供的默認(rèn)值:"Buy StayPuft Marshmallows!"。
System.getProperty("subliminal.message", "Buy StayPuft Marshmallows!");
System類提供的訪問(wèn)屬性值的最后一個(gè)方法是getProperties方法,該方法返回一個(gè)Properties對(duì)象,該對(duì)象包含一組完整的系統(tǒng)屬性定義。
寫(xiě)入系統(tǒng)屬性要修改現(xiàn)有的系統(tǒng)屬性集,請(qǐng)使用System.setProperties,此方法采用已初始化為包含要設(shè)置的屬性的Properties對(duì)象,此方法使用Properties對(duì)象表示的新集替換整個(gè)系統(tǒng)屬性集。
更改系統(tǒng)屬性可能存在危險(xiǎn),應(yīng)謹(jǐn)慎處理,許多系統(tǒng)屬性在啟動(dòng)后不會(huì)重新讀取,而是用于提供信息,更改某些屬性可能會(huì)產(chǎn)生意外的副作用。
下一個(gè)示例PropertiesTest創(chuàng)建一個(gè)Properties對(duì)象,并從myProperties.txt初始化它。
subliminal.message=Buy StayPuft Marshmallows!
然后,PropertiesTest使用System.setProperties將新的Properties對(duì)象安裝為當(dāng)前的系統(tǒng)屬性集。
import java.io.FileInputStream; import java.util.Properties; public class PropertiesTest { public static void main(String[] args) throws Exception { // set up new properties object // from file "myProperties.txt" FileInputStream propFile = new FileInputStream( "myProperties.txt"); Properties p = new Properties(System.getProperties()); p.load(propFile); // set the system properties System.setProperties(p); // display new properties System.getProperties().list(System.out); } }
注意PropertiesTest如何創(chuàng)建Properties對(duì)象p,它被用作setProperties的參數(shù):
Properties p = new Properties(System.getProperties());
此語(yǔ)句使用當(dāng)前系統(tǒng)屬性集初始化新屬性對(duì)象p,在此小應(yīng)用程序的情況下,該屬性是由運(yùn)行時(shí)系統(tǒng)初始化的屬性集。然后,應(yīng)用程序從文件myProperties.txt將其他屬性加載到p中,并將系統(tǒng)屬性設(shè)置為p。這具有將myProperties.txt中列出的屬性添加到運(yùn)行時(shí)系統(tǒng)在啟動(dòng)時(shí)創(chuàng)建的屬性集的效果,請(qǐng)注意,應(yīng)用程序可以創(chuàng)建沒(méi)有任何默認(rèn)Properties對(duì)象的p,如下所示:
Properties p = new Properties();
另請(qǐng)注意,系統(tǒng)屬性的值可以被覆蓋!例如,如果myProperties.txt包含以下行,則將覆蓋java.vendor系統(tǒng)屬性:
java.vendor=Acme Software Company
通常,請(qǐng)注意不要覆蓋系統(tǒng)屬性。
setProperties方法更改當(dāng)前正在運(yùn)行的應(yīng)用程序的系統(tǒng)屬性集,這些變化并不持久。也就是說(shuō),更改應(yīng)用程序中的系統(tǒng)屬性不會(huì)影響將來(lái)對(duì)此解釋程序或任何其他應(yīng)用程序的Java解釋程序的調(diào)用,運(yùn)行時(shí)系統(tǒng)每次啟動(dòng)時(shí)都會(huì)重新初始化系統(tǒng)屬性,如果要保持對(duì)系統(tǒng)屬性的更改,則應(yīng)用程序必須在退出之前將值寫(xiě)入某個(gè)文件,并在啟動(dòng)時(shí)再次讀取它們。
安全管理器安全管理器是定義應(yīng)用程序安全策略的對(duì)象,此策略指定不安全或敏感的操作,安全策略不允許的任何操作都會(huì)導(dǎo)致拋出SecurityException,應(yīng)用程序還可以查詢其安全管理器以發(fā)現(xiàn)允許的操作。
通常,Web applet與瀏覽器或Java Web Start插件提供的安全管理器一起運(yùn)行,其他類型的應(yīng)用程序通常在沒(méi)有安全管理器的情況下運(yùn)行,除非應(yīng)用程序本身定義了安全管理器。如果沒(méi)有安全管理器,則該應(yīng)用程序沒(méi)有安全策略,并且沒(méi)有任何限制。
本節(jié)介紹應(yīng)用程序如何與現(xiàn)有安全管理器進(jìn)行交互,有關(guān)更多詳細(xì)信息,包括有關(guān)如何設(shè)計(jì)安全管理器的信息,請(qǐng)參閱安全指南。
與安全管理器交互安全管理器是SecurityManager類型的對(duì)象,要獲取對(duì)此對(duì)象的引用,請(qǐng)調(diào)用System.getSecurityManager。
SecurityManager appsm = System.getSecurityManager();
如果沒(méi)有安全管理器,則此方法返回null。
一旦應(yīng)用程序具有對(duì)安全管理器對(duì)象的引用,它就可以請(qǐng)求執(zhí)行特定事務(wù)的權(quán)限,標(biāo)準(zhǔn)庫(kù)中的許多類都是這樣做的。例如,以退出狀態(tài)終止Java虛擬機(jī)的System.exit調(diào)用SecurityManager.checkExit以確保當(dāng)前線程具有關(guān)閉應(yīng)用程序的權(quán)限。
SecurityManager類定義了許多用于驗(yàn)證其他類型操作的其他方法。例如,SecurityManager.checkAccess驗(yàn)證線程訪問(wèn),SecurityManager.checkPropertyAccess驗(yàn)證對(duì)指定屬性的訪問(wèn),每個(gè)操作或一組操作都有自己的checkXXX()方法。
此外,checkXXX()方法集表示已受安全管理器保護(hù)的操作集,通常,應(yīng)用程序不必直接調(diào)用任何checkXXX()方法。
確認(rèn)安全違規(guī)在沒(méi)有安全管理器的情況下,許多常規(guī)操作在使用安全管理器運(yùn)行時(shí)都會(huì)拋出SecurityException,即使在調(diào)用未記錄為拋出SecurityException的方法時(shí)也是如此,例如,請(qǐng)考慮以下用于讀取文件的代碼:
reader = new FileReader("xanadu.txt");
在缺少安全管理器的情況下,如果xanadu.txt存在且可讀,則此語(yǔ)句無(wú)錯(cuò)誤地執(zhí)行,但是假設(shè)此語(yǔ)句插入到Web applet中,該applet通常在不允許文件輸入的安全管理器下運(yùn)行,可能會(huì)導(dǎo)致以下錯(cuò)誤消息:
appletviewer fileApplet.html Exception in thread "AWT-EventQueue-1" java.security.AccessControlException: access denied (java.io.FilePermission characteroutput.txt write) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323) at java.security.AccessController.checkPermission(AccessController.java:546) at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) at java.lang.SecurityManager.checkWrite(SecurityManager.java:962) at java.io.FileOutputStream.(FileOutputStream.java:169) at java.io.FileOutputStream. (FileOutputStream.java:70) at java.io.FileWriter. (FileWriter.java:46) ...
請(qǐng)注意,在這種情況下拋出的特定異常java.security.AccessControlException是SecurityException的子類。
系統(tǒng)中的其他方法本節(jié)介紹了前面幾節(jié)中未介紹的System中的一些方法。
arrayCopy方法有效地在數(shù)組之間復(fù)制數(shù)據(jù),有關(guān)更多信息,請(qǐng)參閱語(yǔ)言基礎(chǔ)知識(shí)課程中的數(shù)組。
currentTimeMillis和nanoTime方法可用于測(cè)量應(yīng)用程序執(zhí)行期間的時(shí)間間隔。要以毫秒為單位測(cè)量時(shí)間間隔,請(qǐng)?jiān)陂g隔的開(kāi)始和結(jié)束時(shí)調(diào)用currentTimeMillis兩次,并從第二個(gè)返回值中減去第一個(gè)值。同樣,調(diào)用nanoTime兩次測(cè)量一個(gè)納秒的間隔。
currentTimeMillis和nanoTime的準(zhǔn)確性受操作系統(tǒng)提供的時(shí)間服務(wù)的限制,不要假設(shè)currentTimeMillis精確到最接近的毫秒,或者nanoTime精確到最接近的納秒。此外,currentTimeMillis和nanoTime都不應(yīng)用于確定當(dāng)前時(shí)間,使用高級(jí)方法,例如java.util.Calendar.getInstance。
exit方法使Java虛擬機(jī)關(guān)閉,并使用參數(shù)指定的整數(shù)退出狀態(tài),退出狀態(tài)可用于啟動(dòng)應(yīng)用程序的進(jìn)程,按照慣例,退出狀態(tài)為0表示應(yīng)用程序正常終止,而任何其他值都是錯(cuò)誤代碼。、
上一篇:配置實(shí)用工具 下一篇:PATH和CLASSPATH文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73909.html
Java? 教程 Java教程是為JDK 8編寫(xiě)的,本頁(yè)面中描述的示例和實(shí)踐沒(méi)有利用在后續(xù)版本中引入的改進(jìn)。 Java教程是希望使用Java編程語(yǔ)言創(chuàng)建應(yīng)用程序的程序員的實(shí)用指南,其中包括數(shù)百個(gè)完整的工作示例和數(shù)十個(gè)課程,相關(guān)課程組被組織成教程。 覆蓋基礎(chǔ)知識(shí)的路徑 這些教程以書(shū)籍的形式提供,如Java教程,第六版,前往Amazon.com購(gòu)買。 入門 介紹Java技術(shù)和安裝Java開(kāi)發(fā)軟件并使用...
摘要:運(yùn)行環(huán)境,它是程序運(yùn)行的所必需的環(huán)境集合。安裝下一步下一步即可,要記得安裝路徑。配置環(huán)境變量安裝完以后需要對(duì)系統(tǒng)的環(huán)境變量進(jìn)行配置才能開(kāi)發(fā)。之所以不能運(yùn)行是因?yàn)檠b類之后還得配置環(huán)境變量。 在了解了Java歷史、特性、作用和跨平臺(tái)原理之后,我們可以開(kāi)始為Java開(kāi)發(fā)做準(zhǔn)備工作了,只是在此之前我們還需要了解Java的兩大基礎(chǔ)概念JDK(Java Development kit)和JRE(J...
Java技術(shù)現(xiàn)象 關(guān)于Java技術(shù)的討論似乎無(wú)處不在,但究竟是什么呢?下面幾節(jié)將解釋Java技術(shù)如何既是一種編程語(yǔ)言又是一種平臺(tái),并概述該技術(shù)可以為你做什么。 關(guān)于Java技術(shù) Java技術(shù)既是編程語(yǔ)言又是平臺(tái)。 Java編程語(yǔ)言 Java編程語(yǔ)言是一種高級(jí)語(yǔ)言,可以用以下所有流行語(yǔ)來(lái)描述它: 簡(jiǎn)單的 體系結(jié)構(gòu)中立的 面向?qū)ο蟮?輕便的 分布式的 高性能的 多線程 健壯的 動(dòng)態(tài)的 安全的 前面...
PATH和CLASSPATH 本節(jié)介紹如何在Microsoft Windows,Solaris和Linux上使用PATH和CLASSPATH環(huán)境變量,有關(guān)最新信息,請(qǐng)參閱安裝Java Development Kit(JDK)軟件包中隨附的安裝說(shuō)明。 安裝軟件后,JDK目錄將具有如下所示的結(jié)構(gòu)。 showImg(https://segmentfault.com/img/bVbqpb7?w=282&h...
閱讀 1387·2021-09-30 09:55
閱讀 1914·2021-08-27 13:10
閱讀 2260·2019-08-29 17:22
閱讀 1310·2019-08-29 16:30
閱讀 3476·2019-08-26 18:37
閱讀 2362·2019-08-26 11:47
閱讀 1173·2019-08-23 14:44
閱讀 1749·2019-08-23 13:46