# Die bösen IOTools.



## Destiny1985 (28. Jan 2005)

werden jetzt abgeschafft *gg*

Wollt mir eben die IOTools-Dateien öffnen um zu gucken wie Eingaben über die Konsole denn funktionieren. Blöderweise sind das .class Dateien, die ich nicht öffnen kannm, hab kein Proggie dafür. Kann auch keins installieren, weil ich dazu keine Rechte habe. Wäre also nett wenn mir jemand den Inhalt der der IOTools.class mal hier reinkopieren kann bzw mir so Beispiele gibt um zu zeigen, wie man Eingaben normalerweise realisiert.

Die IOTools in dem Paket Prog1Tools erhalten, das gibt es hier http://www.aifb.uni-karlsruhe.de/JumpTo/ProgInJava/Prog1Tools/Prog1Tools.zip


----------



## KSG9|sebastian (28. Jan 2005)

äähmm...du wirst auch mit den Class-Dateien nichts anfangen können, allerhöchstens mit .java-Dateien. Die class-Files müsstest du disassamblen und dann  hast du auch noch net viel sachen die du verstehst


----------



## hugo (28. Jan 2005)

Also mit den IOTools kann ich dir auch nicht helfen.

Auf der Konsole erfolgt die Ausgabe immer mit:

```
System.out.print(); // ohne folgenden Zeilenumbruch
System.out.println(); // mit Zeilenumbruch
```
In den Klammern können fast alle primitiven Datentypen als Parameter übertragen werden und natürlich String.

Bei der Eingabe sieht es dort schon ein wenig schwieriger aus. Dafür musst du auch auf jeden Fall das Package java.io importieren. Ich hoffe ich bekomm das noch hin:

```
StreamReader Eingabestrom = new InputStreamReader(System.in);
BufferedReader Pufferspeicher = new BufferedReader(Eingabestrom);
String EingabeText = Pufferspeicher.readLine();
```
Geht auch kürzer:

```
BufferedReader Pufferspeicher = new BufferedReader(new InputStreamReader(System.in);
String EingabeText = Pufferspeicher.readLine();
```


Jetzt hast du deine Eingabe als String und musst sie nottfalls nur noch umwandeln in den richtigen Datentyp. Bsp:

```
int Zahl = Integer.parseInt(EingabeText);
```


----------



## Destiny1985 (28. Jan 2005)

lol...wieso ist das hier so kompliziert gelöst und nicht wie zB in C++ mit "cin".

Was ist für mich jetzt der Nachteil wenn ich so eine Sammlung von Methoden wie die IOTools benutze, um meine Eingabe zu vereinfachen ?


----------



## hugo (28. Jan 2005)

Das ist die erste Vorbereitung mit dem Arbeiten von Streams für Netzwerke oder Dateiarbeit. Das Problem ist, dass die Ein-/Ausgabe vom System geregelt werden. Das System liefert also eine Eingabe als Datenstrom und der muss abgehört werden. Das paasiert praktisch mit dem InputStreamReader, ich wusste auch mal, warum man den BufferedReader noch benötigt, aber derzeit aus dem Gedächtnis  . Und dann gibst du eben an, wie du die Daten einlesen wills, als ganze Zeile oder Byteweise.


----------



## Destiny1985 (28. Jan 2005)

OK, werd damit nach der Frühstückspause mal ein bißchen rumspielen und probieren, bei Fragen meld ich mich wieder


----------



## thE_29 (28. Jan 2005)

cin und cout sind aber auch blödsinnige Funktionen 


da war ein scanf("%d",&integer);

schon besser


----------



## Stefan1200 (28. Jan 2005)

Habe die IOTools mal decompiliert...
Genau wie ich es erwartet habe, einfach nur Methoden die Mittels BufferedReader einen String von System.in lesen, und je nach Methode in einen Integer, Char, Long, Double, Float umwandeln oder halt beim String lassen und zurück geben.

Diese Dinge sind hier im Forum doch schon rauf und runter Diskutiert und erklärt worden! Einfach die suchen Funktion verwenden.


----------



## Guest (28. Jan 2005)

hugo hat gesagt.:
			
		

> ...Dafür musst du auch auf jeden Fall das Package java.io importieren...



wieso hängt man da einen Stern dran


```
import java.io.*;
```

Was ist dessen Funktion ?


----------



## Destiny1985 (28. Jan 2005)

wäre nett wenn jemand mal ein stück code postet von einem programm, wo man aufgefordert wird eine zahl einzugeben und diese dann einfach wieder ausgegeben wird...brauch 'nen beispiel 

