1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Nutzung des FileInput/OutputStreams

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Keija, 16.12.2009.

  1. Keija, 16.12.2009 #1
    Keija

    Keija Threadstarter Erfahrener Benutzer

    Beiträge:
    171
    Erhaltene Danke:
    2
    Registriert seit:
    08.11.2009
    Hallo leute, ich stehe nach mehreren stunden rumprobieren und rätseln leider vor einem problem, bei dem mir meine google such fähigkeiten leider nicht viel geholfen haben. ..

    ich will, ganz simpel, den highscore meines Tetris spiels in einem File speichern und beim starten des Spiels einlesen. (bei game over dann speichern)

    ich habe als erstes natürlich auf der android seite geschaut und folgendes gefunden:
    Data Storage | Android Developers

    und dann mit meinen alten java kenntnissen folgendes gebastelt:

    Code:
    // int highscore = 8; z.b.
    // score soll die datei heissen, in die ich schreiben will
    try {                
         FileOutputStream stream = myContext.openFileOutput("score", 0);        
                    PrintStream ps = new PrintStream(stream);
                    ps.print(highscore);
                    ps.close();
                    stream.close();
      
                } catch [...]
                }
    soweit so gut, mit dem debugger bin ich das durchgegangen und er liefert keine fehlermeldung.
    leider kann ich nicht verifizieren ob er das file erstellt, da ich nicht weiss, wo android das macht - vielleicht liegt auch da schon gleich das problem, muss ich einen genauen Pfad angeben? (./sdcard ...)

    naja, also wie gesagt, da kommt zumindest keine fehlermeldung.
    wenn ich aber nun versuche einzulesen, bekomme ich eine EndOfFileException:

    Code:
    try {
                    FileInputStream instream = context.openFileInput("score");
    
                    DataInputStream in = new DataInputStream(instream);
                    this.highScore = in.readInt();
                    in.close();
                    instream.close();
                  } catch [...]
                }
    ich weiss, dass ich keine endoffile abfrage drin habe, allerdings sollte er ja mindestens ein int vorfinden und weitere lese ich ja nicht ...

    sind das überhaupt die richtigen befehle um zu lesen und zu schreiben?

    habt ihr nen tipp? oder ne idee, wie ich mit dem debugger rausfinden kann, ob er das file wirklich kreeirt und soweiter?

    danke im Vorraus!
     
  2. Melbar, 16.12.2009 #2
    Melbar

    Melbar Android-Hilfe.de Mitglied

    Beiträge:
    84
    Erhaltene Danke:
    23
    Registriert seit:
    16.05.2009
    Phone:
    Samsung Galaxy S3
    Hallo,

    ich hab mal deinen Code ein bisschen angepasst. Dein Hauptproblem lag an PrintStream welches deinen int Wert in Klartext abspeichert, DataInputStream/DataOutputStream arbeiten da anders. Deshalb bekommst du auch die EOF Exception, diese wird geworfen weil das Ende erreicht wird bevor vier Bytes gelesen werden können.

    Code:
    try {
                FileOutputStream stream = new FileOutputStream("/sdcard/score");
                DataOutputStream ps = new DataOutputStream(stream);
                ps.writeInt(highscore);
                ps.close();
                stream.close();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            try {
    
                FileInputStream instream = new FileInputStream("/sdcard/score");
                DataInputStream in = new DataInputStream(instream);
                highscore += in.readInt();
                in.close();
                instream.close();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
    Wie du am Code siehst hab ich die Datei mal auf dei SD-Karte gelegt. Wenn du es so verwenden möchtest darfst du die Permission nicht vergessen.

    Code:
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    
    Ohne angabe eines Pfades wird die Datei unter den Applikationsdaten gespeichert, der Ort ist /data/data/packagename/files. Das kannst du dir natürlich auch anschauen einfach in Eclipse die Ansicht DDMS öffnen dort gibt es einen File Explorer mit dem du dich auf dem Emulator bzw. der SD-Karte umschauen kannst.

    Du kannst deine Highscores auch in einer anderen Weise einfacher Speichern, Stichwort Serialisieren von Objekten. Auf der Seite is es schön erklärt und ein Beispiel ist auch dabei.

    Viel Spaß,
    Stefan
     
    Keija bedankt sich.
  3. Keija, 17.12.2009 #3
    Keija

    Keija Threadstarter Erfahrener Benutzer

    Beiträge:
    171
    Erhaltene Danke:
    2
    Registriert seit:
    08.11.2009
    hi, danke für die ausfürhliche antwort! ist ja echt tip top hier ^^ ...

    werds morgen in aller ruhe mal ausprobieren :)

    danke für die errinnerung ans serialisieren ^^ hatte ich auch schon wieder ganz vergessen - hatte eigentlich nur vor einen int zu speichern, aber im prinzip könnt ich mir auch ne highscore klasse schreiben. gute idee :)
     
  4. Keija, 20.12.2009 #4
    Keija

    Keija Threadstarter Erfahrener Benutzer

    Beiträge:
    171
    Erhaltene Danke:
    2
    Registriert seit:
    08.11.2009
    so, habs jetzt hinbekommen und wollte doch meine lösung hier posten :)
    Leider hats mir heute morgen 5 stunden arbeit zerschossen, sodass ich jetzt mit meinem tetris projekt aufhöre ^^

    ScoreObj ist ein Objekt meiner Serialisierbaren Score klasse =]

    Schreiben:
    Code:
    try {
                    
                    BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream("/sdcard/score"));
                    
                    ObjectOutputStream oos = new ObjectOutputStream(stream);
                    oos.writeObject(scoreObj);
                    oos.close();    
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
    Lesen:
    Code:
        try {
    
                    BufferedInputStream bs = new BufferedInputStream(new FileInputStream("/sdcard/score"));
                    ObjectInputStream objIn = new ObjectInputStream(bs);
                    
                    highScore = (Score) objIn.readObject( );
                    objIn.close(); 
                    bs.close();
                    
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } catch (StreamCorruptedException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
    danke nochmal für die Hilfe
     
    Zuletzt bearbeitet: 21.12.2009

Diese Seite empfehlen