Ficheros txt, con tokenizer

Necesito hacer un programa que guarde datos en una archivo txt, pero lo necesito hacer por medio de la captura de tokenizer, yo pude hacer que guadara los datos que captura el problema es que cuando el programa vuelve a correr borra la linea que se introdujo anteriormente para capturar la nueva linea, entonces quería saber como hago para que guarde un registro de toda la información que yo quiera ingresar por ejemplo deseo ingresar una persona dicha persona debe quedar en el registro, cuando quiere ingresar otra persona también debe de quedar guardada, y así sucesivamente hasta tener un registro de personas agradeceré la ayuda...

1 respuesta

Respuesta
1
Necesitaría más datos para entender el problema. ¿Hablas de un StringTokenizer o un StreamTokenizer? ¿Qué estás tokenizando y cómo quieres huardarlo en el txt?
Si pusieras el código que te está dando problemas sería más fácil ver cómo lo puedes mejorar.
Bueno es que el programa en si se trata de un competencia de atletas dicho programa debe tener ya atletas registrados por arreglos, otros ya deben estar en el fichero txt y otros deben ser ingresados por StringTokenizer:
Ejemplo de los ingresados por arreglo
:
import java.io.*;
import java.util.StringTokenizer;
public class IngresarporArreglos {
/**
* @param args
*/
private static Atleta[] lista;
private static String entrada="c:\\datos\\entrada.txt";
private static String salida1="c:\\datos\\salida1.txt";
private static BufferedReader fileIn;
private static PrintWriter fileOut1;
private static int largo = 0;
public Atleta[] getLista() {
return lista;
}
public static void inserte(int pos,Atleta dato){
if (pos
lista[pos]=dato;
}
}
public void setLista(Atleta[] lista) {
this.lista = lista;
}
public static void cargueDatos(){
StringTokenizer linea;
String str;
Atleta dato;
try{
do{
str= fileIn.readLine();
if (str!=null){
linea = new StringTokenizer(str,"_");
dato = new Atleta(linea.nextToken(),linea.nextToken(),linea.nextToken(),Integer.parseInt(linea.nextToken())
,linea.nextToken(),Integer.parseInt(linea.nextToken()),Integer.parseInt(linea.nextToken()),Double.parseDouble(linea.nextToken())
,Double.parseDouble(linea.nextToken()),Double.parseDouble(linea.nextToken()),Double.parseDouble(linea.nextToken()));
inserte(largo,dato);
largo++;}
}while (str!=null);
}catch (IOException fnfe) {
System.out.println("Error en archivo");
System.exit(1);}
}
public static void guardeDatos(){
for (int i=0; i
if (lista!=null)
fileOut1.println(lista);
else
break;
}
}
public static void main(String[] args) throws FileNotFoundException,
IOException {
// TODO Auto-generated method stub
fileIn = new BufferedReader(new FileReader(entrada));
fileOut1 = new PrintWriter(new FileWriter(salida1));
lista = new Atleta[20];
cargueDatos();
Atleta dato = new Atleta("Laura Hernandez","15/02/1990","5599",12,"Honduras",1,0,10,5,9,7);
lista[largo]=dato;
guardeDatos();
Atleta dato1 = new Atleta("Fabiola Espinoza","15/02/1990","5599",12,"Honduras",1,0,10,5,9,7);
lista[largo]=dato1;
guardeDatos();
fileIn.close();
fileOut1.close();
}
}

