- JAR 文件
- Java Resource
- 應用程序的配置
JAR 可以將 Java 應用程序打包,JAR 文件可以包含類文件,也可以包含資源文件. JAR 文件采用 Zip 壓縮格式.JAR 命令:
? Desktop jar cvf sample.jar corejava | iconv -f gbk -t utf-8標明清單(manifest)增加:corejava/(讀入= 0) (寫出= 0)(存儲了 0%)增加:corejava/.DS_Store(讀入= 6148) (寫出= 425)(壓縮了 93%)增加:corejava/inheritance/(讀入= 0) (寫出= 0)(存儲了 0%)增加:corejava/inheritance/ArrayStoreExceptionTest.class(讀入= 787) (寫出= 455)(壓縮了 42%)增加:corejava/inheritance/Base.class(讀入= 651) (寫出= 391)(壓縮了 39%)增加:corejava/inheritance/DynamicBinding.class(讀入= 654) (寫出= 386)(壓縮了 40%)增加:corejava/inheritance/Sub.class(讀入= 546) (寫出= 354)(壓縮了 35%)增加:corejava/inner/(讀入= 0) (寫出= 0)(存儲了 0%)增加:corejava/inner/InnerClassTest.class(讀入= 744) (寫出= 469)(壓縮了 36%)增加:corejava/inner/TalkingClock$TimePRinter.class(讀入= 1315) (寫出= 689)(壓縮了 47%)增加:corejava/inner/TalkingClock.class(讀入= 933) (寫出= 527)(壓縮了 43%)增加:corejava/interfaces/(讀入= 0) (寫出= 0)(存儲了 0%)增加:corejava/interfaces/CloneTest.class(讀入= 1372) (寫出= 757)(壓縮了 44%)增加:corejava/interfaces/Employee.class(讀入= 1867) (寫出= 994)(壓縮了 46%)增加:corejava/interfaces/Employee2.class(讀入= 308) (寫出= 227)(壓縮了 26%)增加:corejava/interfaces/ProxyTest.class(讀入= 1427) (寫出= 819)(壓縮了 42%)增加:corejava/interfaces/SortTest.class(讀入= 599) (寫出= 354)(壓縮了 40%)增加:corejava/interfaces/TimePrinter.class(讀入= 1061) (寫出= 580)(壓縮了 45%)增加:corejava/interfaces/TimerTest.class(讀入= 854) (寫出= 512)(壓縮了 40%)增加:corejava/interfaces/TraceHandler.class(讀入= 1379) (寫出= 762)(壓縮了 44%)增加:corejava/reflection/(讀入= 0) (寫出= 0)(存儲了 0%)增加:corejava/reflection/ArrayGrowTest.class(讀入= 1897) (寫出= 1054)(壓縮了 44%)增加:corejava/reflection/MethodPointerTest.class(讀入= 1869) (寫出= 992)(壓縮了 46%)增加:corejava/reflection/ObjectAnalyzer.class(讀入= 3411) (寫出= 1807)(壓縮了 47%)增加:corejava/reflection/ReflectionTest.class(讀入= 4412) (寫出= 2198)(壓縮了 50%)manifest在生成 JAR 文件時,每個 JAR 文件還包含一個用于描述歸檔特征的清單文件(manifest),名為 MANIFEST.MF,位于 META-INF 子目錄中(META-INF/MANIFEST.MF)。
manifest 結構
Manifest-Version: 1.0描述這個歸檔文件的行Name: Woozle.class描述這個文件的行Name: com/mycompany/mypkg/描述這個包的行可運行 JAR 文件jar cvfe MyProgram.jar corejava.reflection.MethodPointerTest corejava可以指定程序的入口. 在 manifest 會生成:
Manifest-Version: 1.0Created-By: 1.6.0_65 (Apple Inc.)Main-Class: corejava.inheitance.ArrayStoreExceptionTestjava -jar MyProgram.jar 即可運行.
應用程序的資源可以是:
- 圖像和聲音文件.
- 帶有消息字符串和按鈕標簽的文本文件.
- 二進制數據文件.
Java 的資源不同 Windows, Windows 的資源屬于 exe 文件的一部分,通過標準的程序設計訪問;而 Java 資源作為單獨的文件存儲,不是類文件的一部分存儲,對資源的訪問和解釋由每個類自己勝任.
對資源的訪問和解釋由每個類自己勝任.e.g.
package corejava.resource;import javax.swing.*;import java.awt.*;import java.io.InputStream;import java.net.URL;import java.util.Scanner;/** * Created by guolong.fan on 15/4/27. */public class ResourceTest { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { ResourceTestFrame frame = new ResourceTestFrame(); frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }); }}class ResourceTestFrame extends JFrame { public ResourceTestFrame() { setTitle("ResourceTest"); setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); URL aboutURL = getClass().getResource("about.gif"); Image img = Toolkit.getDefaultToolkit().getImage(aboutURL); setIconImage(img); JTextArea textArea = new JTextArea(); InputStream stream = getClass().getResourceAsStream("about.txt"); Scanner in = new Scanner(stream); while (in.hasNext()) { textArea.append(in.nextLine() + "/n"); } add(textArea); } public static final int DEFAULT_WIDTH = 300; public static final int DEFAULT_HEIGHT = 300;}對應用程序進行配置,并且將配置保存起來,當再次運行應用程序時讀取配置。Java 提供了兩種方式:Properties 和 Preference。
put & store & load & get
PropertiesProperty Map: 鍵/值對,通常用于存放配置信息.
package corejava.resource;import javax.swing.*;import java.awt.*;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.util.Properties;/** * Created by guolong.fan on 15/4/27. */public class PropertiesTest { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { PropertiesFrame frame = new PropertiesFrame(); frame.setVisible(true); } }); }}class PropertiesFrame extends JFrame { public PropertiesFrame() { // Properties String userDir = System.getProperty("user.home"); File propertiesDir = new File(userDir, ".corejava"); if (!propertiesDir.exists()) propertiesDir.mkdir(); properitesFile = new File(propertiesDir, "program.properties"); // 設置默認設置 Properties defaultSettings = new Properties(); defaultSettings.put("left", "0"); defaultSettings.put("top", "0"); defaultSettings.put("width", "" + DEFAULT_WIDTH); defaultSettings.put("height", "" + DEFAULT_HEIGHT); defaultSettings.put("title", ""); setting = new Properties(defaultSettings); if (properitesFile.exists()) try { // 如果文件存在,則從文件導入 FileInputStream in = new FileInputStream(properitesFile); setting.load(in); } catch (IOException ex) { ex.printStackTrace(); } int left = Integer.parseInt(setting.getProperty("left")); int top = Integer.parseInt(setting.getProperty("top")); int width = Integer.parseInt(setting.getProperty("width")); int height = Integer.parseInt(setting.getProperty("height")); setBounds(left, top, width, height); String title = setting.getProperty("title"); if (title.equals("")) title = JOptionPane.showInputDialog("Please supply a frame title"); if (title == null) title = ""; setTitle(title); // 關閉 window 時 將當前設置寫入配置文件中 addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent windowEvent) { setting.put("left", "" + getX()); setting.put("top", "" + getY()); setting.put("width", "" + getWidth()); setting.put("height", "" + getHeight()); setting.put("title", getTitle()); try { FileOutputStream out = new FileOutputStream(properitesFile); setting.store(out, "Program Properties"); } catch (IOException e) { e.printStackTrace(); } super.windowClosing(windowEvent); } }); } private File properitesFile; private Properties setting; public static final int DEFAULT_WIDTH = 300; public static final int DEFAULT_HEIGHT = 300;}生成的配置文件:
#Program Properties#Sun May 03 17:11:24 CST 2015height=336width=420left=360top=23title=PropertiesTestput & store & load & get
Properties 類簡化讀取和保存配置. 但是配置文件存放無法放在主目錄中(有些操作系統沒有主目錄的概念); 沒有標準的配置文件命名的規則,導致配置文件名沖突.
Java SE 1.4 提供了 Preferences 類提供一個與平臺無關的中心知識庫.中心知識庫實現是透明,通常 Windows 采用注冊表,而 linux 采用放在本地文件系統中.
Preferences 的中心知識庫采用樹狀結構,每個節點的路徑類似于包名,這樣可以避免命名沖突。每個節點都有一個用來存放 key/value 的獨立表。
為了增加靈活性,系統中有多棵并行的樹。系統樹用來存放全體用戶的公共信息,每個程序的使用者擁有一棵樹。Preferences 類操作的是'當前用戶'的用戶樹。
訪問用戶樹: Preferences root = Preferences.userRoot();訪問系統樹: Preferences root = Preferences.systemRoot();訪問具體節點(通過路徑名): Preferences node = root.node("/com/mycompany/myapp");訪問具體節點(通過包名): Preferences node = Preferences.userNodeForPackage(obj.getClass()); or Preferences node = Preferences.systemNodeForPackage(obj.getClass());
通過節點來 get/put.
String get(String key, String defVal);int getInt(String key, int defVal);... ...put(String key, String value);putInt(String key, int value);... ...采用 xml 格式導入/導出.
void exportSubtree(OutputStream out);void exportNode(OutputStream out);void importPreferences(InputStream in);新聞熱點
疑難解答