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