thx


----------



## thE_29 (28. Jan 2005)

Das alle Unterklassen/packages auch importiert werden!

Sollte man eigentlich nicht machen, man sollte nur das importieren was man auch braucht!


----------



## hugo (28. Jan 2005)

Hier dein Beispiel:


```
import java.io.*;
public class HelloWorld
{
    public static void main(String[] args)
    { 
        System.out.println("Hello World einmal anders");
        System.out.println("Gebe einen beliebigen Text ein (mit Enter bestaetigen)");
        BufferedReader pufferspeicher = new BufferedReader(new InputStreamReader(System.in));
        try
        {
            String eingabeText = pufferspeicher.readLine();
        }
        catch(IOException IOE)
        {
            // nichts machen
        }
        System.out.println("Dein eingegebener Text: " + eingabeText);
        System.out.println("Zur Abwechselung mal eine Zahl als Double bitte:");
        try
        {
            eingabeText = pufferspeicher.readLine();
        }
        catch(IOException IOE)
        {
            // nichts machen
        }

        double zahl = Double.parseDouble(eingabeText) * 2.0;
        System.out.println("Das doppelte deiner Zahl ist: " + zahl);
     }
}
```
Schmeißt dir eine IOException, wenn du bei der Zahleneingabe kein Double eingibst.

Also wenn ich mich nicht irre sagt der Stern nur aus, dass alle Klassen im Package geladen werden, kein weiteren Packages usw..

_Beispiel Source korrigiert von Stefan1200, sorry Hugo
Hinter System.in fehlte eine Klammer.
Variablen Namen werden klein geschrieben.
Klammern hinter dem Klassennamen entfernt.
Variablen nur einmal anlegen...(eingabeText wurde zweimal mit String eingabeText angelegt)._

[edit hugo] try/catch-Blöcke eingefügt


----------



## Destiny1985 (28. Jan 2005)

OK danke für das beispiel, damit kann ich weiterarbeiten


----------



## Destiny1985 (28. Jan 2005)

OK für den Code oben spuckt er, wenn ich ihn ausführen will, folgende Fehler aus:


```
HelloWorld.java:3: '{' expected
public class HelloWorld()
                                

HelloWorld.java:18: '{' expected
^

2 errors
```

Warum ?


----------



## Stefan1200 (28. Jan 2005)

Destiny1985 hat gesagt.:
			
		

> OK für den Code oben spuckt er, wenn ich ihn ausführen will, folgende Fehler aus:
> 
> Warum ?



Beispiel oben habe ich korrigiert.


----------



## Destiny1985 (28. Jan 2005)

Fehler bestehen weiterhin...


----------



## Stefan1200 (28. Jan 2005)

Destiny1985 hat gesagt.:
			
		

> Fehler bestehen weiterhin...



Jo, er hatte noch einen Fehler gemacht, den ich beim ersten Mal übersehen habe. Sorry, ist jetzt auch weg.


----------



## Destiny1985 (28. Jan 2005)

Kein Problem...danke das du hilfst 

Fehler jetzt:


```
HelloWorld.java:12: eingabeText is already defined in main(java.lang.String[])
String eingabeText = pufferspeicher.readLine();
```


----------



## Stefan1200 (28. Jan 2005)

Uff, den nächsten Fehler korrigiert...
Jetzt sollte es aber gehen ;-)


----------



## Destiny1985 (28. Jan 2005)

Negativ...oO Ich hab das Gefühl ich bleib bei den IOTools ^^ Die Eingabe ist doch so ne Sache seh ich hier *lol*

Fehler jetzt:


```
HelloWorld.java:9: unreported exception java.io.IOException; must be caught or declared to be thrown
String eingabeText = pufferspeicher.readLine();

HelloWorld.java:12: unreported exception java.io.IOException; must be caught or declared to be thrown
String eingabeText = pufferspeicher.readLine();
```


----------



## hugo (28. Jan 2005)

Sorry, wenn ich euch so viel Arbeit mach, war bloß aus dem Bauch heraus geschrieben.

Die Exception löst du wie folgt:

```
try
{
   eingabeText = pufferspeicher.readLine(); 
}
catch(IOException IOE)
{
    System.out.println("Fehler bei der Eingabe"); // o.ä. wie es dir passt.
}
```


----------



## Destiny1985 (28. Jan 2005)

super das ich die ahnung von sowas hab *lol*

