Crear un archivo a partit de otro utilizando tokens(2)

Hola de nuevo yo, mira mi programa al igual que el anterior tiene que leer un archivo, y a partir de un token limitado crea uno nuevo, lo que hice fue crear una función dentro de una clase externa(NUEVO1), y después lo mando a llamar desde la clase principal llamada NUEVO2, compilo los dos y esta perfecto, pero ejecuto el principal y me manda lo siguiente:
at java.util.StringTokenizer.(init)(StringTokenizer.java.119)
at java.util.StringTokenizer.(init)(StringTokenizer.java. 135)
at Nuevo1.enviar(Nuevo1.java:25)
at Nuevo.main(Nuevo2.java:6)

la clase externa contiene el siguiente código:
public class Nuevo1{
public File archivo = null;
public FileReader fr = null;
public String p[]={ "$GPGGA","$GPRMC","$GPGSV","$GPGSA","$GPVTG","$GPGLL","$GPIOP","$GPGSM","$GPAREA","$GPEVENT"};
public String linea,b;
public int c=0,a;
public StringTokenizer st;
//INICIO DE METODOS
public void enviar(){// metodo enviar
try {//inicio try1
archivo = new File ("C:\\archivo.log");
fr = new FileReader (archivo);
BufferedReader br = new BufferedReader(fr);
st = new StringTokenizer( linea,">" );
while(st.hasMoreTokens()){ //token
a= st.countTokens();
b= st.nextToken();
for ( int r = 0; r< p.length; r++ ) {//for
if(b.startsWith(p[r]))
{ //leer archivo
String nombreArchivo= "C:\\PROTOCOLOS\\archivo2.log"; // Aqui se le asigna el nombre y
FileWriter fw = null; // la extension al archivo
try { //inico try2
fw = new FileWriter(nombreArchivo);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter salArch = new PrintWriter(bw);
while((linea=br.readLine())!=null)
for ( int c = 0; c< p.length; c++ )
if( linea.startsWith( p[c]))
salArch.print("\n " + linea+" \n ");
salArch.close();
JOptionPane.showMessageDialog( null, "OPERACION EXITOSA", "ANALISIS ", JOptionPane.INFORMATION_MESSAGE );
}//fin try2
catch (IOException ex) { //inico catch
} //fin catch
}//fin leer archivo
}//fin del for
}//fin token
}//fin try1
catch(IOException e){//inicio catch2
System.out.println(e);}//fin catch2
finally{//inicio finally
try{ //el bloque finally se ejecuta siempre, por eso, si se cierra el fichero,INICIO TRY3
if( fr != null){ //al final del primer try, y ha dado un error antes, pasaría, INICIO IF
fr.close(); //al 1er catch y luego saldría, dejándolo abierto. Es conveniente
} //cerrarlo aquí, comprobando que no sea -por un error anterior, como, FIN IF
}//FIN TRY3
catch (IOException e){ // no tener permisos de lectura o que no exista - de valor null.INICIO CATCH3
}//FIN CATCH 3
}// FIN FINALLY
}//FIN del metodo
}//FIN CLASE EXTERNA
y la principal:
class Nuevo2{
public static void main (String args [])
{
Nuevo1 Datos=new Nuevo1(); //LLamamos a los métodos
Datos.enviar();
System.exit (0); }
}
No se cual es el problema pues seguí el orden de los corchetes, espero me ayudes y gracias
:)

1 Respuesta

Respuesta
El error te está dando porque cuando creas el StringTokenizer le pasas como parámetro el String linea, donde todavía no has metido nada. El código donde vas leyendo lineas lo tienes más adelante. Echale un vistazo.
Hola mira ya pude recorrer el archivo a través del array list, y crear el archivo nuevo, con el token pero el problema es que ;solo me guarda la ultima cadena del archivo leído y obviamente el archivo leído contiene más de 1 cadena.
Formato del archivo leído
2008-09-29 16:27:50 $GPVTG,0.0,T,,M,0.1,N,0.2,K*63
formato del archivo creado
$GPVTG,0.0,t,,m,0.1,n,0.2,K*63
el codigo es el siguiente;
import java.util.ArrayList;
import java.util.*;
import java.io.*;
import javax.swing.*;
class fconversion3 {
public static void main(String [] arg) {
File archivo = null;
FileReader fr = null;
String linea;
String b;
int a;
String p[]={ "$GPGGA","$GPRMC","$GPGSV","$GPGSA","$GPVTG","$GPGLL","$GPIOP","$GPGSM","$GPAREA","$GPEVENT"};
ArrayList lineas = new ArrayList();
try {
archivo = new File ("C:/archivo.log");
fr = new FileReader (archivo);
BufferedReader br = new BufferedReader(fr);
while((linea=br.readLine())!=null){ //inicio while 1
lineas.add(linea);}//fin while1
for (int j = 0 ; j < lineas.size() ; j++)//recorrer el arraylist
{ //inicio for 1
linea = (String)lineas.get(j);
StringTokenizer st = new StringTokenizer( linea,">" );
while(st.hasMoreTokens()){ //inicio while2
b= st.nextToken();
for ( int c = 0; c< p.length; c++ )
{//inico for2
if(b.startsWith(p[c]))
try { //crear archivo
String nombreArchivo= "C:\\nuevo.log"; // Aqui se le asigna el nombre y
FileWriter fw = null; // la extension al archivo
fw = new FileWriter(nombreArchivo);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter salArch = new PrintWriter(bw);
for ( int f = 0; f< p.length; f++ )
if(b.startsWith(p[f]))
salArch.print(b);
salArch.close(); } //TRY2
catch (IOException ex) {
}//fin catch
}//for2
}//fin while2
} //fin for1
JOptionPane.showMessageDialog( null, "OPERACION EXITOSA", "ANALISIS ", JOptionPane.INFORMATION_MESSAGE );
}//fin try1
catch(IOException e){
System.out.println(e);
}
finally{
try{ //el bloque finally se ejecuta siempre, por eso, si se cierra el fichero
if( fr != null){ //al final del primer try, y ha dado un error antes, pasaría
fr.close(); //al 1er catch y luego saldría, dejándolo abierto. Es conveniente
} //cerrarlo aquí, comprobando que no sea -por un error anterior, como
}
catch (IOException e){ // no tener permisos de lectura o que no exista - de valor null.
}
}
System.exit(0);} }
No tengo idea de cual es el problema, espero me puedas ayudar, pues ya estuve creando varios códigos pero ninguno funciona correctamente gracias.
:)
Lo que creo que te pasa es que siempre utilizas el mismo archivo para escribir, y en vez de abrirlo, meter todos los tokens y luego cerrarlo, lo abres y cierras por cada token, con lo que machacas el contenido que tuviese.
Si crearas ficheros con nombres distintos, verías que se te crearían un montón de archivos, seguramente uno por token. Revisa tu código y recoloca la creación y el cierre de ficheros.
Ok gracias, seguiré tus consejos espero poder resolver el problema y si no espero me puedas ayudar
Gracias.
:)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas