
// RAFil.java

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

/******************************************************************************
/ RAFil.java demonstrerar direkt åtkomst i binärfiler.
/ En lagerdatabas simuleras.
/
/   RandomAccessFile
/
/*****************************************************************************/

public class RAFil
{

    public static void main(String[] args) throws java.io.IOException
    {
		String[]    vara;
		RandomAccessFile    fio = new RandomAccessFile ("varor.dat", "rw");
		
		//--- Skapa och spara varudata
		sparaVaruData ("Mjölk", "2.50", "A12", fio, 1);
		sparaVaruData ("Bröd", "12.00", "B4", fio, 2);
		sparaVaruData ("Diskmedel", "21.50", "G8", fio, 3);
		
		
		//---- Läs in och skriv ut varudata
		System.out.println ("********** Original ********************");
		for (int i = 1; i <= 3; i++)
			varuUtskrift (hamtaVaruData (fio, i), i);
		
		//---- Ändra vara #3, läs in och skriv ut
		sparaVaruData ("Pepparkakor", "15.00", "B8", fio, 3);
		
		System.out.println ("********** Vara #3 ändrad **************");
		for (int i = 1; i <= 3; i++)
			varuUtskrift (hamtaVaruData (fio, i), i);

		//---- Lägg till vara #4, läs in och skriv ut
		sparaVaruData ("Ost", "25.00", "C4", fio, 4);
		
		System.out.println ("********** Vara #4 tillagd *************");
		for (int i = 1; i <= 4; i++)
			varuUtskrift (hamtaVaruData (fio, i), i);

		fio.close ();
		
    }


/******************************************************************************
/ sparaVaruData() skriver varudata till den angivna RandomAccess-strömmen.
/
/ Skrivning börjar på aktuell position i strömmen.
/
/ Varje varas datablock tar 70 bytes.
/
/ Varje parameter sparas som null-terminerad serie av chars.
/
/ IN : (String)           namn        : Varans namn
/      (String)           pris        : Varans pris
/      (String)           lagerplats  : Varans lagerplats
/      (RandomAccessFile) fio         : RandomAcces-ström till vilken varudata
/                                       skall skrivas
/      (int)              varuindex   : Varans index i "databasen" (1-baserat)
/
/ UT : (void)
/
/*****************************************************************************/
    public static void sparaVaruData (String namn,
	                                  String pris,
									  String lagerplats,
									  RandomAccessFile fio,
									  int varuindex)
	                                    throws java.io.IOException
    {
		String           s = "";
		char[]           padChars;
		String[]         vara = new String[3];
		StringBuilder    sb;
		
		padChars = new char[20 - namn.length ()];
		Arrays.fill (padChars, ' ');
		sb = new StringBuilder (namn);
		vara[0] = sb.append (padChars).append("\0").toString ();

		padChars = new char[8 - pris.length ()];
		Arrays.fill (padChars, ' ');
		sb = new StringBuilder (pris);
		vara[1] = sb.append (padChars).append("\0").toString ();

		padChars = new char[4 - lagerplats.length ()];
		Arrays.fill (padChars, ' ');
		sb = new StringBuilder (lagerplats);
		vara[2] = sb.append (padChars).append("\0").toString ();


		fio.seek ((varuindex - 1) * 70);		// 70 bytes / vara
		for (int i = 0; i < vara.length; i++)
			fio.writeChars (vara[i]);
		
	}


/******************************************************************************
/ hamtaVaruData() läser in varudata för angiven vara från angiven RandomAccess-
/ ström.
/
/ IN : (RandomAccessFile)  fio : RandomAccess-ström från vilken varudata läses
/      (int)               i   : varuindex (1-baserat)
/
/ UT : (String[])              : String-array med tre element:
/                                   Element 1 : Varans namn
/                                   Element 2 : Varans pris
/                                   Element 3 : Varans lagerplats
/
/*****************************************************************************/	
	public static String[] hamtaVaruData (RandomAccessFile fio,
	                                      int varuIndex)
										    throws java.io.IOException
	{
		String[]    vara = new String[3];
		
		fio.seek ((varuIndex - 1) * 70);		// 70 bytes / vara
		
		vara[0] = readChars (fio).trim ();
		vara[1] = readChars (fio).trim ();
		vara[2] = readChars (fio).trim ();
		
		return vara;
	}


/******************************************************************************
/ readChars() läser chars från angiven RandomAccess-ström tills null påträffas.
/ Inlästa tecken returneras som sträng.
/
/ Läsning börjar på aktuell position i strömmen.
/
/ IN : (RandomAccessFile) fio : RandomAccess-ström från vilken chars läses in.
/
/ UT : (String)               : Inlästa tecken exklusive null-tecknet.
/
/*****************************************************************************/
	public static String readChars (RandomAccessFile fio)
	                              throws java.io.IOException
	{
		StringBuilder  sb = new StringBuilder ();
		char           c;
		
		c = fio.readChar ();
		while (c != 0)
		{
			sb.append (c);
			c = fio.readChar ();
		}
			
		return sb.toString ();
	}


/******************************************************************************
/ varuUtskrift() Skriver ut varudata till standard ut.
/
/ IN : (String[])   vara : Vara att skriva ut
/      (int)        i    : Varuindex
/
/ UT : (void)
/
/*****************************************************************************/
	public static void varuUtskrift (String[] vara, int i)
	{
		System.out.println ("Vara #" + i);
		System.out.println ("--------");
		System.out.println ("Namn       : " + vara[0]);
		System.out.println ("Pris       : " + vara[1]);
		System.out.println ("Lagerplats : " + vara[2]);
		System.out.println ("........................................");
		System.out.println ();
	}

}