Die bösen IOTools.

Status
Nicht offen für weitere Antworten.
D

Destiny1985

Gast
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

Top Contributor
ää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

Bekanntes Mitglied
Also mit den IOTools kann ich dir auch nicht helfen.

Auf der Konsole erfolgt die Ausgabe immer mit:
Code:
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:
Code:
StreamReader Eingabestrom = new InputStreamReader(System.in);
BufferedReader Pufferspeicher = new BufferedReader(Eingabestrom);
String EingabeText = Pufferspeicher.readLine();
Geht auch kürzer:
Code:
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:
Code:
int Zahl = Integer.parseInt(EingabeText);
 
D

Destiny1985

Gast
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

Bekanntes Mitglied
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 :oops: . Und dann gibst du eben an, wie du die Daten einlesen wills, als ganze Zeile oder Byteweise.
 
D

Destiny1985

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

thE_29

Top Contributor
cin und cout sind aber auch blödsinnige Funktionen :)


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

schon besser :)
 

Stefan1200

Top Contributor
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.
 
G

Guest

Gast
hugo hat gesagt.:
...Dafür musst du auch auf jeden Fall das Package java.io importieren...

wieso hängt man da einen Stern dran

Code:
import java.io.*;

Was ist dessen Funktion ?
 
D

Destiny1985

Gast
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

Top Contributor
Das alle Unterklassen/packages auch importiert werden!

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

hugo

Bekanntes Mitglied
Hier dein Beispiel:

Code:
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
 
D

Destiny1985

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

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

HelloWorld.java:18: '{' expected
^

2 errors

Warum ?
 
D

Destiny1985

Gast
Kein Problem...danke das du hilfst :)

Fehler jetzt:

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

Destiny1985

Gast
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:

Code:
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

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

Die Exception löst du wie folgt:
Code:
try
{
   eingabeText = pufferspeicher.readLine(); 
}
catch(IOException IOE)
{
    System.out.println("Fehler bei der Eingabe"); // o.ä. wie es dir passt.
}
 
D

Destiny1985

Gast
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

Top Contributor
Genug, jetzt schreibe ich es selbst:

Code:
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!
 

McSnoop

Bekanntes Mitglied
*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

Top Contributor
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

Top Contributor
McSnoop hat gesagt.:
*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*

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

Bekanntes Mitglied
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. =(
 
D

Destiny1985

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

Code:
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 ?

Code:
  String eingabe = "";
    double ergebnis = 0.0;

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

Code:
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
 
B

Beni

Gast
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.
 
D

Destiny1985

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

zb wenn ich
Code:
ergebnis = Double.parseDouble(eingabe)
nicht als double haben will sondern integer

mfg
 
B

Beni

Gast
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:
 
D

Destiny1985

Gast
*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...
 
B

Beni

Gast
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

Top Contributor
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
 
D

Destiny1985

Gast
Dank dir ! DAS ist mal ne kompetente Hilfe :)

*nichts gegen dich Beni ;)*
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben