/* Autor:           Dipl.-Inf., Dipl.-Ing. (FH) Michael Wilhelm
   Firma:           HS Harz, FB AI
   Version:         1.1
   Ersterstellung:  07.06.2006
   Letzte Änderung: 12.11.2010
*/


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



/*
Ein- und Auslesen einer binaeren Datei
Strings werden mitttels writeUTF ausgegeben
Strings werden mitttels readUTF eingelesen
*/



public class readwriteStr2 extends JFrame {

  private JTextArea editor; // muss global sein, wird zugegriffen
  private final String C_FILENAME="rw_str.bin";


  public readwriteStr2() {
    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, mit readUTF und writeUTF");  
  } // 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\nin read:\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);
        int i;
        long ll = Din.readLong();  // 8 Bytes
        editor.append("Long: "+ll+"\n");
        String s = Din.readUTF();
        editor.append("String: "+s+"\n");
        ll = Din.readLong();  // 8 Bytes
        editor.append("Long: "+ll+"\n");
        double d = Din.readDouble();  // 8 Bytes
        editor.append("Double: "+d+"\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_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("\n\nin write:\n");
    try {
      FileOutputStream Fout = 
          new FileOutputStream(C_FILENAME);
       		// Kopplung mit neuem, abgeleiteten Stream
      DataOutputStream Dout = new DataOutputStream(Fout);
      int i;
      i = 1234;
      long ll=1234;
      Dout.writeLong(ll);  // 8 Bytes
      editor.append("Long: "+ll+"\n");
      Dout.writeUTF("ABC");
      editor.append("String: "+"ABC"+"\n");
      Dout.writeLong(1234);  // 8 Bytes
      editor.append("Long: "+1234+"\n");
      Dout.writeDouble(1234.5678);  // 8 Bytes
      editor.append("Double: "+1234.5678+"\n");
      Dout.close();
      Fout.close();
      editor.append("\nEs wurde die Datei "+C_FILENAME+" erzeugt");
     }
     catch (IOException ee) {
         System.err.println("IOException: " + ee);
     }
  } // bn_write()



  public static void main(String argv[]) {
    readwriteStr2 frame = new readwriteStr2();
    frame.setVisible(true);
  }  // main
}


