// Titel:			Testbeispiel für Read und Write binär
// Version:			1.0
// Copyright:		HS-Harz, FB AI
// Autor:			Dipl.-Inf.(TU) Dipl.-Ing.(FH) Michael Wilhelm//Firma:
// Beschreibung:		Einfaches Beispiel zum Schreiben und Lesen per GUI
// Erstellungsdatum:	25.09.2010
// Letzte Aenderung:	12.11.2010

/*
Erweiterung:

Wenn man diesen Quellcode mehrfach einsetzen wollte,
müsste man das Schreiben resp. Lesen mehrfach implementieren

Abhilfe:
Man baut eine Klasse: Name=CDaten
Attribute sind: iVersion, iNr, dWert, iAnhalter, Zeichen
Zugriff: private
Einbau der set- und get-Methoden

Einbau zweier Schreib- und Lese-Methoden
public boolean write2File( String sFilename);

public boolean readFromFile( String sFilename);


*/

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;

// Beispiel mit einfacher GUI
// Einlesen und schreiben in eine BINAER-Datei

// Klasse ist abgeleitet von JFrame (Fenster)
public class readwriteStr3 extends JFrame {
	private JTextArea editor; // muss global sein, wird zugegriffen
	private final String C_FILENAME="readwrite.bin";

  public readwriteStr3() {
    getContentPane();
    setGUI();  // setze GUI
       // wenn x-gedrückt, dann exit
    setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    setSize(600, 600);  // größe
    setLocation(40, 30);  // Position top, left
    setTitle("Einlesen und schreiben in Binärdatei");  
  } // create

	// setzt die grafischen Elemente
  private void setGUI() {
    getContentPane().setLayout ( new BorderLayout(3,1) );  // 3,1 Rand
			// erzeugen der Schalter
    JButton Bnread = new JButton("lesen");
    JButton BnreadHex = new JButton("lesen Hex");
    JButton Bnwrite = new JButton("schreiben");
    JButton Bnclear = new JButton("löschen");
    JButton Bnesc = new JButton("Abbruch");
		// erzeugen der zusätzlichen Pinwand für die Schalter
    JPanel pnButtons = new JPanel();
    pnButtons.setLayout( new FlowLayout() );
    pnButtons.setBackground( Color.red);
    pnButtons.add(Bnwrite);
    pnButtons.add(Bnread); // hinzufügen
    pnButtons.add(BnreadHex);
    pnButtons.add(Bnclear);
    pnButtons.add(Bnesc);
			// schrift setzen
    Bnread.setFont(new Font("Arial", Font.BOLD,20));
    BnreadHex.setFont(new Font("Arial", Font.BOLD,20));
    Bnwrite.setFont( new Font("Arial", Font.BOLD,20));
    Bnclear.setFont( new Font("Arial", Font.BOLD,20));
    Bnesc.setFont( new Font("Arial", Font.BOLD,20));
		// Pinwand ins Hauptfenster eintragen
    getContentPane().add(pnButtons,BorderLayout.SOUTH);
    editor = new JTextArea();
    editor.setFont( new Font("Courier New", Font.BOLD,20));


    JScrollPane sc = new JScrollPane(editor);
    getContentPane().add(sc,BorderLayout.CENTER);
		editor.setText("");  // löschen des Editors (Inhalt)

		// Verknüpfung Schalter mit Methode
    Bnread.addActionListener(
      new java.awt.event.ActionListener() {
       public void actionPerformed(ActionEvent e) {
        bn_read();
      }
    });

    BnreadHex.addActionListener(
      new java.awt.event.ActionListener() {
       public void actionPerformed(ActionEvent e) {
        BnreadHex();
      }
    });


		// Verknüpfung Schalter mit Methode
     Bnwrite.addActionListener(  
        new java.awt.event.ActionListener() {
		  public void actionPerformed(ActionEvent e) {
			  bn_write();
		  }
    }
    );

		// Verknüpfung Schalter mit "Methode"
    Bnclear.addActionListener(
      new java.awt.event.ActionListener() {
       public void actionPerformed(ActionEvent e) {
        editor.setText(""); // so geht es auch
      }
    });

    Bnesc.addActionListener(
      new java.awt.event.ActionListener() {
       public void actionPerformed(ActionEvent e) {
        System.exit(0);
      }
    });

  }// setGUI


		// einlesen der Datei
  private void bn_read()  {
    editor.append("\n\r\n\rin read\n\r");
      // Variablen
    int iVersion;
    int iNr;
    double dWert;
    int iAnhalter;
    char [] Zeichen = new  char[3];

   try {
      File file = new File(C_FILENAME);
      if (file.exists() ) {
					// öffnen der Datei
         FileInputStream Fin = new FileInputStream( C_FILENAME );
       		// Einlesen der Dateien
         DataInputStream Din = new DataInputStream(Fin);
         iVersion = Din.readInt();
         editor.append("  iVersion: "+iVersion+"\n\r");
         iNr = Din.readInt();
         editor.append("  iNr: "+iNr+"\n\r");
         dWert = Din.readDouble();
         editor.append("  dWert: "+dWert+"\n\r");
         iAnhalter = Din.readInt();
         editor.append("  iAnhalter: "+iAnhalter+"\n\r");
         for (int i=0; i<Zeichen.length; i++) {
		Zeichen[i] = Din.readChar();
            editor.append("  Zeichen[i]: "+Zeichen[i]+"\n\r");
         }
         Din.close();
         Fin.close();
      } 
      else {
        editor.append("\nDie Datei "+C_FILENAME+" ist nicht vorhanden");
      }
     }
     catch (IOException ee) {
           System.err.println("IOException: " + ee);
     }
  }	// bn_read()


  private String IStr2(int iZahl) {
        String s = Integer.toHexString(iZahl).toUpperCase();
        while (s.length() < 2) {
          s = "0" + s;
        }
        return s;
    }  // IStr2

  private void BnreadHex()  {
    editor.append("\n\nin readHex:\n");
    try {
      File file = new File(C_FILENAME);
      if (file.exists() ) {
        FileInputStream Fin = new FileInputStream(C_FILENAME);
         		// Kopplung mit neuem, abgeleiteten Stream
        DataInputStream Din = new DataInputStream(Fin);
        char ch;
        byte b;
        int data;
        int index = 0;
        String sStr1="";
        String sStr2="";
        while  ( Din.available()>0 ) {
          b  = Din.readByte();
          ch = (char) (b);
          if (b<0)
            data=b+256;
          else
            data=b;
          sStr1 += IStr2(data) +" ";
          sStr2 += ch+" ";
          index++;
          if (index>=16) {
            editor.append(" "+sStr1+"  "+sStr2+"\n");
            index=0;
            sStr1="";
            sStr2="";
          }
        }
         // gibt es noch einen Rest ?
        if (index>0) {
            for (int i=index+1; i<=16; i++) 
              sStr1 += "   ";
            editor.append(" "+sStr1+"  "+sStr2+"\n");
        }

        Din.close();
        Fin.close();
        editor.append("\nEs wurde die Datei "+C_FILENAME+" gelesen");
      } 
      else {
        editor.append("\nDie Datei "+C_FILENAME+" ist nicht vorhanden");
      }
     }
     catch (IOException ee) {
         System.err.println("IOException: " + ee);
     }
  }	// bn_readHex()

		// schreiben der Datei
  private void	bn_write()  {
    editor.append("in write:\n\r");
			// Variablen setzen
    int iVersion = 1;
    int iNr = 123;
    double dWert = 234.56789;
    int iAnhalter = 42;
    char [] Zeichen = { 'p','s', 'c'};

    try {
					// öffnen der Datei
         FileOutputStream Fout = new FileOutputStream( C_FILENAME );
       		// Druckausgabe
         DataOutputStream Dout = new DataOutputStream(Fout);
         Dout.writeInt(iVersion);
         editor.append("  iVersion: "+iVersion+"\n\r");
         Dout.writeInt(iNr);
         editor.append("  iNr: "+iNr+"\n\r");
         Dout.writeDouble(dWert);
         editor.append("  dWert: "+dWert+"\n\r");
         Dout.writeInt(iAnhalter);
         editor.append("  iAnhalter: "+iAnhalter+"\n\r");
         for (int i=0; i<Zeichen.length; i++) {
           Dout.writeChar( Zeichen[i] );
           editor.append("  Zeichen[i]: "+Zeichen[i]+"\n\r");
         } // for
         Dout.close();
         Fout.close();
       }
       catch (IOException ee) {
           System.err.println("IOException: " + ee);
       }

  } // bn_write()


  public static void main(String[] argvs) {
       // Parameter werden abgeprueft
    for (int i=0; i<argvs.length;i++) {
  	System.out.println(i+"  "+argvs[i]);
    }
    readwriteStr3 frame = new readwriteStr3();
    frame.setVisible(true);
  }


}

/*  Beispieldatei
versionnr: 1
int 123
double 234,5678
int 42
char 'p'
char 's'
char 'c'
*/