Guardar en array un fichero .txt

Tengo este método para leer matrices en ficheros de texto y mostrarlas por pantalla, me gustaría poder leer el fichero y guardarlas en una matriz para poder hacer modificaciones sobre ellas. ¿Me puedes ayudar?
public static void porLineas(String nombre)
/*
Este método lee el fichero y escribe en la misma línea los tokens
que aparecen en el fichero de entrada en la misma línea
*/
{
System.out.println ("VOLCADO POR LINEAS");
int nLinea=0;
String linea;
StringTokenizer palabras;
BufferedReader lector = null;
try
{ lector = new BufferedReader (new FileReader(nombre));
while ( (linea=lector.readLine()) !=null)
{ palabras= new StringTokenizer (linea);
while (palabras.countTokens()>0)
{
String elemento= palabras.nextToken ();
System.out.print (elemento+"***");
}
System.out.println();
nLinea++;
}
System.out.println ("EL NUMERO DE LINEAS ES= "+nLinea);
}
catch (Exception e)
{System.out.println("NO ENCUENTRO EL FICHERO");}
try
{ if (lector != null) lector.close();
}
catch (IOException e)
{}
} // fin de método porLineas
} // fin de clase Leer
Respuesta
1
Con mucho gusto puedo ayudarte, aunque habría que hacer algunas modificaciones que afectarían más o menos al funcionamiento del programa. Me explico:
Para almacenar el contenido del archivo en una matriz, hay que definir una estructura de datos de dimensiones fijas que hay que conocer a priori; esto es, hay que saber cuántas filas y columnas tiene la matriz antes de leer el fichero. Con respecto a estas últimas, no hay problema porque se pueden calcular con el método countTokens(), pero en principio no hay forma de leer el número de filas a no ser que se explore el archivo completo, lo que implicaría dos lecturas secuenciales.
Evidentemente, esto es muy ineficiente, así que en principio hay dos opciones: especificar unas dimensiones a priori (se pueden leer desde la línea de comandos) o indicarlas al principio del archivo. La segunda opción es la mejor porque la responsabilidad de establecer las dimensiones recae sobre el autor del archivo y no sobre el usuario.
Para darte una solución a lo que me pides, necesito saber si quieres hacer esa pequeña modificación en la estructura del archivo y si no te importa que cambie un poco también la cabecera de la función.
Muchísimas gracias por la rapidez. He estado pensando en lo que me comentas y pensaba utilizar la función en 2 programas distintos. En uno las matrices son siempre cuadradas, ¿con lo que no se necesitaría modificar nada en el archivo no? Pero en el otro programa tendría que leer 2 archivos en los que a priori no conozco el tamaño... Lo de este último programa, ya veo que es más complicado y no se si puedo modificar el archivo (supongo que si)pero de momento no estoy segura así que si me ayudas para el primero ya te estoy muy agradecida...
He hecho un pequeño programa con una función que trabaja de forma muy similar a la tuya, y cuya cabecera es igual salvo porque ahora es estática (para poder ser llamada desde el método main en la misma clase) y devuelve una matriz de objetos. Posiblemente tengas que hacer algunos cambios para adaptarla a los requisitos de tu problema o a la estructura de tu programa, pero al menos espero que sirva para que tengas una idea general.
Aquí tienes el código:
////////////////////////////////////////
import java.io.*;
import java.util.StringTokenizer;
public class Leer {
public static void main(String[] args) {
if (args.length == 1)
printm(porLineas(args[0]));
}
public static void printm(Object[][] mat) {
for (int i = 0; i < mat.length; ++i) {
for (int j = 0; j < mat.length; ++j)
System.out.print(mat[j] + " ");
System.out.println();
}
}
public static Object[][] porLineas(String ruta) {
try {
FileReader arch = new FileReader(ruta); // Lector de archivo
BufferedReader buff = new BufferedReader(arch); // Buffer de lectura
// Calcular el orden de la matriz y reservar espacio
String linea = buff.readLine();
StringTokenizer st = new StringTokenizer(linea);
int orden = st.countTokens();
Object[][] mat = new Object[orden][orden];
// Rellenar la matriz
for (int i = 0; i < orden; ++i) {
for (int j = 0; j < orden; ++j)
mat[j] = st.nextToken();
/* La primera linea ya fue leída (para calcular las dimensiones),
así que ahora solo hay que leer las n - 1 siguientes. */
if (i < orden - 1) {
linea = buff.readLine();
st = new StringTokenizer(linea);
}
}
// Mostrar datos sobre la matriz
System.out.println("Matriz de orden " + orden);
// Otros datos
// Cerrar los flujos de entrada
buff.close();
arch.close();
// Salir
return mat;
}
catch (IOException ioe) {
System.out.println(ioe);
return null;
}
}
}
////////////////////////////////////////
Como ves, me he centrado en los comentarios del método porLineas y he descuidado los demás, porque creo que el resto del código es bastante simple.
Si tienes dudas o el código no es exactamente lo que buscabas, intentaré ayudarte con mucho gusto. Suerte.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas