El applet que puedes ver más abajo reproduce archivos de música, que han sido empaquetados en un archivo JAR. Para crear el archivo JAR:
jar -cvf sonidos.jar adagio_barber.mid ....[el resto de archivos que se incluyen]
Para visualizar las entradas (archivos) que están en el JAR:
jar -tvf sonidos.jar
El nombre del archivo JAR se le pasa al applet desde la página HTML en la forma de parámetro. En la página HTML se utiliza PARAM para definir el nombre del parámetro y el valor:
<APPLET codebase = "." code = "awt03_musica.applet.class" ... > <PARAM NAME = ARCHIVO_JAR VALUE = "awt03_musica/sonidos/sonidos.jar"> </APPLET>
En el código fuente usamos getParameter(), que devuelve la cadena indicada antes en VALUE:
getParameter("ARCHIVO_JAR")
Se usa este procedimiento para leer el nombre del archivo JAR por razones pedagógicas (así aprendemos a usar la función getParameter) y de su comodidad.
El applet aparece a continuación: En la parte izquierda del applet tenemos la lista de temas musicales. En la parte derecha:
¿Por qué usar archivos JAR? Esencialmente por su capacidad de compresión. Por ejemplo, los archivos MIDI son comprimidos a un 30% de su peso original.
Una nota final: se pueden reproducir otro tipo de archivos. Se ha escogido el formato MIDI porque son las más ligeros (aunque también los de peor calidad). Hemos utilizado las capacidades básicas de reproducción de sonido que había en Java 1.1. En versiones posteriores de Java las capacidades de reproducción y tratamiento de sonidos han mejorado espectacularmente. Para más información ver: java.sun.com
Necesitamos leer los nombres de los archivos musicales contenidos en el fichero JAR. Los leemos para añadirlos a un combo box del applet donde el usuario puede ver la música disponible. Afortunadamente para nosotros el archivo JAR contiene no sólo los archivos de música comprimidos, sino además un listado de los nombres de estos archivos. Estos nombres se denominan "entradas" (entries) del archivo JAR y como veremos son relativamente fáciles de leer.
Para obtener las entradas (entries) del archivo JAR usamos las clases JarFile y JarEntry:
/****** Consigo un JarFile a partir de la URL *****/
URL url = new URL( "jar:"+this.getCodeBase().toString()+getParameter("ARCHIVO_JAR")+"!/");
JarURLConnection conexion = (JarURLConnection) url.openConnection();
JarFile jar = conexion.getJarFile();
La expresión "jar:"+this.getCodeBase().toString()+getParameter("ARCHIVO_JAR")+"!/" es una forma de construir la ruta absoluta del archivo JAR a partir de rutas relativas. Para entender getCodeBase().toString(): nos devuelve la ruta hasta el directorio especificado en la instrucción CODEBASE (codebase = ".") de la página. A continuación podemos ver dos ejemplos de getCodeBase(), en el primero el applet se encuentra en local (protocolo "file") y en el segundo se encuentra en un servidor web remoto (protocolo http):
file:/C:/DOC/Java/awt03_musica/class/ http://personal.telefonica.terra.es/web/rlagob/java/awt03_musica/class/
En nuestro ejemplo, puesto que getParameter("ARCHIVO_JAR") devuelve "awt03_musica/sonidos/sonidos.jar", obtenemos la siguiente cadena completa: "jar:http://personal.telefonica.terra.es/web/rlagob/java/awt03_musica/class/awt03_musica/sonidos/sonidos.jar!/", (observar que termina con "!/"). Ya hemos conseguido la cadena que representa el archivo JAR.
for (Enumeration e = jar.entries() ; e.hasMoreElements() ;) {
entry = (JarEntry) e.nextElement();
....
}
En el siguiente ejemplo puede ver que montamos un bucle (for) para:
JarFile jar = conexion.getJarFile();
/***** Consigo las entradas del JarFile y las añado a la lista ********/
JarEntry entry;
for (Enumeration e = jar.entries() ; e.hasMoreElements() ;) {
entry = (JarEntry) e.nextElement();
// Excluye estas entradas, el resto las añade a la lista
if (!"META-INF/MANIFEST.MF".equals(entry.getName()) && !"META-INF/".equals(entry.getName()) )
lista.add(entry.getName()); // Añadir a la lista
...
}
Tenemos que unir en una cadena (String) dos rutas:
Con estas dos variables podemos construir la URL del tema contenido en el archivo JAR (variable 'url_tema'):
String path_absoluto_jar = protocol + this.getCodeBase().toString()+path_relativo_jar; /****** Construimos la URL del archivo de sonido a partir de: url de jar y nombre de archivo de música **/ URL url_tema = new URL( new URL( path_absoluto_jar), archivo_tema); AudioClip tema = getAudioClip(url_tema); tema.play();
Puedes ver que conseguimos un objeto AudioClip a partir de una llamada a getAudioClip() (método de la clase Applet). El objetivo de reproducir el archivo de audio se consigue llamando al método play.