import java.io.*;

public class BufferTest {
    static final String INFILE  = "massive.bin";
    static final String OUTFILE = "mongous.bin";
    static final int BUFF_SIZE = 512;

    public static void main(String[] args) {
        try {

        long start = System.currentTimeMillis();
        tryNoBuffer();
        System.out.println("NoBuffer:   " + elapsedTime(start));

        start = System.currentTimeMillis();
        tryHomeBuilt();
        System.out.println("HomeBuilt:  " + elapsedTime(start));

        start = System.currentTimeMillis();
        tryBufferedIS();
        System.out.println("BufferedIS: " + elapsedTime(start));

        } catch (Throwable t) { t.printStackTrace(); }
    }

    private static String elapsedTime(long startTime) {
        return (System.currentTimeMillis() - startTime) + " milliseconds";
    }

    private static void tryNoBuffer() throws IOException {
        InputStream in = new FileInputStream(INFILE);
        OutputStream out = new FileOutputStream(OUTFILE);

        int b;
        while ((b = in.read()) != -1) {
            out.write(b);
        }
        
        in.close();
        out.close();
    }

    private static void tryHomeBuilt() throws IOException {
        InputStream in = new FileInputStream(INFILE);
        OutputStream out = new FileOutputStream(OUTFILE);

        byte[] buf = new byte[BUFF_SIZE];
        int count;
        while ((count = in.read(buf)) >= 0) {
            out.write(buf, 0, count);
        }
        
        in.close();
        out.close();
    }

    private static void tryBufferedIS() throws IOException {
        InputStream in = new BufferedInputStream(new FileInputStream(INFILE), BUFF_SIZE);
        OutputStream out = new BufferedOutputStream(new FileOutputStream(OUTFILE));

        int b;
        while ((b = in.read()) != -1) {
            out.write(b);
        }
        
        in.close();
        out.close();
    }
}


