2012-10-03 17 views
8

Quiero leer desde el archivo criteria.txt, para tokenizar y anexar al final del mismo archivo los tokens. El programa arroja una excepción: No file found! No sé dónde está mi error. Cualquier sugerencia me ayudaría. ¡Gracias de antemano!Lectura y escritura desde y al mismo archivo en Java

Aquí está mi código:

import java.io.*; 
import java.util.StringTokenizer; 

public class Test 
{ 
    private FileReader fr; 
    private BufferedReader br; 
    private FileWriter fw; 
    private BufferedWriter bw; 
    private StringTokenizer strtok; 
    private String s; 

    //constructor 
    public Test() 
    { 
     try 
     { 
      fw=new FileWriter("criteria.txt", true); 
      bw=new BufferedWriter(fw); 

      try 
      { 
       fr=new FileReader("criteria.txt"); 
       br=new BufferedReader(fr); 

       while((s=br.readLine())!=null) 
       { 
        strtok=new StringTokenizer(s," "); 
        while(strtok.hasMoreTokens()) 
        { 
         bw.write("\n"+strtok.nextToken()); 
        } 
        br.close(); 
       } 
      } 
      catch(FileNotFoundException e) 
      { 
       System.out.println("File was not found!"); 
      } 
      catch(IOException e)  
      { 
       System.out.println("No file found!"); 
      } 

      bw.close(); 
     } 
     catch(FileNotFoundException e) 
     { 
      System.out.println("Error1!"); 
     } 
     catch(IOException e)  
     { 
      System.out.println("Error2!"); 
     } 
    } 

    public static void main(String[] args) 
    { 
     Test t=new Test(); 
    } 
} 
+1

Si está utilizando Eclipse, el archivo debe estar en el directorio raíz del proyecto. –

+3

Debe imprimir el seguimiento de pila para encontrar la línea de código ofensiva. – Vulcan

+0

revise su directorio de archivos – Abubakkar

Respuesta

8

Es necesario cerrar el lector después de haber terminado de leer el archivo es decir, después de que el bucle while. Actualmente, lo está cerrando después de leer la primera línea, lo que causa un "IOException: Stream closed" cuando intenta leer la segunda línea.

Cambiar a:

while((s=br.readLine())!=null) 
{ 
    strtok=new StringTokenizer(s," "); 
    while(strtok.hasMoreTokens()) 
    { 
     bw.write("\n"+strtok.nextToken()); 
    } 
    //br.close(); <----- move this to outside the while loop 
} 
br.close(); 
+0

¡Gracias! Está trabajando ahora. – Lavinia

0

En mi opinión no se puede hacer eso. No puede abrir el mismo archivo para leer y escribir al mismo tiempo. Debe abrir y guardar la información del archivo en una estructura de datos y luego cerrarla. Luego debe trabajar con la estructura de datos en la memoria y abrir el archivo para escribir los resultados. Y cuando termines de escribir debes cerrarlo.

1

Su mayor deshacer es colocar el br.close(); dentro del bucle while(): Usted está diciendo al ordenador cada vez que se escribe en el archivo para cerrarla de inmediato, por lo tanto, el archivo se mantuvo cerrada y equipo nunca lo encontrará en la siguiente iteración/ejecución del bucle Sin embargo, tengo que editar el programa inicial para esto:

import java.io.*; 
import java.util.StringTokenizer; 

public class Test 
{ 
    private FileReader fr; 
    private BufferedReader br; 
    private FileWriter fw; 
    private BufferedWriter bw; 
    private StringTokenizer strtok; 
    private String s; 

    //constructor 
    public Test() 
    { 
     try 
     { 
      fw=new FileWriter("criteria.txt", true); 
      bw=new BufferedWriter(fw); 

      try 
      { 
       fr=new FileReader("criteria.txt"); 
       br=new BufferedReader(fr); 

       **while((s=br.readLine())!=null) 
       { 
        strtok=new StringTokenizer(s," "); 
        while(strtok.hasMoreTokens()) 
        { 
         bw.write("\n"+strtok.nextToken()); 
        } 

       } 
        br.close(); 
      }** 
      catch(FileNotFoundException e) 
      { 
       System.out.println("File was not found!"); 
      } 
      catch(IOException e)  
      { 
       System.out.println("No file found!"); 
      } 
      bw.close(); 
     } 
     catch(FileNotFoundException e) 
     { 
      System.out.println("Error1!"); 
     } 
     catch(IOException e)  
     { 
      System.out.println("Error2!"); 
     } 
    } 

    public static void main(String[] args) 
    { 
     Test t=new Test(); 
    } 
} 

La carpeta o directorio existe el archivo no importa en este caso ya que el programa creará un nuevo archivo con el nombre "criteria.txt" en la misma carpeta como el programa de Java; sin embargo, tendrá que abrir el archivo con un editor de texto para agregar/anexar algunos datos ya que el archivo estará en blanco inicialmente. La ejecución posterior del programa ahora agregará los contenidos ya insertados como una cadena de concatenación en una nueva línea. Se producirá una nueva línea cada vez que se ejecute el programa. Espero que esto ayude.

Cuestiones relacionadas