A.3 Resource BundlesJava 1.1 adds two new pieces to make its property lists more general and flexible. The first is the ability to use localized resource bundles; the second is the use of resource files. Resource bundles let you write internationalized programs. The general idea is that any string you want to display (for example, a button label) shouldn't be specified as a literal constant. Instead, you want to look up the string in a table of equivalents--a "resource bundle"--that contains equivalent strings for different locales. For example, the string "yes" is equivalent to "ja", "si", "oui", and many other language-specific alternatives. A resource bundle lets your program look up the right alternative at run-time, depending on the user's locale. The list of alternatives must be implemented as a subclass of ResourceBundle or ListResourceBundle, in which you provide a key value pair for each label. For each locale you support, a separate subclass and list must be provided. Then you look up the appropriate string through the ResourceBundle.getString() method. A complete example of how to use resource bundles could easily require an entire chapter; I hope this is enough information to get you started.[1]
Resource bundles have one important implication for more mundane programs. Resource bundles can be saved in files and read at run-time. To support them, Java 1.1 has added the ability to load arbitrary properties files. In Example A.1, we looked for the prop.list file on the applet server. What if we want to permit users to modify the default font to be what they want, not what we think they want? With Java 1.0, that could not be done because there was no way for an applet to access the local filesystem. Now, with Java 1.1, you can access read-only resource files located in the CLASSPATH. To do so, you use the Class.getResource() method, which takes the name of a properties list file as an argument. This method returns the URL of the file requested, which could be available locally or on the applet server; where it actually looks depends on the ClassLoader. Once the file is found, treat it as a Properties file, as in Example A.1, or do anything you want with it. A similar method, Class.getResourceAsStream(), returns the InputStream to work with, instead of the URL. Example A.2 is similar to Example A.1. The file prop11.list includes three properties: the font to use, a message, and an image. We need only a single property because we can use the new Font.decode() method to convert a complete font specification into a Font object: we don't need to load the font information in pieces, as we did in the earlier example. As an added bonus, this example displays an image. The name of the image is given by the property MyProg.image. Like the property file itself, the image file can be located anywhere. Here's the properties list, which should be placed in the file prop11.list:
MyProg.font=Helvetica-italic-30 MyProg.message=Hello World MyProg.image=ora-icon.gif And the code for the applet is in Example A.2. Example A.2: Getting Properties from a Resource File
// Java 1.1 only import java.io.*; import java.net.*; import java.awt.*; import java.util.Properties; import java.applet.Applet; public class Prop11 extends Applet { Image im; Font f; String msg; public void paint (Graphics g) { g.setFont (f); if (im != null) g.drawImage (im, 50, 100, this); if (msg != null) g.drawString (msg, 50, 50); } public void init () { InputStream is = getClass().getResourceAsStream("prop11.list"); Properties p = new Properties(); try { p.load (is); f = Font.decode(p.getProperty("MyProg.font")); msg = p.getProperty("MyProg.message"); String name = p.getProperty("MyProg.image"); URL url = getClass().getResource(name); im = getImage (url); } catch (IOException e) { System.out.println ("error loading props..."); } } } |
|