Mostrando entradas con la etiqueta java. Mostrar todas las entradas
Mostrando entradas con la etiqueta java. Mostrar todas las entradas

domingo, 12 de mayo de 2013

Sound in Java

Ver en Español



For placing sound to our java desktop Application, we have at our disposal multiple alternatives, however I have done a simple class for that endeavor, which has served me for many projects.

The Class is the next:


public class soundthread extends Thread{
        
           
            private Clip sound;
            private boolean continuex;
            
        

         public soundthread(String filepath){
           
            continuex=true;
            try {
                sound = AudioSystem.getClip();
                sound.open(AudioSystem.getAudioInputStream(new File(filepath)));
                
            } catch (UnsupportedAudioFileException ex) {
              
                Logger.getLogger(soundthread.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
               
                Logger.getLogger(soundthread.class.getName()).log(Level.SEVERE, null, ex);
            } catch (LineUnavailableException ex) {
               
                Logger.getLogger(soundthread.class.getName()).log(Level.SEVERE, null, ex);
            }
         }
         
        @Override
         public void run(){
              
            sound.start();
              
            
            // Wait while it is playing
            do{
                try {
                Thread.sleep(500);
                } catch (InterruptedException ex) {
                Logger.getLogger(soundthread.class.getName()).log(Level.SEVERE, null, ex);
                }
                
            }while (continuex && sound.isActive());
            
            if(sound.isActive()){
                sound.stop();
            }
            
            // Close the clip.

            sound.close();
          
         
         }
        
        public void stop(){
            continuex=false;
        }
         
     }  



For use this class, we should only do something similar or equal to the following:



//...


// Example of path in Windows: C:\path\audio_file.wav
// Example of path in Linux: /home/user/audio_file.wav

soundthread obj = new soundthread("/home/user/audio_file.wav");
obj.start();

//...




Sonido en Java

See in English



Para colocar sonido a nuestra aplicación de escritorio en java, tenemos a nuestra disposición varias alternativas, sin embargo yo he hecho una clase sencilla para esa labor, la cual me ha servido para muchos proyectos.

Dicha clase es la siguiente:


  public class hiloSonido extends Thread{
        
           
            private Clip sonido;
            private boolean seguir;
            
        

         public hiloSonido(String rutaArchivo){
           
            seguir=true;
            try {
                sonido = AudioSystem.getClip();
                sonido.open(AudioSystem.getAudioInputStream(new File(rutaArchivo)));
                
            } catch (UnsupportedAudioFileException ex) {
              
                Logger.getLogger(ReproduceSonido.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
               
                Logger.getLogger(ReproduceSonido.class.getName()).log(Level.SEVERE, null, ex);
            } catch (LineUnavailableException ex) {
               
                Logger.getLogger(ReproduceSonido.class.getName()).log(Level.SEVERE, null, ex);
            }
         }
         
        @Override
         public void run(){
              
            sonido.start();
              
            // Espera mientras se esté reproduciendo.
            do{
                try {
                Thread.sleep(500);
                } catch (InterruptedException ex) {
                Logger.getLogger(ReproduceSonido.class.getName()).log(Level.SEVERE, null, ex);
                }
                
            }while (seguir && sonido.isActive());
            
            if(sonido.isActive()){
                sonido.stop();
            }
            
            // Se cierra el clip.
            sonido.close();
          
         
         }
        
        public void parar(){
            seguir=false;
        }
         
     }  



Para utilizar esta clase solo debemos hacer algo similar o igual a lo siguiente:


//...


// Ejemplo de ruta en Windows: C:\ruta\archivo_de_audio.wav
// Ejemplo de ruta en Linux: /home/usuario/archivo_de_audio.wav

hiloSonido obj = new hiloSonido("/home/usuario/archivo_de_audio.wav");
obj.start();

//...




domingo, 29 de enero de 2012

Clase Scanner en Java

La clase Scanner nos facilita mucho la tarea de obtención de datos desde diferentes fuentes.


Obtener datos desde el teclado

Una de las utilidades de la clase Scanner es la obtención de datos tecleados finalizando con un "enter".

Ejemplo:

import java.util.Scanner; // se importa la clase Scanner