Despues lo ingresados por Tokenizer:
import java.io.*;
import java.util.StringTokenizer;
public class CrearyLeerArchivo {
private static Atleta[] lista;
private static String entrada="c:\\datos\\entrada.txt";
private static String salida="c:\\datos\\salida.txt";
private static String salida1="c:\\datos\\salida1.txt";
private static BufferedReader fileIn;
private static PrintWriter fileOut;
private static PrintWriter fileOut1;
private static int largo = 0;
private static BufferedReader stdIn =
new BufferedReader(new InputStreamReader(System.in));
/* Standard output stream */
private static PrintWriter stdOut =
new PrintWriter(System.out, true);
/* Standard error stream */
private static PrintWriter stdErr =
new PrintWriter(System.err, true);
public Atleta[] getLista() {
return lista;
}
public static void inserte(int pos,Atleta dato){
if (pos <lista.length){
lista[pos]=dato;
}
}
public void setLista(Atleta[] lista) {
this.lista = lista;
}
public static void cargueDatos(){
StringTokenizer linea;
String str;
Atleta dato;
Atleta dato1;
try{
do{
str= fileIn.readLine();
if (str!=null){
linea = new StringTokenizer(str,"_");
dato = new Atleta(linea.nextToken(),linea.nextToken(),linea.nextToken(),Integer.parseInt(linea.nextToken())
,linea.nextToken(),Integer.parseInt(linea.nextToken()),Integer.parseInt(linea.nextToken()),Double.parseDouble(linea.nextToken())
,Double.parseDouble(linea.nextToken()),Double.parseDouble(linea.nextToken()),Double.parseDouble(linea.nextToken()));
inserte(largo,dato);
largo++;}
}while (str!=null);
}catch (IOException fnfe) {
System.out.println("Error en archivo");
System.exit(1);}
}
public static void guardeDatos(){
for (int i=0; i<lista.length;i++){
if (lista!=null)
fileOut.println(lista);
else
break;
}
}
public static void main(String[] args) throws FileNotFoundException,
IOException {
// TODO Auto-generated method stub
stdErr.println("Digite[Nombre_Fecha_Pasaporte_numero unico_equipo_Nivel_Categoria_barra_viga_salto_piso]:");
StringTokenizer token = new StringTokenizer(stdIn.readLine(),"_");
String Nombre = token.nextToken();
String Fecha = token.nextToken();
String Pasaporte = (token.nextToken());
int Numero = Integer.parseInt(token.nextToken());
String Equipo = token.nextToken();
int Nivel = Integer.parseInt(token.nextToken());
int Categoria =Integer.parseInt(token.nextToken());
double Barra = Double.parseDouble(token.nextToken());
double Viga = Double.parseDouble(token.nextToken());
double Salto = Double.parseDouble(token.nextToken());
double Piso = Double.parseDouble(token.nextToken());
fileIn = new BufferedReader(new FileReader(entrada));
fileOut = new PrintWriter(new FileWriter(salida));
lista = new Atleta[20];
cargueDatos();
Atleta dato = new Atleta(Nombre,Fecha,Pasaporte,Numero, Equipo, Nivel, Categoria, Barra,Viga,Salto,Piso);
lista[largo]=dato;
guardeDatos();
fileIn.close();
fileOut.close();
}
}

