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


public class HajasaantiTiedostoEsimerkki {

    public static void main(String args[]) {

        int n = 10000;
        int lohko = 1000;

        String t = "h.tmp";

        if (args.length == 0)
            System.err.println("Parametrit: nimi koko lohko [kt|kl|ll|lt|ls]* ");

        if (args.length > 0)
            t = args[0];

        if (args.length > 1)
            n = Integer.valueOf(args[1]);

        if (args.length > 2)
            lohko = Integer.valueOf(args[2]);

        HajasaantiTiedostoEsimerkki h = new HajasaantiTiedostoEsimerkki();

        Ajastin a;

        for (int p = 3; p < args.length; p++) {

            if (args[p].equals("kt")) {
                a = new Ajastin("Luonti tavuittain");
                h.LuoTiedosto(t + "1", n);
                a.stop();
                System.out.println(n + "t " + a);
            }

            if (args[p].equals("kl")) {
                a = new Ajastin("Luonti lohkoittain");
                h.LuoTiedosto(t, n/lohko, lohko);
                a.stop();
                System.out.println(n + "t " + a);
            }

            if (args[p].equals("ll")) {
                a = new Ajastin("Luku lohkoittain");
                h.LueLohkoina(t, n/lohko, lohko);
                a.stop();
                System.out.println(n + "t " + a);
            }

            if (args[p].equals("lt")) {
                a = new Ajastin("Luku tavuittain");
                h.LuePerakkain(t, n);
                a.stop();
                System.out.println(n + "t " + a);
            }

            if (args[p].equals("ls")) {
                a = new Ajastin("Luku satunnaisesti");
                h.LueSatunnaisesti(t, n);
                a.stop();
                System.out.println(n + "t " + a);
            }
        }


    }



    boolean LueSatunnaisesti(String nimi, long n) {

        Random r = new Random();
        try {
            RandomAccessFile f = new RandomAccessFile(nimi, "r");
            long len = f.length();
            for (int i = 0; i < n; i++) {
                if ((i*50)%n == 0) System.out.print(".");
                f.seek(r.nextInt((int)len));
                f.read();
            }
            f.close();
            System.out.println();

        } catch (IOException e) {
            System.out.println(e);
            return false;
        }

        return true;
    }


    boolean LuePerakkain(String nimi, long n) {

        Random r = new Random();
        try {
            RandomAccessFile f = new RandomAccessFile(nimi, "r");

            long len = f.length();

            for (int i = 0; i < n; i++) {
                if ((i*50)%n == 0) System.out.print(".");
                if (i == len)
                    f.seek(0);
                f.read();
            }
            f.close();
            System.out.println();

        } catch (IOException e) {
            System.out.println(e);
            return false;
        }

        return true;
    }


    boolean LueLohkoina(String nimi, long lohkoja, int lohkokoko) {

        try {
            RandomAccessFile f = new RandomAccessFile(nimi, "r");
            long len = f.length();

            byte[] l = new byte[lohkokoko];

            for (int i = 0; i < lohkoja; i++) {
                if ((i*50)%lohkoja == 0) System.out.print(".");
                if ((i+1)*lohkokoko > len)
                    f.seek(0);
                f.read(l);
            }
            f.close();
            System.out.println();

        } catch (IOException e) {
            System.out.println(e);
            return false;
        }

        return true;
    }




    boolean LuoTiedosto(String nimi, long koko) {

        try {
            RandomAccessFile f = new RandomAccessFile(nimi, "rw");

            for (int i = 0; i < koko; i++) {
                if ((i*50)%koko == 0) System.out.print(".");
                f.write(i%256);
            }
            f.close();
            System.out.println();

        } catch (IOException e) {
            System.out.println(e);
            return false;
        }

        return true;
    }


    boolean LuoTiedosto(String nimi, long lohkoja, int lohkokoko) {

        try {
            RandomAccessFile f = new RandomAccessFile(nimi, "rw");

            byte[] l = new byte[lohkokoko];
            for (int i = 0; i < lohkokoko; i++) {
                l[i] = (byte)(i%256);
            }


            for (int i = 0; i < lohkoja; i++) {
                if ((i*50)%lohkoja == 0) System.out.print(".");
                f.write(l);
            }
            f.close();
            System.out.println();

        } catch (IOException e) {
            System.out.println(e);
            return false;
        }
        return true;
    }





} // class