 class Ejemplo {

 
 public static void main(String arg[]){
  
  String variableString;
  
  Scanner entrada=new Scanner(System.in);// se declara e inicializa una instancia  de la clase Scanner.
  
  System.out.print("Ingrese un texto: ");
  
  variableString = entrada.next();
  
  System.out.println("Texto ingresado: "+variableString);
  
 }
 
}


En el código anterior se importa la clase Scanner, posteriormente se declara una instancia de la misma llamada "entrada" y se inicializa pasando como parámetro un objeto InputStream ,
el cual es devuelto por la clase System con ayuda de su método in. Luego vemos como se imprime el aviso correspondiente del tipo de datos que se va a pedir y se guarda todo lo que se digíte en la variable "variableString", hasta que se teclee un enter.
Y todo se logra por medio del objeto Scanner llamado "entrada" y su método next().

De igual manera un objeto Scanner ofrece otros métodos que permiten recibir diferentes tipos:

import java.util.Scanner;



 class Ejemplo {

 
 public static void main(String arg[]){
  
  int variableEntero;
  float variableFloat;
  
  
  Scanner entrada=new Scanner(System.in);
  
  System.out.print("Ingrese un entero: ");
  
  variableEntero = entrada.nextInt();
  
  System.out.println("Entero ingresado: "+variableEntero);
  
  System.out.print("Ingrese un float: ");
  
  variableFloat = entrada.nextFloat();
  
  System.out.println("float ingresado: "+variableFloat);
  
 }
 
}





Obtener datos desde un archivo



La forma de obtener el contenido de un archivo con la clase Scanner es sin duda muy limpia, lo que cambia son los parámetros que se pasan al constructor, esta vez sera un objeto File:

    Scanner entrada=new Scanner(System.in);
    long numero=-1;
  
    try
    {
         entrada = new Scanner(new File("ruta_a_miArchivo/miArchivo"));

         while (entrada.hasNextLong()) 
         {
            numero = entrada.nextLong();
         }
        
        entrada.close();        
    
    } 
    catch (FileNotFoundException e)
    {
        e.printStackTrace();
    }
       
   System.out.println(" numero: "+numero);




En el código anterior se accede al contenido del archivo "miArchivo", el cual es un número desconocido.
El bloque try captura la excepción resultante en caso de que no exista dicho archivo,
y el while se encarga de asignar el contenido del archivo a la variable "numero", pero solo si ese archivo no esta vacío, es decir evita una excepción del tipo "NoSuchElementException".
Cabe aclarar que si el archivo tiene extensión como por ejemplo .txt , esta también se debe especificar en la ruta.



Ahora, en caso de nuestro archivo de ejemplo "miArchivo" tuviese varias lineas, como por ejemplo:

nombre: stivenson
lugar: Cúcuta Colombia
telefono: 256254

entonces, se podría utilizar los métodos nextLine y hasNextine, de la siguiente manera:

   
           
       Scanner entrada=new Scanner(System.in);
       String[] datos=new String[3];
       int indiceVector=0;
    
 try 
 {
    entrada = new Scanner(new File( "ruta_a_miArchivo/miArchivo"));

    while (entrada.hasNextLine()) 
    {
       datos[indiceVector++] = entrada.nextLine();
    }

    entrada.close();

 } 
 catch (FileNotFoundException e)
        {
    e.printStackTrace();
        }
       
       
 for(int i = 0 ; i < 3 ; i++ )
 {
    System.out.println(datos[i]);  
 }
       
       


En el código anterior se guarda cada una de las lineas del archivo en las posiciones del vector "datos" que posteriormente se imprimen en un for.


Y aquí no acaba todo, en el siguiente ejemplo vamos a obtener datos pero especificando un delimitador, supongamos que ahora nuestro archivo "miArchivo" tiene este contenido:

cantidad: 26565 cantidad: 3262625 cantidad: 2x10^4 cantidad: 121400001


y supongamos que solo queremos traer los números, para ello vamos a fijar delimitadores, algo que es posible y sin duda muy útil:

   Scanner entrada=new Scanner(System.in);
   String[] datos=new String[4];
   int indiceVector=0;
    
  try 
  {
   entrada =
   new Scanner(new File("ruta_a_miArchivo/miArchivo"))
   .useDelimiter("\\s*cantidad:\\s*");

 while (entrada.hasNext()) 
 {
     datos[indiceVector++] = entrada.next();
 }

   entrada.close();
  }
  catch (FileNotFoundException e)
  {
   e.printStackTrace();
  }
       
    
  for(int i = 0 ; i < 4 ; i++ )
  {
   System.out.println(datos[i]);  
  }
       
       


En el código anterior se obtienen los cuatro números del archivo y cada uno de estos se almacena en una posición del vector. Al delimitador (método useDelimiter) se le da como parámetro: "\\s*cantidad:\\s*".
Este parametro indica muchas cosas, primero están los signos "\\s*" los cuales indican que el delimitador puede empezar con cero o muchos espacios después se indica que va a estar seguido de la palabra "cantidad:" que a su vez va a estar seguida por cero o muchos espacios.

El carácter "\s" indica que se imprima un espacio, pero nosotros no queremos imprimir solo indicar, por eso le antecedemos el otro contraes-las: "\\s"; El signo "*" es el que indica que pueden haber cero o muchos de esos espacios, si tuviéramos que tratar con archivos de varias lineas, entonces sin duda tendríamos que trabajar con: "\n" en nuestros delimitadores.
En fin, el código anterior después de su ejecución imprime lo siguiente:

26565
3262625
2x10^4
12140001


Como se puede observar el delimitador nos ayuda a omitir ciertas partes del contenido que tengan un patrón en especifico, es decir fijar un separador.


Pero que sucede si no queremos guardar estos cuatro números en un vector String, y queremos hacerlo en variables con su respectivo tipo?, entonces trabajaríamos de la siguiente manera:

        

        Scanner entrada=new Scanner(System.in);
        int cantidad1=0;
        int cantidad2=0;
        String cantidad3="";//para guardar el número en notación científica.
        String cantidad4="";//el ultimo debe ser siempre String
   
    
 try 
 {

          entrada =
          new Scanner(new File( "ruta_a_miArchivo/miArchivo"))
          .useDelimiter("\\s*cantidad:\\s*");
   
   cantidad1=entrada.nextInt();
   
   cantidad2=entrada.nextInt();
   
   cantidad3=entrada.next(); //se espera número en notación científica.
   
   cantidad4=entrada.next();// el ultimo dato del archivo siempre se debe obtener como String
   
   entrada.close();

 } 
 catch (FileNotFoundException e)
 {
    e.printStackTrace();
 }
       
        System.out.println(cantidad1);  
        System.out.println(cantidad2);
        System.out.println(cantidad3);
        System.out.println(cantidad4);


En el código anterior cada vez que se ejecuta el método nextInt o next se avanza en la obtención de los datos y lógicamente estas instrucciones deben estar en el mismo orden a como llegan los datos que provienen del archivo;
Para el caso del ejemplo se obtienen primero dos números(con nextInt) pues son los primeros en llegar desde el archivo, luego un String (con next) y finalmente se espera otro número el cual se obtiene como un String por ser lo ultimo que se encuentra en el archivo y así evitar una excepción "InputMismatchException",
para remediar este ultimo detalle faltaría hacer una conversión después de la obtención u procurar que este ultimo dato siempre sea string.


Obtener datos desde una variable String

Igualmente a un objeto Scanner se le podría pasar una variable String en vez de un archivo:

                  

    Scanner entrada=new Scanner(System.in);

    float cantidad1=0.0f;

    int cantidad2=0;

    String cantidad3="";

    String cantidad4="";
    
    String texto="cantidad: 45,14 cantidad: 3262625 cantidad: 2x10^4 cantidad: cuatro ";//float con coma


       
    entrada = new Scanner(texto).useDelimiter("\\s*cantidad:\\s*");
   
   
   
    cantidad1=entrada.nextFloat();
   
    cantidad2=entrada.nextInt();
   
    cantidad3=entrada.next(); 
   
    cantidad4=entrada.next();
   
    entrada.close();
    
       
    System.out.println(cantidad1);  
    System.out.println(cantidad2);
    System.out.println(cantidad3);
    System.out.println(cantidad4);




Especificar una base para un número dado

Otra utilidad interenzante tiene que ver con los números, algunos métodos aceptan un parámetro numérico correspondiente a la base con la que se quiere manejar un número y de cierta manera no estar siempre con los decimales, ejemplo:

  Scanner entrada=new Scanner(System.in);    
  
  
System.out.print("Ingrese un octal: ");
 
//se espera un número en base 8 es decir caracteres del 0 al 7  
int numero = entrada.nextInt(8); 

System.out.println("el número octal ingresado, en decimal es: "+numero);
   
 

  
System.out.print("Ingrese un hexadecimal: ");
      
//se espera un número en base 16 es decir caracteres del 0 al 9 y/o A a la F
numero = entrada.nextInt(16); 

System.out.println("el número hexadecimal ingresado, en decimal es: "+numero);
   
 


  
System.out.print("Ingrese un binario: ");
       
//se espera un número en base 2 es decir solo caracteres 0 y 1
numero = entrada.nextInt(2); 

System.out.println("el número binario ingresado, en decimal es: "+numero);




En código anterior se aprecia la forma como se especifica la base, y la inmediata conversión que se hace automáticamente a decimal después de recibir el número por teclado.
si se ingresan caracteres que no corresponden a los caracteres de la base que se espera, entonces se producirá una excepción "InputMismatchException".

mas información: API Scanner Java 7

miércoles, 14 de diciembre de 2011

Estructuras básicas de programación: switch

La estructura "switch", esta hecha para propósitos similares al del "if", mas no iguales. Esta estructura se utiliza para especificar varios casos, en los cuales habrá diferentes instrucciones. Solo se ejecutarán las instrucciones del caso que se cumpla.

La estructura "switch", esta constituida por las siguientes lineas de código o sentencias:

switch(v)
{
    case 1:
    //código que se ejecuta si el valor de "v" es 1
    break; 
    case 2:
    //código que se ejecuta si el valor de "v" es 2
    break;  
    case 3:
    //código que se ejecuta si el valor de "v" es 3
    break; 
    default:
    //código que se ejecuta si el valor de "v" no es ninguno de las anteriores casos.
    break; 
}
En donde "v" puede ser cualquier variable que devuelva un valor de cualquier tipo numérico o "char" y ahora desde Java 7 también se puede agregar valores o variables de tipo "String".

Las llaves que se encuentran debajo del "switch", agrupan todos los casos.

la palabra reservada "break" se coloca para dar la orden de que se salte el resto de casos, pues de lo contrario se ejecutarían también los casos que están debajo del que se ejecuto inicialmente.

La palabra reservada "default", se utiliza para especificar lo que se ejecutará si los casos anteriores no suceden. Dicho de otra manera en "default" esta contemplado todo lo que se ejecuta con el resto de casos posibles. ejemplo:

int variable=3;
int variable2;

switch(variable)
{

    case 1:
    variable2=5;   
    break;
    case 2:
    variable2=20;
    break;
    case 3:
    variable2=30;
    break;
    case 4:
    variable2=10;
    break;
    default:
    variable2=100;
    break; 

}


Después de ejecutar el código anterior, la variable "variable2" tendrá el valor de 30.

Cabe resaltar que mientras el "if" puede ejecutar instrucciones bajo una condición que en muchos casos involucra un rango completo de valores, el "switch" especifica la ejecución de código bajo la condición de que se de un valor en concreto, y no el de un rango completo.

Lo anterior es esencial para entender cuando debemos usar el "switch" en vez de el "if".

Otro ejemplo de utilización de "switch", esta vez con una variable "char":

char variable='a';

int variable2;

switch(variable){

    case 'c':
    variable2=5;   
    break;
    case 'a':
    variable2=20;
  
    case 'v':
    variable2=30;
   
    case 'k':
    variable2=10;
    break;
    default:
    variable2=100;
    break; 

}


En el código anterior, la variable "variable2" queda con el valor de 10, y no con 20, pues se ha olvidado colocar el "break", del "caso a" y del "caso v".
Omitir el "break", puede ser beneficio, todo depente de la lógica del problema a solucionar, un ejemplo de esto puede ser el código que encontré en laurel.datsi.fi.upm.es, el cual consiste en imprimir el nombre de una vocal dada. Adecuado a Java ese código podría quedar de la siguiente manera:


String nombreVocal="";
char letra='e';

switch(letra)
{
        case 'a': 
        case 'A': 
                nombreVocal="Es la vocal a";
                break;
        case 'e': 
        case 'E': 
                nombreVocal="Es la vocal e";
                break;
        case 'i': 
        case 'I':  
                nombreVocal="Es la vocal i";
                break;
        case 'o': 
        case 'O': 
                nombreVocal="Es la vocal o";
                break;
        case 'u': 
        case 'U': 
                nombreVocal="Es la vocal u";
                break;
        default: 
               
                nombreVocal="No es ninguna vocal"; 
}


En el código anterior se ve como la ausencia del "break", le permite al "switch", colocar en la variable "nombreVocal", el correspondiente resultado, sin importar si la vocal esta en mayúscula o minúscula.

También se aprecia la ausencia del "break" después de las instrucciones de "default", algo que se puede hacer sin ningún problema, debido a que si se coloca la instrucción "break", no tendría casos para saltar u omitir.

También es posible anidar "switch", ejemplo:


String nombre="";
char letra='e';

switch(letra)
{
        case 'a': 
        case 'A': 
                nombre="Es la vocal a";
                break;
        case 'e': 
        case 'E': 
                nombre="Es la vocal e";
                break;
        case 'i': 
        case 'I':  
                nombre="Es la vocal i";
                break;
        case 'o': 
        case 'O': 
                nombre="Es la vocal o";
                break;
        case 'u': 
        case 'U': 
                nombre="Es la vocal u";
                break;
        default: 
               
                switch(letra)
                {
                 case 'a':
                         nombre="Es la consonante a";
                         break;
                 case 'b':
                         nombre="Es la consonante b";
                         break;      
                 case 'c':  
                         nombre="Es la consonante c";
                                  
                }
                 
}


En el código anterior se aprecia que aparte de poderse anidar, también se puede prescindir de "default". Otro ejemplo, ahora con un String, en donde obligatoriamente tenemos que estar trabajando con Java 7:


int variable2=0;
String palabra="casa";

switch(palabra)
{
        case "casa": 
                    variable2 = 6; 
                    break; 
        case "carro": 
                    variable2 = 5; 
                    break;        
        case "TV":
                    variable2 = 4; 
                    break; 
}


Después de ejecutar el código anterior, la variable "variable2" quedará con el valor 6.

Un ejemplo sencillo puede ser el siguiente, en donde se quiere colocar exigencias a un nombre dado, y priorizar en algunas de estas exigencias, para luego entrar a validar otras de manera segura:

String nombre="maria";

