Arch_demo_4.java_



// Accesos aleatorios
import java.io.*;
import java.util.StringTokenizer;

public class Aleatorio
{
	RandomAccessFile Archivo;
	PrintStream PS = System.out;	// Referencia a la salida est'andar
	InputStream IS = System.in;	// Referencia a la entrada est'andar
	int NREGS = 0;			// Numero de registros
	int LongReg = 9;		// Son 2 cadenas de 4 caracteres y una coma = 9
	
	public Aleatorio() throws IOException
	{
		File F = new File("TEXTO.TXT");
		String OK = "si";
		if (F.exists()) OK = LeeDato("Ya existe, continuar? <si / no> ");
		if (OK.equalsIgnoreCase("si"))
		{
			Archivo = new RandomAccessFile("TEXTO.TXT", "rw") ;
			if (F.exists()) {NREGS = (int)(Archivo.length() / LongReg);}
			PS.println("NREGS= " + (NREGS+1));
			Ciclo_de_datos();
		}
		else PS.println("Listo!!");	// Se decicio no continuar y se termina el programa
	}

	String LeeDato(String Mensaje)
	{
   		String Salida = "";
		BufferedReader BR = new BufferedReader(new InputStreamReader(IS));
		PS.print(Mensaje + " "); PS.flush();
		try { Salida = BR.readLine(); } catch (IOException e){}
		return Salida;
	}

	public static void main(String args[]) throws IOException { new Aleatorio(); }

	// Si es mayor el indice a la cantidad de registros, se almacena al final
	// Si si existe el registro Indice, se reemplaza su contenido
	public void SAVE(StringTokenizer ST) throws IOException
	{
		int Indice = 0;			
		if (ST.countTokens() == 3)	// Se recibe: Indice Dato Dato
		{
			Indice = Integer.parseInt(ST.nextToken()) - 1;			// Menos uno porque empieza en cero
			if (Indice > NREGS) { NREGS++; Archivo.seek(NREGS * LongReg); }	// Si es mayor, se va al final
			else Archivo.seek(Indice * LongReg);				// Busca la posicion solicitada
			Archivo.writeBytes(ST.nextToken() + "," + ST.nextToken());
		}
		else System.out.println("Numero de parametros incorrecto");
		
	}

	public void READ(StringTokenizer ST) throws IOException
	{
		int Indice = 0;	
		byte[] LECTURA = new byte[LongReg];

		if (ST.countTokens() == 1)	// Se recibe sOlo el Indice
		{
			Indice = Integer.parseInt(ST.nextToken())-1;
			if (Indice > NREGS) PS.println("No existe el registro...");
			else if (Indice <= NREGS && NREGS != 0)			// mas uno por la referencia al usuario
			{
				Archivo.seek(Indice * LongReg);
				Archivo.readFully(LECTURA, 0, LongReg);
				SALIDA(new StringTokenizer(new String(LECTURA),","));
			}
			else PS.println("Conflicto al buscar el registro...");
		}
		else PS.println("Numero de parametros incorrecto");
	}

	void SALIDA(StringTokenizer ST)
	{
		PS.println("Palabra 1= " + ST.nextToken());
		PS.println("Palabra 2= " + ST.nextToken());
	}
	// 
	void Ciclo_de_datos() throws IOException
	{
		String Peticion = "", Instr;
		StringTokenizer ST;
		
		while (!Peticion.equalsIgnoreCase("x"))
		{
			PS.println("_______________________________");
			PS.println("L=Leer, G=Guardar, #=Indice");
			PS.println("Sintaxis: [G  #  Dato] o [L #]");
			PS.println("_______________________________");
			Peticion = LeeDato("Instruccion: <x=salir>");
			ST = new StringTokenizer(Peticion);
			Instr = ST.nextToken();
			if (Instr.equalsIgnoreCase("L")) READ(ST);
			if (Instr.equalsIgnoreCase("G")) SAVE(ST);
		}
		Archivo.close();
		PS.println("By ...");
	}
}