大约10年内,我为IT产业开发了许多JAVA程序,写了很多的相关文章和书,回答了大量有关JAVA的问题,教了无数的学生。虽然我忙于学习、写程序、教学,我依然从中获得了很多的乐趣。
JAVA 娱乐和游戏包含了一些我接触JAVA以来获得的有趣的东西。每一个部分对应一个特殊的我认为是有趣的主题和一个或者多个我相应开发的JAVA程序。在你浏览的过程中,你将会遇到类似拖动跳棋棋盘上的棋子来产生经典的3D粒子系统这样的主题,我希望你会喜欢。
由于我很喜欢电脑游戏,在这里我会着重介绍它。
在展现我个人的娱乐主题之前,我想先让你看看对你来说更为重要的东西。提出一个你想知道的主题,我会尽量满足你。
惯例操作
在每一个小部分我会以JAVA applets的形式展现那些程序(我对于应用程序没有反感,仅仅是想把大家的注意集中到applets上来)。我使用J2SE1.4来编译(通过javac)applets的代码并且用appletviewer来运行。
在多数情况下,我不会用网页浏览器来运行applets。如果你想这样做,确定你的浏览器支持J2SE1.4(或更新的版本)。举例来说,如果你用的是IE6.0,那么将选项里的“将JRE1.4.0用于<applet>那个复选框勾上。这样,IE会用JAVA Plug-in 1.4(或更高版本)代替它的Internet 虚拟机来处理<applet>标签。
如果你不能通过网页浏览器访问Java Plug-in,你需要创建一个JAVA1.x的类文件(假设源代码不包括比1.x更新的元素,并且假设你的虚拟机不能识别比1.x版本更新的类文件)。可以用以下的方法编译源文件:
javac -target 1.1 ClassName.java
在以上的命令行中,-target 1.1告诉javac创建一个java1.1的文件(在大多数虚拟机上可以识别)。当然,ClassName.java 仅仅是一个用于放置applet的源文件的容器。
摆脱束缚
有些applets需要访问文件系统(例如存档读档),而虚拟机的管理者禁止此类事件。有两种办法可以解决,一种用于appletviewer,另一种用于网页浏览器。在讨论这两种技术之前,我们来看一看Listing 1's FileIO.java的源代码:
Listing 1. FileIO.java
// FileIO.java
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class FileIO extends java.applet.Applet
{
private static String FILENAME = "stats.dat";
private String name;
private int score;
public void init ()
{
// 创建文本框组件
final TextArea taStatus = new TextArea (10, 40);
// 创建用放按钮的面板
Panel p = new Panel ();
//创建读档按钮
Button btnLoad = new Button ("Load game stats");
// 建立读文件的事件侦听器
btnLoad.addActionListener (new ActionListener ()
{
public void actionPerformed (ActionEvent e)
{
DataInputStream dis = null;
try
{
FileInputStream fis;
fis = new FileInputStream
(File.separator +FILENAME);
dis = new DataInputStream (fis);
name = dis.readUTF ();
score = dis.readInt ();
taStatus.setText ("name = " + name + ", " + "hi score = " + score);
}
catch (IOException e2)
{
taStatus.setText (e2.toString ());
}
finally
{
if (dis != null)
try
{
dis.close ();
}
catch (IOException e2)
{
taStatus.setText (e2.toString ());
}
}
}
});
//把读档按钮加到面板中去
p.add (btnLoad);
// 创建存档按钮
Button btnSave = new Button ("Save game stats");
// 创建存档事件侦听器
Save.addActionListener (new ActionListener ()
{
public void actionPerformed (ActionEvent e)
{
DataOutputStream dos = null;
try
{
FileOutputStream fos;
fos = new FileOutputStream
(File.separator + FILENAME);
dos = new DataOutputStream (fos);
dos.writeUTF ("John Doe");
dos.writeInt (50000);
taStatus.setText ("Name and " + "score saved");
}
catch (IOException e2)
{
taStatus.setText (e2.toString ());
}
finally
{
if (dos != null)
try
{
dos.close ();
}
catch (IOException e2)
{
taStatus.setText (e2.toString ());
}
}
}
});
// 把存档按钮加到面板上
add (btnSave);
// 设置applet的设计为BorderLayout
setLayout (new BorderLayout ());
// 在applet的北部添加按钮面板
add (p, BorderLayout.NORTH);
// 把状态文本框放到applet南面
add (taStatus, BorderLayout.SOUTH);
}
}
Listing 1 描述了一个简单的在applet环境中文件I/O 的范例。 当用户点击存档按钮的时候,applet将姓名和得分保存到数据文件中去。如果点击读档按钮,applet 将先前保存的数据从数据文件中读出。任意点击一个按钮,在下面的状态文本框中会显示相应信息。用下面的方式编译它:
javac FileIO.java
在成功编译后, 你将得到三个类文件: FileIO.class, FileIO$1.class, and FileIO$2.class. 在你运行FileIO.class之前 (主要的类), 你需要一个带<applet>标签的HTML文件。为了避免你创建HTML的烦恼,我准备了 FileIO.html:
Listing 2. FileIO.html
<applet code=FileIO.class width=250 height=250>
</applet>
Policy 文件
用appletviewer FileIO.html执行 FileIO.class。applet开始运行了。试试按下存档和读档按钮,你将注意到一个安全的异常: 试图读或写文件违背了applet的默认的安全策略。 为了防止异常的产生, 首先创建一个策略文件给予所有的许可。 Listing 3的 my.policy 文件做的就是这个:
Listing 3. my.policy
grant
{
permission java.security.AllPermission;
};
现在让虚拟机在运行appletviewer的时候识别这个特定的策略文件。接下来这一行命令完成了这个任务:
appletviewer -J-Djava.security.policy=my.policy FileIO.html
如果一切正常你会看到如图1所示的内容
图1:从数据文件中读出先前存入的数据
|
警告: |
|
给予applet所有许可权限是一件很严重的事,除非你自己或者值得信任的朋友创建了这样的applet,不然这样做是不是一件好事。 |
注册JAR文件
使用策略文件的方法并不适用于网页浏览器,在你用它执行FileIO之前,你首先要将applet的类文件保存到一个jar文件中去。
注册一个jar文件需要一个证书。当然如果你要发布一个商业的applet你可以去买一个,在这里我将告诉你如何创建一个免费的自己注册的证书(你只能用于测试)。完成以下几步:
1:创建jar文件:运行 jar cvf FileIO.jar *.class,你会得到一个FileIO.jar 。2:在键库中创建一个新的键: 运行keytool -genkey -keystore myKeyStore -alias me, "me" 可以任意定义。它提醒你这个证书是你自己注册的,所以你不要一不小心把它放到产品中去。
在这个例子中keytool 提供给你关于这个新键值的相关信息:它要求你提供保护键库的密码,然后它会要求你的姓名、部门、单位、城市、地区和国家。这些信息将会保存到新的键库文件—myKeyStore中去。
3:用键库创建一个自己注册的测试证书:运行keytool -selfcert -alias me -keystore myKeyStore。在提交时输入密码。
4:用测试证书注册jar文件:运行jarsigner -keystore myKeyStore FileIO.jar me。在提交时输入密码。
The jarsigner 程序更新jar文件的 META-INF 目录来产生证书信息和访问存档文件的数字签名。如果成功,你会得到一个注册了的FileIO.jar 文件。
|
注意: |
|
我推荐在学习到这里的时候看一看J2SE文档中有关工具的部分来更好的学习jar, keytool, and jarsigner。 |
在运行applet之前,创建一个applet标签含有jar文件属性的HTML文件。 Listing 4的 FileIO2.html 做的不错。
Listing 4. FileIO2.html
<applet archive=FileIO.jar code=FileIO.class width=250 height=250>
</applet>
到了执行applet的时候了。假设FileIO.jar 和 FileIO2.html 在一台Windows电脑的 c:\temp 目录下,打开浏览器在地址栏输入c:\temp\FileIO2.html。过一会,会跳出一个对话框,如图2所示,提出一个安全警告并要求你给予运行的许可。
图2
点击许可这个或者点一直许可来运行,如果你是一个谨慎的人,你可以查看证书来得到这个你先前创建的证书的细节。图3显示了在火狐浏览器中运行的applet。
图3,相对appletviewer的网页浏览器
回顾:
准备进入我的基于JAVA的娱乐世界,每一个Java Fun and Games的部分都对应一个我觉得有趣的主题,并且有一些JAVA程序发布。这些程序以applet的形式运行,其中有一部分需要访问文件系统,例如读写。因为访问文件系统在虚拟机的安全管理是禁止的,所以要用策略文件或者注册的jar文件的方法。在用appletviewer的时候用策略文件,用浏览器的话用jar文件。
下次,我会展现如何在跳棋棋盘上拖棋子。
关于作者
Jeff Friesen 是一个开源软件开发者和在C, C++, 还有Java技术方面的教育工作者
下载源代码