
// FilIO.java

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

/******************************************************************************
/ FilIO.java demonstrerar enkel filIO
/
/   FileOutputStream
/   FileInputStream
/   OutputStreamWriter
/   InputStreamReader
/   BufferedReader
/   Scanner
/   PrintWriter
/
/*****************************************************************************/

public class FilIO
{

    public static void main(String[] args) throws java.io.IOException
    {
		teckenIO ();
		primIO ();
	
    }
	
/******************************************************************************
/ Demonstrerar:
/  Utskrift av tecken, teckenvektor och sträng till fil med OutputStreamWriter
/  Inläsning av tecken och teckenvektor med InputStreamReader
/  Radvis inläsning med BufferedReader
/*****************************************************************************/
	public static void teckenIO () throws java.io.IOException
	{
		System.out.println(
		    "========== Tecken-, teckenvektor- och teckensträng-IO ==========");
		// Med OutputStreamWriter kan vi skriva ut tecken, tecken-
		// vektorer och strängar.
		FileOutputStream      fout1 = new FileOutputStream ("FilIO_osw.txt");
		OutputStreamWriter    oswf = new OutputStreamWriter (fout1);
		
		char[]    v = {'a', 'b', 'c', 'd'};
		int    i = 1234152;

		oswf.write ('a');
		oswf.write ("abc");
		oswf.write (v);
		oswf.write (Integer.toString (i));	// Tal måste göras om till sträng
		oswf.write (System.getProperty ("line.separator"));
		oswf.close ();
		
		//----
		
		// Med InputStreamReader kan vi läsa in tecken och teckenvektorer.
		FileInputStream      fin1 = new FileInputStream ("FilIO_osw.txt");
		InputStreamReader    isr = new InputStreamReader (fin1);
		BufferedReader       sin = new BufferedReader (isr);
		
		System.out.println ("Ett inläst tecken        : " + (char)isr.read ());
		
		char[]  v2 = new char[7];
		isr.read (v2);
		System.out.println ("En inläst array          : " + Arrays.toString (v2));
				
		// Tillsammans med BufferedReader kan vi även läsa in rader
		String    s = sin.readLine ();
		int       i2 = Integer.parseInt (s);
		System.out.println ("En int inläst som sträng : " + i2);
		
		isr.close ();
		
	}
		
/******************************************************************************
/ Demonstrerar:
/  Utskrift av primitiva värden och objekt till fil med PrintWriter
/  Ordvis/radvis inläsning och inläsning av primitiva värden med Scanner
/  Utskrift av Å, Ä, och Ö till standard ut med PrintWriter
/*****************************************************************************/		
	public static void primIO () throws java.io.IOException
	{	
		System.out.println ();
		System.out.println ("========== Primitiv- och objekt-IO ==========");
		// Med PrintWriter kan vi även skriva ut primitiva värden och objekt
		FileOutputStream   fout1 = new FileOutputStream ("FilIO_pw.txt");
		PrintWriter        pw = new PrintWriter (fout1);
		
		pw.println (12);		// Tal behöver inte göras om till sträng
		pw.println (new Long (123456789012345678L));
		pw.println ("ett två tre" + System.getProperty ("line.separator"));
		pw.close ();
		
		//----
		
		// Med Scanner kan vi läsa in primitiva värden och växla mellan ordvis
		// och radvis inläsning.
		FileInputStream   fin1 = new FileInputStream ("FilIO_pw.txt");
		Scanner           sin = new Scanner (fin1);
		
		System.out.println ("En int inläst med Scanner.nextInt   : " +
		                                                         sin.nextInt());
		System.out.println ("En long inläst med Scanner.nextLong : " + 
		                                                       sin.nextLong ());
		
		System.out.println ("Första ordet                        : " + 
		                                                           sin.next ());
		sin.useDelimiter (System.getProperty ("line.separator"));
		System.out.println ("Resten av raden                     : " + 
		                                                           sin.next ());

		// ----
		
		// Med PrintWriter kan vi även korrekt skriva ut Å, Ä och Ö till
		// standard ut.
		OutputStream          sout = System.out;
		OutputStreamWriter    osw = new OutputStreamWriter (sout, "Cp850");
		PrintWriter           out = new PrintWriter (osw);
		
		out.println ();
		out.println ("ÅÄÖåäö skrivs korrekt med PrintWriter!");
		out.println ();
		out.flush ();
		
		sin.close ();
	}
	
	
}