ähem ich will doch nur eine ganz simple eingabe machen...wieso muss ich dafür soviele code haben, exceptions lösen (kann ich doch gar nicht) etc... ?!

*frustriert*


----------



## Stefan1200 (28. Jan 2005)

Genug, jetzt schreibe ich es selbst:


```
import java.io.*;

public class HelloWorld
{
    public static void main(String[] args)
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String eingabe = "";
        String name = "";
        double ergebnis = 0.0;

        System.out.println("Bitte gebe deinen Namen ein:");

        try
        {
            name = br.readLine();
        }
        catch (IOException e)
        {
            name = "Hans Wurst";
        }

        System.out.println("Hallo " + name + "!");
        System.out.print("Bitte gebe eine Zahl ein, die ich mit zwei Multipliziere: ");
        
        try
        {
            eingabe = br.readLine();

            ergebnis = Double.parseDouble(eingabe) * 2;
            System.out.println("Das Ergebnis ist: " + ergebnis);
        }
        catch (IOException e)
        {
            System.out.println("Sorry, irgendwas ging schief...");
        }
        catch (NumberFormatException e2)
        {
            System.out.println("Sie sind gemein! Das ist keine Zahl: " + eingabe);
        }
    }
}
```

Den habe ich jetzt getestet, der funzt!


----------



## Destiny1985 (28. Jan 2005)

sehr schön, danke 

Die werd ich mir zu gemüte führen....


----------



## McSnoop (28. Jan 2005)

Stefan1200 hat gesagt.:
			
		

> Habe die IOTools mal decompiliert...



LOL

http://www.aifb.uni-karlsruhe.de/JumpTo/ProgInJava/Prog1Tools_src.zip

Was hast du verwendet zum decompilieren??

Hab mich noch nicht doll mit sowas beschäftigt, geht sowas immer mit beliebigen Java files??


----------



## Stefan1200 (28. Jan 2005)

McSnoop hat gesagt.:
			
		

> Was hast du verwendet zum decompilieren??
> 
> Hab mich noch nicht doll mit sowas beschäftigt, geht sowas immer mit beliebigen Java files??



http://www.kpdus.com/jad.html

Jep, alles was du ihm gibst.
Lediglich wenn Obusfactoren verwendet wurden, wird der Source etwas unleserlich, aber ansonsten alles.
Nur Kommentare fehlen natürlich.


----------



## McSnoop (28. Jan 2005)

*geil*

man benötigt aber alle .class files??

oder kann er die auch einzeln zerlegen??

da gibt es ein game (javagame)  und da ist immer einer auf platz 1.

da kann man sich ja nun denken wie er das geschafft hat. *gg*


----------



## Illuvatar (28. Jan 2005)

thE_29 hat gesagt.:
			
		

> Das alle Unterklassen/packages auch importiert werden!
> 
> Sollte man eigentlich nicht machen, man sollte nur das importieren was man auch braucht!



Das Thema hatten wir schon... Im Bytecode macht das keinen Unterschied, was er besser fined3t, muss jeder selbst wissen. Ich hasse die Schreibweise wo zuerst 75 importdeklarationne stehen, wo es auch 7 sein könnten


----------



## Illuvatar (28. Jan 2005)

McSnoop hat gesagt.:
			
		

> *geil*
> 
> man benötigt aber alle .class files??
> 
> ...



Ja, bei allen Games ist es möglich auf eine solche Art und Weise zu cheaten aber bei Java ist das leider besonders einfach.


----------



## McSnoop (28. Jan 2005)

naja er wird denk ich mal sich die funktionsweise angeschaut haben und sich nen generator geschrieben haben der ihm die optimalse lösung ausspuckt. ich hab mal versuch ein Proggy zu schreiben was mir die lösung bringt aber in dem Game kamen dann exponentiell so viele varianten zusammen da hätte mein rechner mehr als ne woche zum berechnen gebraucht und das game geht immer nur 7 tage. =(


----------



## Destiny1985 (1. Feb 2005)

So, ich muss zugeben, ich steig in Sachen Eingabe net ganz durch...zu diesem hier wäre eine Erklärung mal nett


```
import java.io.*;

public class eingabeTest
{
  public static void main (String[] args)
  {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String eingabe = "";
    double ergebnis = 0.0;

    System.out.print("Bitte gebe eine Zahl ein, die ich dann wieder ausgebe: ");

    try
    {
      eingabe = br.readLine();
      ergebnis = Double.parseDouble(eingabe);
      System.out.println("Das Ergebnis ist: " + ergebnis);
    }
    catch (IOException e)
    {
      System.out.println("Sorry, irgendwas ging schief...");
    }
    catch (NumberFormatException e2)
    {
      System.out.println("Sie sind gemein! Das ist keine Zahl: " + eingabe);
    }
  }
}
```

konkrete fragen:

wieso brauch man hier einen string und eine double-zahl ?


```
String eingabe = "";
    double ergebnis = 0.0;
```

was hat es mit try-catch auf sich ? ist das unbedingt notwendig ? hatte sowas noch nicht..


```
ergebnis = Double.parseDouble(eingabe);
```

was macht das Double.parseDouble um alles in der welt....


Am besten wäre es, wenn mir einer mal von oben bis unten das ding durcherklärt...dann kick ich auch die IOTools in die Ecke, versprochen 

mfg


----------



## Beni (1. Feb 2005)

Das Programm liest zuerst einen Text von der Konsole, der String "eingabe" wird benötigt, um den Text zwischenzuspeichern. Dann wandelt es diesen Text in einen double um (der in "ergebnis") gespeichert wird (dies wird von der Methode "parseDouble" gemacht). Schlussendlich wird der double wieder in Text umgewandelt, und auf die Konsole geschrieben.

Man muss (nicht immer, aber man sollte) ein try-catch Block um eine Codestelle herum schreiben, welche einen Fehler produzieren könnte.
Beispiel: Jemand gibt "blupp" ein. "blupp" kann nicht in eine Zahl umgewandelt werden. Die Methode "parseDouble" bemerkt dies, da dies ein ziemlich schlimmer Fehler ist, wirft die Methode eine "NumberFormatException". Der try-catch-Block fängt diese Exception auf, und gibt die Meldung "Sie sind gemein..." aus.


----------



## Destiny1985 (1. Feb 2005)

kann man denn nicht direkt eine Zahl eingeben ? Und was für Umwandlungen sind denn möglich usw...steht das irgendwo ?

zb wenn ich 

```
ergebnis = Double.parseDouble(eingabe)
```
nicht als double haben will sondern integer

mfg


----------



## Beni (1. Feb 2005)

So wie auf der Festplatte nur 1 und 0 steht, steht auf der Konsole nur Text. Dass dieser Text eine Zahl darstellt ist deine Interpretation.

Und: das mit dem Integer kriegst du hin, nur mal scharf nachdenken (und vielleicht in der API nachgucken) :wink:


----------



## Destiny1985 (1. Feb 2005)

*lol* net lachen aber was is die API 

Deine aussage ist btw nicht sehr hilfreich..."das ist deine Interpretation"...ja danke...ich versteh das ja auch nicht weil ich es gerade versuche zu lernen...


----------



## Beni (1. Feb 2005)

Ok: Für die Konsole steht dort "Text". Dass dieser Text aber eine Zahl sein soll, weiss die Konsole nicht (woher auch?).
Deshalb "deine Interpretation", dass das eine Zahl, und kein Text sein soll.

Die API ist *die* Informationsquelle für alle Fragen :bae:


----------



## Stefan1200 (1. Feb 2005)

Destiny1985 hat gesagt.:
			
		

> *lol* net lachen aber was is die API
> 
> Deine aussage ist btw nicht sehr hilfreich..."das ist deine Interpretation"...ja danke...ich versteh das ja auch nicht weil ich es gerade versuche zu lernen...



Das ist die API:
http://java.sun.com/j2se/1.4.2/docs/api/
Gibt es auch zum Offline Download auf der Homepage von Sun.

Wenn du die Konsole ausliest, bekommst du immer ein String zurück. Wenn du also weißt, der Benutzer sollte eine Zahl eingeben, zum Beispiel ein Integer, muss du diesen String in einen Integer umwandeln.

In meinem Code Beispiel siehst du, wie man ein String in ein Double umwandelt, mit der Klasse Double. Wenn es nun eine Klasse Double gibt, liegt es recht nahe, das es auch eine Klasse Integer gibt, wie auch Short, Float, Long...
Alle haben eine Methode die mit parse anfängt.

Wie die Methoden genau heissen, und was diese machen, steht in der API:

Short:
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Short.html
Integer:
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Integer.html
Long:
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Long.html
Float:
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Float.html
Double:
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Double.html


----------



## Destiny1985 (1. Feb 2005)

Dank dir ! DAS ist mal ne kompetente Hilfe 

*nichts gegen dich Beni *


----------

