Tabla de contenidos
Pretendemos crear una aplicación con la que gestionar una serie de archivos multimedia presentes en nuestro equipo. Con ella vamos a poder almacenar características de estos archivos. Dado que nos vamos a centrar en archivos de audio y de vídeo, habrá características que sean comunes a ambos conjuntos de archivos (nombre de archivo), pero habrá otras que sean propias de un grupo o del otro (dimensiones de la imagen en un vídeo).
Para llevar a cabo el control de errores vamos a definir una clase MultimediaObjectException
, que es una excepción que, cuando se lanza, da lugar a que salga por pantalla el texto:
Incorrect value
MultimediaObject
Aprovechando que hay una serie de características que están presentes en todos los ficheros multimedia vamos a crear una clase padre, llamada MultimediaObject
, que va a contener lo siguiente:
Definición de los atributos name
, para almacenar el nombre del archivo, y minutes
y seconds
, para indicar la duración en minutos y segundos, respectivamente.
Constructor al que se le puedan pasar valores para inicializar todos estos atributos. En el constructor se comprobará que el valor de inicialización de seconds
es mayor o igual que 0 y menor que 60, y que el valor de inicialización de minutes
es mayor o igual a 0. En caso de que no sea así se lanzará una MultimediaObjectException
.
Método printData()
que saque por pantalla los datos referentes a los atributos:
File: name_of_the_file Length: minutes:seconds
A modo de ejemplo:
File: Nothing else matters.mp3 Length: 6:15
Ahora vamos a definir las clases para distinguir entre los ficheros de audio y los de vídeo. Estas clases heredan de la clase MultimediaObject
.
La clase que se encarga de gestionar ficheros de audio, llamada AudioObject
, debe tener:
Definición de atributos bitRate
, frequency
y quality
. Los dos primeros deben almacenar valores enteros mientras que el último será un String que tomará los valores Stereo
o Mono
.
Constructor para inicializar todos los atributos que puede tener un AudioObject
(no sólo los definidos ahora) y que compruebe que la tasa binaria y la frecuencia se inicializan a valores mayores o iguales que 0 y que la calidad es uno de los dos valores permitidos. Si esto no ocurre se lanzará la excepción MultimediaObjectException
.
Método printData()
que invoque el método de la clase padre y saque por pantalla también los atributos propios con el formato:
Bit rate: value in kbps Frequency: value in Hz Quality: value
Al final del apartado 4 tienes un ejemplo de cómo debe ser la salida por pantalla tras la llamada a este método.
La clase VideoObject
, por su parte, incluirá:
Definición de atributos width
, height
y fps
(frames por segundo). Los dos primeros han de ser enteros y el último, float.
Constructor con las mismas características que el de AudioObject
.
Método printData()
que, tras invocar al método de la clase padre, sacará por pantalla los datos referentes al fichero de vídeo con el formato:
Screen size: width x height Frames per second: value
Finalmente vamos a hacer el programa que maneja estos elementos. Este programa estará dentro de una clase llamada MultimediaCollection
. El programa deberá crear dos objetos MultimediaObject
. Uno será un AudioObject
y el otro, un VideoObject
. Las características de estos ficheros son:
AudioObject:
VideoObject:
Una vez creados, se sacará por pantalla la información relativa a ambos. El resultado deberá ser:
File: Nothing else matters.mp3 Length: 6:15 Bit rate: 192 kbps Frequency: 44100 Hz Quality: Estéreo File: Kill Bill Trailer.mpg Length: 3:15 Screen size: 176 x 76 Frames per second: 30.0
El programa deberá manejar las excepciones que se puedan producir, sacando por pantalla el mensaje de error correspondiente. En el tratamiento de excepciones deberá distinguir entre excepciones MultimediaObjectException
y el resto de excepciones.
Los sistemas operativos multitarea actuales permiten la ejecución concurrente (al mismo tiempo) de varios programas a la vez. Para realizarlo el núcleo del sistema operativo dispone de una entidad denominada planificador que, de acuerdo a una serie de características, selecciona un programa como el próximo a ser ejecutado.
Todos los programas que pueden ser ejecutados en un sistema operativo disponen de las siguientes características:
Un identificador de tipo cadena que permite distinguir de forma unívoca un programa de otro.
Una prioridad en la que se basará el planificador para determinar cuál es el próximo programa a ejecutar. Podrá tomar los valores 3, 2, 1. Siendo 3 la prioridad más alta y 1 la más baja.
Tienen la capacidad de poder mostrar en la consola la información sobre su identificador y prioridad.
La clase para representar estos objetos se llamará Program
y contiene los atributos indicados, métodos de acceso a dichos atributos, un constructor que recibe todos los atributos, y el método void print()
referido anteriormente.
Además, existen dos tipos de programas especiales, uno de ellos denominado de tiempo real, que siempre tienen una prioridad muy alta (valor 4) y unos programas que se ejecutan en segundo plano que tienen la prioridad más baja (0). Además, estos programas especializan el comportamiento de mostrar por consola la información de identificador y prioridad, añadiendo el tipo de objeto que son (de tiempo real o de segundo plano).
Se pide programar el conjunto de clases (Program
, RealTimeProgram
, BackgroundProgram
) que definen el comportamiento de los programas según las características descritas anteriormente.
Se quiere definir una clase Scheduler
(planificador) que sea capaz de gestionar programas con prioridad. Esta clase tendrá un atributo que será un array de Program
, donde se almacenarán los programas a gestionar. El constructor de la clase recibe como parámetro el número máximo de programas que el planificador es capaz de gestionar.
Se pide programar un método que sea capaz de almacenar programas ordenados de menor a mayor prioridad: void add(Program program) throws Exception
. Este método lanza una excepción si no se pueden añadir más programa (si el array está lleno).
next()
Programar un método en la clase planificador que devuelva el próximo programa que debe ejecutarse (el de mayor prioridad): Program next() throws Exception
. El método lanzará una excepción si no hay ningún programa que devolver (si el array está vacío).
Nota: Se deja a elección del alumno decidir ante niveles de prioridad iguales qué programa devolver.