Este es el que me esta acausando problema es que a la hora de ingresar el atleta a la consola por medio de el StringTokenizer si lo introduce al archivo txt, el problema es que cuando vuelvo a correr el programa para guardar otro atleta se me borra para introducir la nueva linea, en otras palabras solo ingresa uno como haga para ingresar y ingresar atletas por medio del stringTokenizer, otra duda que tengo es que como pudiera hacer para extraer un dato del archivo por ejemplo necesito extraer las notas de los atletas en barra, viga, salto, piso para sacar el puntaje más alto entre todos los atletas ingresados...! Agradecería la ayuda es que es el proyecto final y llevo como dos meses y no he avanzado mucho y lo tengo que entregar esta semana... Agradeceré verdaderamente tu respuesta... Dios te Bendiga
Nota: Que se introduzcan atletas por medio del StringTokenizer y quede cada uno guardado en el archivo txt, al final tiene que quedar todos los atletas en un mismo archivo txt...
Ok, tu error era simple, haces esto:
fileOut = new PrintWriter(new FileWriter(salida));
o esto:
fileOut1 = new PrintWriter(new FileWriter(salida1));
Y así abres el fichero para escribir DESDE EL PRINCIPIO, es decir, machando lo que hubiera antes. Para AÑADIR, que es lo quieres hacer, cambialo por:
fileOut = new PrintWriter(new FileWriter(salida,true));
fileOut1 = new PrintWriter(new FileWriter(salida1,true));
Puedes leerlo aquí, y deberías consultar estas documentaciones siempre para ver cómo resolver tus problemas:
http://java.sun.com/j2se/1.4.2/docs/api/java/io/FileWriter.html#FileWriter(java.lang.String,%20boolean)
El otro problema se complica un poco ya que, sinceramente, no estás construyendo bien los métodos. En programación no es recomendable usar variables globales y luego métodos sin parámetros que trabajen con ellas. De hecho yo ya nunca veo trabajando ningún método que no tenga parámetros y nunca veo una variable global. De todas maneras para lo que pides debes crear un método que lea del archivo de entrada, linea a linea hasta que se acabe el fichero. Para cada linea sacas el atleta de esa linea y lo guardas en un array(arreglo).
(Otra cosa que deberías haber hecho era crear una clase para guardar los datos de cada atleta, con los atributos necesarios, y luego cada atleta que saques del archivo meterlo en esa clase o sacarlo de ella para guardarlo. Aún así lo puedes hacer sin ella como haces ahora para guardar un atleta (que es un String con todos sus datos seguidos). )
Una vez que tienes todos los atletas del fichero en el array, lo recorres uno a uno, tokenizas sus datos y ves las puntuaciones, guardando en cada caso la puntuación mayor. Te pongo un ejemplo en pseudocodigo para que te inspire (no es el caso real ya que no se muy bien como son los datos de tus atletas). Pongamos que mis atletas tienen solo (Nombre, puntos):
String mejorAtleta;
int idMejorAtleta=0;
int mejorPuntos=0;
for (int i=0;i
<lista.lentgh<i++){
String atleta = lista;
//tokenizo atleta y saco sus puntos
String[] datosAtleta = atleta.split(","); // El StringTokenizer está en desuso, prueba a  usar "split". que te da un array con los datos. En este caso los separa por comas y son 2
String nombre = datosAtleta[0];
int puntosActual = Integer.parseInt(datosAtleta[1]);
// Vamos comparando para ver cual de ellos tiene mejores puntos. Siempre guardaremos el ultimo con mejor puntos. Al final del bucle será el mejor.
if (puntosActual > mejorPuntos){
       mejorPuntos = puntosActual;
       mejorAtleta = nombre;
      idMejorAtleta = i;
}
} // Fin for
Al final de este bucle for tendré en mejorAtleta el nombre del mejor, en idMejorAtleta la posición en el arreglo del mejor atleta y en mejorPuntos los puntos del mejor. Puedo hacer esto para el mejor, peor y para puntuaciones de diversos deportes en el mismo bucle.
Espero que te sirva y sepas darle forma en tu proyecto. Recuerda cerrar la pregunta.
String atleta = lista[ i ];
En realidad las clase del atleta es:
public class Atleta extends Persona {
private int numUnico;
private String equipo;
private int nivel;
private int categoria;
private double piso;
private double salto;
private double viga;
private double barra;
public Atleta(String initialNombre, String initialFechNac, String initialNumPasaporte,int initialNumUnico,
String initialEquipo,int initialNivel, int initialCategoria, double initialPiso,double initialSalto,double initialViga, double initialBarra){
super(initialNombre,initialFechNac,initialNumPasaporte);
this.numUnico=initialNumUnico;
this.equipo=initialEquipo;
this.nivel=initialNivel;
this.categoria=initialCategoria;
this.piso=initialPiso;
this.salto=initialSalto;
this.viga=initialViga;
this.barra=initialBarra;
}
public int getNumUnico() {
return numUnico;
}
public void setNumUnico(int numUnico) {
this.numUnico = numUnico;
}
public String getEquipo() {
return equipo;
}
public void setEquipo(String equipo) {
this.equipo = equipo;
}
public double getPiso() {
return piso;
}
public void setPiso(double NotaPiso) {
piso = (NotaPiso>=0.0 && NotaPiso<=10.0)?
NotaPiso:0.0;
}
public double getSalto() {
return salto;
}
public void setSalto(double NotaSalto) {
salto = (NotaSalto>=0.0 && NotaSalto<=10.0)?
NotaSalto:0.0;
}
public double getViga() {
return viga;
}
public void setViga(double NotaViga) {
viga = (NotaViga>=0.0 && NotaViga<=10.0)?
NotaViga:0.0;
}
public double getBarra() {
return barra;
}
public void setBarra(double NotaBarra) {
barra = (NotaBarra>=0.0 && NotaBarra<=10.0)?
NotaBarra:0.0;
}
public int getNivel() {
return nivel;
}
public void setNivel(int gNivel) {
nivel = (gNivel>=2 && gNivel<=10) ?
gNivel:0;
}
public int getCategoria() {
return categoria;
}
public void setCategoria(int categoria) {
this.categoria = categoria;
}
public double CalifGeneral() {
return (getPiso()+getSalto()+getViga()+getBarra())/4;
}
public String toString(){
return "\n Datos de Gimnasta: \nNombre: "+super.getNombre()+"\nFecha de nacimiento: "+super.getFechNac()+
"\nNumero de Pasaporte: "+super.getNumPasaporte()+"\nNumero Unico: "+getNumUnico()+"\nEquipo: "+getEquipo()+"\nNivel: "+getNivel()+
"\nCategoria: "+getCategoria()+"\nNota Piso: "+getPiso()+"\nNota Salto: "+getSalto()+"\nNota Viga: "+getViga()+
"\nNota Barra: "+getBarra();
}
}
que se extiende de la clase Persona:
public class Persona {
private String nombre;
private String fechNac;
private String numPasaporte;
public Persona(String initialNombre, String initialFechNac, String initialNumPasaporte){
this.nombre=initialNombre;
this.fechNac=initialFechNac;
this.numPasaporte=initialNumPasaporte;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getFechNac() {
return fechNac;
}
public void setFechNac(String fechNac) {
this.fechNac = fechNac;
}
public String getNumPasaporte() {
return numPasaporte;
}
public void setNumPasaporte(String numPasaporte) {
this.numPasaporte = numPasaporte;
}
public String toString(){
return "\nNombre: "+getNombre()+"\nFecha de nacimiento: "+getFechNac()+"\nNumero de Pasaporte: "+getNumPasaporte();
}
}
En si, ¿Si tengo que convertir esto un un arraylist?
Es que no tengo mucho conocimiento en arreglos porque estoy en progra II y el profe de progra I no nos enseño ciclos ni arreglos entonces estoy bastante perdidilla...! Gracias por tu Respuesta y la rapidez con la que contestaste...!
No me di cuenta de que usabas la clase, entonces bien. Tienes que sacar los atletas del fichero y meterlos en un ArrayList, correcto. De esa manera podrás sacar los datos que quieras de todos los atletas para comparar las puntuaciones. Puedes usar un arreglo para meterlos, no es obligatorio el ArrayList, aunque es más fácil el arraylist porque no tienes que saber cuantos atletas hay en el fichero. Ejemplo:
//Pseudocodigo
ArrayList atletas = new ArrayList();
while (no_es_fin_fichero){
leo_linea_fichero;
Atleta atleta = tokenizo_linea_fichero_ y_convierto_en_atleta;
atletas.add(atleta); //Añado el atleta al arraylist
}
Despues en vez del bucle for que te puse antes usarías un bucle así:
Iterator iter = atletas.iterator();
while (iter.hasNext()){
Atleta atleta = (Atleta) iter.Next();
int puntos = atleta.getPuntos();
...
...
// Hacemos lo que dije en el otro bucle
}
Gracias lo de agregarle el true sirivio y si me agrega los datos que ingreso, pero lo de el ArrayList me lo podrías explicar un poco más claro es que casi no te entendí, gracias por tu respuesta...! Y nuevamente por la rapidez en contestar.. Buen Día...!
Los ArrayList son la versión mejorada de los arrays simples (o arreglos). Una de las grandes ventajas que tienen es que no hace falta especificar que tamaño tienen, por lo que pueden crecer constantemente. En cambio un array es de tamaño fijo y no puede crecer por lo que puede dar problemas en caso de que no sepamos cuantos datos vamos a meterle.
Ejemplo de las dos cosas:
ArrayList listaAtletas = new ArrayList();
Atleta[] arregloAtletas = new Atleta[100]; //TENGO que decir un tamaño
// Meter un atleta
Atleta miAtleta = new Atleta(...,...);
arregloAtletas[0] = miAtleta; // TENGO que decirle en qué posición
listaAtletas.add(miAtleta); // En un arrayList no necesito decir la posicion, pero podría haciendo listaAtletas.add(23,miAtleta) y cogerlo igual listaAtletas.get(23)
// El arrayList me permite eliminar un elemento de la lista sabiendo su posición. Un array normal no
listaAtletas.remove(23);
//Recorrer
//Array
for (int i=0;i
Atleta atleta = arregloAtletas[ i ];
...
}
//Arraylist
Iterator iter = listaAtletas.iterator(); // Necesito un iterador para recorrer
while (iter.hasNext() ){ // hasNext() es cierto si hay más para iterar
Atleta atleta = (Atleta) iter.Next(); // Next() me devuelve el siguiente
...
// Puedo eliminar objetos del arrayList así
iter.remove();
}
// El arrayList permite saber si contiene un objeto determinado
Atleta otroAtleta = new Atleta(...,...,...)
if (listaAtletas.contains(otroAtleta)){...}
Pero a pesar de todo aún se pueden hacer las cosas con arreglos en vez de ArrayLists, solo que más complicado en algunos casos. Por ejemplo en el caso de querer coger todos los atletas de un archivo sin saber cuantos hay tendremos que usar un array muy grande para que no se desborde, y guardar el tamaño usado en otra variable, por ejemplo.
Espero que esto te lo haya aclarado. Hay muchos manuales al respecto por ahí. Por ejemplo este es interesante: http://www.itapizaco.edu.mx/paginas/JavaTut/froufe/parte4/cap4-7.html
Hola! Quiero agradecer tu excelente repuesta y paciencia para conmigo... sigue así eres super hábil para esto de la programación... gracias. Dios te Bendiga...!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas