SoloCodigo

Programación General => Java => Mensaje iniciado por: SFRJ en Miércoles 28 de Mayo de 2008, 22:49

Título: Extrano Comportamiento De Mi Ide
Publicado por: SFRJ en Miércoles 28 de Mayo de 2008, 22:49
Amigos os mando un codigo interesante, bamos ami me lo parece, porque resusta que ocurre algo bastante extrano que no acabo de entender el modelo.
Explico:
 He utilizado para hacer un pequeno codigo que crea un archivo de texto y en el escribe, lo que nosotros introducimos atraves del teclado y cuando no queramos itroducir mas datos simplemente escribimos exit.
El programa ami me funciona, pero he notado algo que me parece bastante raro y es que cuando yo introduzco un numero de lineas de texto inpar, el programa funciona correctamente, pero cuando el numero de lineas es par no permite cerrar el programa con el comando exit.
Echarle un vistazo siquereis aber si encontrais el motivo. Un saludo.


import java.io.*;
public class BackUpCopyMaker {
/**WEARD! ODD NUM OF LINES WORK'S BUT PAIR NUM OF LINES DOES NOT WORK
 * WHY?
**/
    public static void main(String [] args) {
        try {
            FileWriter fw = new FileWriter("priprema.txt");
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringBuffer sb = new StringBuffer("");
           
            System.out.println("Enter Text: ");
           
//             fw.write(br.readLine());//One treba u ovaj program samo je primijer kako bi citao samo jedna linije iz testatura
//             fw.close();//
            do {
               sb.append(br.readLine() + "\n");
               fw.write(sb.toString());
            }
            while(!br.readLine().equals("exit"));
            fw.close();
//             br.close();//WE DONT NEED TO CLOSE br. DONT WE?
        }
        catch(IOException e) {
            System.err.println(e.getMessage());
        }
    }
}
Título: Re: Extrano Comportamiento De Mi Ide
Publicado por: emuller en Jueves 29 de Mayo de 2008, 03:30
Lo probé y pude solucionarlo. Creo que el problema es que en el do ... while hacés dos veces readLine, una para agregar al StringBuffer (sb) y otra en la condición del while.
Lo solucioné llamando una sola vez a readLine y guardando lo que retorna en un String temporal. Me quedó así:
Código: Text
  1. import java.io.*;
  2. public class BackUpCopyMaker {
  3.  
  4.   public static void main(String [] args) {
  5.     try {
  6.       FileWriter fw = new FileWriter("priprema.txt");
  7.       BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  8.       StringBuffer sb = new StringBuffer("");
  9.       String linea = new String("");
  10.  
  11.       System.out.println("Enter Text: ");
  12.  
  13.       do {
  14.         linea = br.readLine();
  15.         sb.append(linea + "\r\n");
  16.       } while(!linea.equals("exit"));
  17.      
  18.       fw.write(sb.toString());
  19.       fw.close();
  20.  
  21.     } catch(IOException e) {
  22.       System.err.println(e.getMessage());
  23.     }
  24.   }
  25. }
  26.  
Con este código, el "exit" también se guarda en el archivo. Si no querés que lo haga debes cambiar el do ... while de esta forma:
Código: Text
  1. do {
  2.   linea = br.readLine();
  3.   if(!linea.equals("exit"))
  4.     sb.append(linea + "\r\n");
  5. } while(!linea.equals("exit"));
  6.  
Título: Re: Extrano Comportamiento De Mi Ide
Publicado por: SFRJ en Jueves 29 de Mayo de 2008, 19:22
Genial.
Hera mas sencillo de lo que parecia.
Me acabe complicando un poco :)
Muchas gracias companero

Por casualidad sabes si existe alguna forma de en vez de escribir la palabra exit, para dejar de escribir en el file se puede utilizar la tecla Esc.
Como se haria, o algo parecido. como por ejemplo crtl + q
Título: Re: Extrano Comportamiento De Mi Ide
Publicado por: emuller en Viernes 30 de Mayo de 2008, 00:49
Código: Text
  1. import java.io.*;
  2. public class BackUpCopyMaker {
  3.  
  4.  public static void main(String [] args) {
  5.    try {
  6.      FileWriter fw = new FileWriter("priprema.txt");
  7.      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  8.      StringBuffer sb = new StringBuffer("");
  9.      String linea = new String("");
  10.  
  11.      System.out.println("Ingrese texto. Para salir \"exit, ctrl+z, ctrl+c\": ");
  12.  
  13.      while(((linea = br.readLine())!=null) && (!linea.equals("exit"))){
  14.        sb.append(linea + "\r\n");
  15.      }
  16.  
  17.      fw.write(sb.toString());
  18.      fw.close();
  19.  
  20.    } catch(IOException e) {
  21.      System.err.println(e.getMessage());
  22.    }
  23.  }
  24. }
  25.  

Con este código, el programa sale con CTRL+C, o CTRL+Z y luego ENTER (creo que en sistemas tipo UNIX es con CTRL+D), o escribiendo "exit".
Título: Re: Extrano Comportamiento De Mi Ide
Publicado por: SFRJ en Viernes 30 de Mayo de 2008, 22:56
Amigo al fijarme un poco mejor me he dao cuenta que en el argumento:

while(((linea = br.readLine())!=null) && (!linea.equals("exit"))){

en ningun sitio pone ctrl+z o +c. no funciona como esperabamos.
Título: Re: Extrano Comportamiento De Mi Ide
Publicado por: emuller en Sábado 31 de Mayo de 2008, 00:31
Con CTRL+C O CTRL+Z se corta la entrada de la consola y la lectura devuelve null. En la documentación de la API (yo estoy usando el JDK 1.6u5), si buscás la clase Console dice que los métodos de lectura de esa clase retornan null si hacés CTRL+Z. Luego probé si pasaba lo mismo si leías la entrada con el BufferedReader y haciendo CTRL+Z y funcionó. Luego probé con CTRL+C y también funcionó. Por eso lo del br.readLine == null.

¿Era esa tu duda?