  switch(nombre.length())//obtengo la cantidad de caracteres con ayuda de el método .length()
  {
                    case 1:
                        System.out.println("debe especificar un nombre mas largo"); 
                        break;
                    case 0:
                        System.out.println("debe especificar un nombre"); 
                        break;    
                    default:
     //obtengo el caracter de la posicion especificada con ayuda de el método .charAt()
     // si se ejecuta a .charAt() sobre una cadena vacía, se generará un error, pero el primer "switch" se encarga 
     // de que eso no suceda.
                        switch(nombre.charAt(0))
                        {
                            case '#':
                            System.out.println("el nombre no puede comenzar por #");
                            break;
                            case '0':
                            System.out.println("el nombre no puede comenzar por 0");
                            break;    
                            default:
                                 switch(nombre.charAt(nombre.length()-1))
                                {
                                 case '#':
                                System.out.println("el nombre no puede terminar por #");
                                break;
                                case '&':
                                System.out.println("el nombre no puede terminar por &");
                                break;    
                                default:
                                   System.out.println("el nombre cumple con las exijencias !");   
                                }
                                
                        }
                        
                        
  }

Estructuras básicas de programación: If

Cuando se halla asimilado el comportamiento y por ende la utilidad de las estructuras básicas de programación, podremos esta seguros de que nos irá muy buen en todo esto proceso de aprendizaje sin importar el lenguaje que estemos aprendiendo.

A pesar de que esta explicación va a hacer con lenguaje Java, dichas estructuras son similares en muchos lenguajes de programación.

La estructura "if", se utiliza para especificar instrucciones que solo se ejecutarán si se cumple una condición. Opcionalmente se puede especificar instrucciones que solo se ejecutarán si no se cumple esta condición.

La estructura "if", esta constituida por las siguientes lineas de código o sentencias:

 

if(condición)
{
    // ejecutar este código si se cumple la condición
}
else
{
    // ejecutar este código si No se cumple la condición
}
En donde "condición" puede ser cualquier instrucción que devuelva un valor booleano, es decir "true o false" que en español son verdadero o falso .
Las llaves que se encuentran debajo del "if", agrupan el código que se ejecutará si la condición devuelve "true", a su vez las llaves que se encuentran debajo de "else", agrupan el código que se ejecutará si la condición devuelve "false" o en otras palabras si la condición no se cumple. ejemplo:

int variable=6;
int variable2;

if(5 < variable)
{
    variable2=4;
}
else
{
    variable2=3;
}

Después de ejecutar el código anterior, la variable "variable2" tendrá el valor de 4. Como se ha dicho, la parte del "else" solo es opcional:
int variable=6;
int variable2;

if(5 < variable)
{
    variable2=4;
}



Después de ejecutar el código anterior, la variable "variable2" también quedará con el valor de 4. También es posible anidarlos, ejemplo:

int variable=1;

int variable2;

if(0 < variable)
{

   if(variable > 2)
   {
       variable2=8;
   }
   else
   {
       variable2=7;
   }
    
}



Después de ejecutar el código anterior, la variable "variable2" quedará con el valor de 7. Otro ejemplo:
int variable=1;

int variable2;

if(5 < variable)
{

   if(variable > 2)
   {
       variable2=8;
   }
   else
   {
       variable2=7;
   }
    
}
else
{

   variable2=6;

}



Después de ejecutar el código anterior, la variable "variable2" quedará con el valor de 6.

Un ejemplo sencillo pero mas realista de la utilidad de los "if", es el siguiente, en donde se quiere almacenar en una variable el tipo de triangulo, teniendo como información las medidas de sus tres lados:
lado1=1;
lado2=5;
lado3=4:

String tipoTriangulo="";

if( (lado1 == lado2) && (lado2 == lado3) )
{

   tipoTriangulo="equilátero";
    
}
else
{

   if( (lado1 != lado2) && (lado2 != lado3) && (lado3 != lado1) )
   {
      tipoTriangulo="escaleno";
   }
   else
   {
      tipoTriangulo="isósceles"; 
   }

}