本章重点:

  • JAR 文件
  • Java Resource
  • 应用程序的配置

JAR 文件

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.0
Created-By: 1.6.0_65 (Apple Inc.)
Main-Class: corejava.inheitance.ArrayStoreExceptionTest

java -jar MyProgram.jar 即可运行.

Java Resource

应用程序的资源可以是:

  • 图像和声音文件.
  • 带有消息字符串和按钮标签的文本文件.
  • 二进制数据文件.

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() {@Overridepublic 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

Properties

Property 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() {@Overridepublic void run() {PropertiesFrame frame = new PropertiesFrame();frame.setVisible(true);}});}
}class PropertiesFrame extends JFrame {public PropertiesFrame() {// PropertiesString 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() {@Overridepublic 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 2015
height=336
width=420
left=360
top=23
title=PropertiesTest

put & store & load & get

  1. setting.load(in);
  2. setting.put(xx, xx);
  3. setting.store(out, "Program Properties");
  4. setting.getProperty("left");

Prefrences

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);

转载于:https://www.cnblogs.com/nil2inf/p/4474341.html

Core Java笔记 6.部署应用程序相关推荐

  1. 【java笔记】TCP通信程序

    [java笔记]网络编程概述_m0_52043808的博客-CSDN博客 TCP通信能实现两台计算机之间的数据交互,通信的两端,严格区分客户端(Client)和服务端(Server) 两端通信时步骤: ...

  2. Core Java笔记 2.继承

    本章重点: 继承 多态与动态绑定 Object类 对象包装器&自动打包 继承 涉及到的概念: 超类(superclass).子类(subclass) extends关键字 super关键字 多 ...

  3. Core Java笔记------来自达内项目经理穆笛

      前言 1 一·基础知识 二·定义,关键字和类型 三·表达式和控制流 四·数组 五·对象和类 六·高级语言特性 七·异常 八·图形用户接口 九·AWT(Abstract Window Toolkit ...

  4. java笔记--重定向输出流实现程序输出到日志

    重定向输出流实现程序输出到日志 --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3877248.html "谢谢-- 利用Sy ...

  5. 【java笔记】网络编程概述

    [java笔记]TCP通信程序_m0_52043808的博客-CSDN博客 [java笔记]网络编程:文件上传案例_m0_52043808的博客-CSDN博客 网络编程: 在一定协议下,实现两台计算机 ...

  6. 【Java笔记+踩坑】SpringBoot基础3——开发。热部署+配置高级+整合NoSQL/缓存/任务/邮件/监控

      导航: [黑马Java笔记+踩坑汇总]JavaSE+JavaWeb+SSM+SpringBoot+瑞吉外卖+SpringCloud/SpringCloudAlibaba+黑马旅游+谷粒商城 目录 ...

  7. [读书笔记]Core Java: Volume I - Fundamentals Chapter 8

    Title: Core Java - Volume I Fundamentals Edition: Eleventh Edition Author: Cay S. Horstmann 读书笔记:对原书 ...

  8. Core Java 8 读书笔记-Networking编程

    Core Java 8 读书笔记-Networking编程 作者:老九-技术大黍 原文:Core Java 8th Edition 社交:知乎 公众号:老九学堂(新人有惊喜) 特别声明:原创不易,未经 ...

  9. Core Java For The Impatient-阅读笔记1.基本的编程结构

    Core Java For The Impatient 1.基本的编程结构 1.Key Points 在Java,所有的方法必须在类声明.非静态方法只能在所属类的对象上调用. 静态方法不是通过对象调用 ...

最新文章

  1. 学好web前端开发要注意哪些问题
  2. 广东省哈工大(深圳)赛区赛事活动安排
  3. 求 1 到 n 的所有数的约数和
  4. XML Web Service 安全性
  5. 深藏不露,挖掘4种大脑网络中的管理工具
  6. linux基础-第十六单元 yum管理RPM包
  7. 关于keil c51与keil mdk同时安装、合并解决办法
  8. 06向量及其坐标表示、向量的方向角与方向余弦、向量组共线与共面的条件、向量的加法与数乘运算、向量组的线性组合、二维向量的基向量分解、三维向量的基向量分解、用坐标做向量的数乘
  9. java编写一个测试类_java写一个类,并测试它
  10. 4月13日调整人人商城小程序用户登录灰头像,getUserProfile小程序登录接口适配比较简单的方法
  11. windows上pip安装及使用详解
  12. 假设有一个英文文本文件,编写一个程序读取其内容并将里面的大写字母变成小写字母,小写字母变成大写字母
  13. CD-ROM是指啥?
  14. 海康威视视频ocx控件开发总结
  15. 计算机磁盘清理软件,清理磁盘空间的7种技巧,电脑装机、安装系统必备
  16. 加班调休被拒的程序员,怒怼996是行规的HR,你的996真的值吗?
  17. 学网络安全需要什么基础?
  18. PCI总线及发展历程(详细)总结
  19. 一个程序员的时间管理(GTD)
  20. JAVA2d用于,创建用于翻转效果的 Java2D 合成

热门文章

  1. 父框架与子框架的互操作
  2. 值班问题:insert语句插入了两条数据?
  3. HDU 4930 Fighting the Landlords(扯淡模拟题)
  4. HttpOperater
  5. 对pthread_cond_wait()函数的理解
  6. MySQL(11)数据库实现高可用架构之MMM
  7. 评职称不需英语计算机的文件,《关于重申专业技术人员职称评定、职务聘任必须坚持外语、计算机条件的通知》……...
  8. 用python给女朋友惊喜100天快乐_100天从 Python 小白到大神最良心的学习资源!
  9. python 删除文件、目录_python脚本删除文件及删除文件目录的方法
  10. 小白的markdown基础语法总结