Zurück   Android-Hilfe.de > Android Developer > Android App Entwicklung


Jetzt kostenlos registrieren. Mitglieder surfen ohne Werbung auf Android-Hilfe.de!

Nutzung des FileInput/OutputStreams

Das Thema "Nutzung des FileInput/OutputStreams" befindet sich unter Android App Entwicklung auf Android-Hilfe.de.


Antwort

 

Themen-Optionen Ansicht
Alt 16.12.2009, 19:34   #1 (permalink)
Android-Hilfe.de Mitglied
 
Benutzerbild von Keija

Modell: Motorola Milestone

Registriert seit: 08.11.2009
Beiträge: 167
Abgegebene Danke: 10
Erhielt 2 Danke für 2 Beiträge
Standard Nutzung des FileInput/OutputStreams

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!
Keija ist offline   Mit Zitat antworten
Alt 16.12.2009, 23:19   #2 (permalink)
Android-Hilfe.de Mitglied
 
Benutzerbild von Melbar

Modell: LG P990

Registriert seit: 16.05.2009
Beiträge: 89
Abgegebene Danke: 2
Erhielt 24 Danke für 19 Beiträge
Standard AW: Nutzung des FileInput/OutputStreams

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
Melbar ist offline   Mit Zitat antworten
Folgender Benutzer bedankt sich bei Melbar für diesen Beitrag:
Keija (17.12.2009)
Alt 17.12.2009, 00:42   #3 (permalink)
Android-Hilfe.de Mitglied
 
Benutzerbild von Keija

Modell: Motorola Milestone

Registriert seit: 08.11.2009
Beiträge: 167
Abgegebene Danke: 10
Erhielt 2 Danke für 2 Beiträge
Standard AW: Nutzung des FileInput/OutputStreams

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
Keija ist offline   Mit Zitat antworten
Alt 20.12.2009, 15:04   #4 (permalink)
Android-Hilfe.de Mitglied
 
Benutzerbild von Keija

Modell: Motorola Milestone

Registriert seit: 08.11.2009
Beiträge: 167
Abgegebene Danke: 10
Erhielt 2 Danke für 2 Beiträge
Standard AW: Nutzung des FileInput/OutputStreams

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

Geändert von Keija (21.12.2009 um 15:20 Uhr)
Keija ist offline   Mit Zitat antworten
Antwort

Stichworte
-

Themen-Optionen
Ansicht


Ähnliche Themen

Thema Autor Forum Antworten Letzter Beitrag
Modemnutzung nachweisen wusselwu Smalltalk und Offtopic 22 26.07.2010 14:40
Nutzung ohne Google-Account bornheim HTC Hero / T-Mobile G2 Touch Forum 6 13.12.2009 22:22
O2 My Handy + Nutzung mit D1 Gruendlich Motorola Milestone Forum 3 17.11.2009 21:30
Skype Nutzung WebWorks Tarife / Provider für T-Mobile G1 1 26.09.2009 22:58
WLAN-UMTS Nutzung Mottek Android Allgemein 5 03.06.2009 17:53




Du liest gerade: "Nutzung des FileInput/OutputStreams" unter "Android App Entwicklung" auf Android-Hilfe.de.


Powered by vBulletin®
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Search Engine Friendly URLs by vBSEO
© Android-Hilfe.de 2012 - All rights reserved.