Datei erstellen und reinschreiben

  • 18 Antworten
  • Letztes Antwortdatum
A

audacity363

Gast
Guten Tag ich bins mal wieder :)

Also dieses mal ist es so: Ich müsste eine Datei erstellen und ein Array reinschreiben. An sich nichts großes nur der Code will mal wieder nicht so wie ich. Also ich habe bis jetzt folgendes:
Code:
try {
				out = new BufferedWriter(new FileWriter("/sdcard/steuerung/meinFile.txt"));
			        out.write("test");
			        out.close();
			      } 
			catch (Exception r) 
			      { 
					File test = new File("/sdcard/steuerung/meinFile.txt");
					test.mkdir();
					try
					{
					test.createNewFile();
					}
					catch(Exception t)
					{
						
					}
}

Laut Google und meinem Ermessen bewirkt dieser Code das versucht wird eine Datei(meinFile.txt) zu öffnen und "test" hineingeschrieben wird. Wenn das ganze nicht klappt werden die benötigten Verzeichnisse erstellt und die Datei.
Die Permissions sind auch gesetzt:
Code:
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Der Log sagt aber das er die Rechte nicht hätte die Datei zu öffnen. Also weiter Gegoogelt und herausgefunden das der Emulator keinen Speicher besitzt in den man irgendwas schreiben könnte also das ganze als APK auf Handy gezogen. Aber auch dort wird nichts erstellt oder sonst was. Die App verhält sich ganz normal.
 
Im Manifest die Permission für Speicherkartenzugriff oder so ähnlich gesetzt?
 
Johan schrieb:
Im Manifest die Permission für Speicherkartenzugriff oder so ähnlich gesetzt?

Ich antworte antworte einfach mal mit einem Zitat :)

audacity363 schrieb:
Die Permissions sind auch gesetzt:
Code:
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Der Log sagt aber das er die Rechte nicht hätte die Datei zu öffnen.
 
Zuerst als Info: Du kannst im Emulator (bzw. dort, wo du ein Virtual Device erstellst) einstellen, ob es eine emulierte SD Karte haben soll und wie gross sie ist. Dadurch kannst du normal im Emulator testen.

Ich hab zwar keine Ahnung von der genauen Fehlermeldung, aber da scheinen einige Probleme in deinem Code zu sein:

  • mkdir() macht bei dir sicher nicht das, was du erwartest. Es erstellt nämlich einen Ordner namens meinFile.txt
  • mkdir() erstellt nur diesen einen Ordner, nicht alle Parent-Ordner auch. Dafür gibts dann mkdirs()
  • du solltest nicht direkt den Pfad auf die SD Karte angeben, sondern dir diesen via Environment.getExternalStorageDirectory() geben lassen. Der kann von Gerät zu Gerät unterschiedlich sein.
  • (man sollte zuerst noch prüfen, ob die SD Karte überhaupt vorhanden ist, aber das habe ich im Beispiel unten auch mal weggelassen)

Hier noch ein komplettes Beispiel:

Code:
try {

    String path = Environment.getExternalStorageDirectory().getPath() + "/steuerung/meinFile.txt";
    File f = new File(path);

    //wenn das File nocht existiert -> Folders und File erstellen
    if(!f.exists()) {
        f.getParentFile().mkdirs();
        f.createNewFile();
    }

    BufferedWriter out = new BufferedWriter(new FileWriter(f));
    out.write("test");
    out.close();

} catch (IOException ex) {

    System.out.println("Error: " + ex.getMessage());
    ex.printStackTrace();

}
 
  • Danke
Reaktionen: audacity363
Okey Danke jetzt funktioniert es nur jetzt macht das auslesen Mucken:

Ich muss jede Zeile einzeln auslesen, beim Leerzeichen splitten und dann verarbeite ich das ganze:

Code:
String file = "sdcard/steuerung/tmp.txt";
    	        String[] tmp = {"", "", "","","",""};
				try
				{
	    	        BufferedReader buffer=new BufferedReader(new FileReader(file));
	    	        
	    	        String line="";
	    	        int i = 1;
	    	        
	    	        while ((line = buffer.readLine()) != null)   
	    	        {
	    	        	System.out.println(i);
	    	        	if(i == 1)
	    	        	{
	    	        		System.out.println(line);
	    	        		tmp = line.split(" ");
	    	        		if(tmp[0].equals("ON"))
	    	        		{
	    	        			if(tmp[1].equals(" "))
	    	        			{
	    	        				tmp[1] = "Button1";
	    	        			}
	    	        			b1.setText(tmp[1]);
	    	        			b1.setVisibility(0);
	    	        			Box1.setVisibility(0);
	    	        		}
	    	        		else
	    	        		{
	    	        			System.out.println("false" + i);
	    	        			b1.setVisibility(View.INVISIBLE);
	    	        			Box1.setVisibility(View.INVISIBLE);
	    	        		}
}
}

Das ganze passiert 17 mal mit anderen Werten. Nur sobald er einmal im else war gibt er die Exception:"java.lang.ArrayIndexOutOfBoundsException: length=1; index=1" aus.

Die Zeilen werden alle laut dem Log richtig ausgelesen und auch gesplittet.
 
kurze andere frage (oder ich übersehe das gerade) wofür brauchst du int i?
du setzt das einmal auf 1 und prüfst dann ob es 1 ist (was es immer sein dürfte).

Dein indexoutofbound dürfte auftrefen, wenn in einer Zeile mal nich gesplittet werden kann, kann es sein, dass du evtl eine Leerzeile am Ende der Datei hast?
 
Ohh das int i ist beim kopieren verloren gegangen. Dies wird immer am Ende der IF/else Abfrage um eins erhöht damit ich weiß in welcher Zeile ich bin. Wie gesagt das ganze passiert 17 mal aber immer mit anderen b1/Box1 Werten also z.B. b2 und Box2. Ok das kann gut sein. Das ganze ist dafür gedacht das ein CheckBox Wert mit ON oder OFF gespeichert wird. Hinter On steht dann immer noch etwas aber hinter OFF nicht mehr. Wie kann man das ganze denn unterbinden? Mit einem Try/catch Block funktioniert nicht.
 
Okey das mit dem Fehler hab ich jetzt behoben indem ich sichergestellt habe das auf jeden Fall etwas drin steht. Jetzt besteht wieder ein Fehler mit einer Datei:
Habe dein Beispiel von oben noch ein wenig verändert damit er wenn die Datei/Pfad schon besteht die Datei einfach öffnet:
Code:
String path = Environment.getExternalStorageDirectory().getPath() + "/steuerung/server_tmp.txt";
        File f = new File(path);
		try
		{
			if(!f.exists()) 
			{
		        f.getParentFile().mkdirs();
		        f.createNewFile();
		        BufferedWriter out = new BufferedWriter(new FileWriter(f));
		        out.write("test");
		        out.close();
		        
		    }
			else
			{
		        BufferedReader buffer =new BufferedReader(new FileReader(f));
		        while ((line = buffer.readLine()) != null)   
		        {
		        	
		        }
		        Server = line;
			}
		}
		catch(Exception e)
		{
			System.out.println(e.toString());
		}
Das ganze steht ganz am Anfang der MainAcitivity also nachdem die Oberfläche geladen wurde. Auf jeden Fall schließt sich die App sofort wieder und ich bekomme eine FATAL EXCEPTION: main zurück. Diese trägt aber nicht mein tag sondern: AndroidRuntime.

kompletter Fehler:
Code:
07-25 20:39:14.605: E/AndroidRuntime(18942): FATAL EXCEPTION: main
07-25 20:39:14.605: E/AndroidRuntime(18942): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.raspberrypi.steuerung/com.raspberrypi.steuerung.MainActivity}: java.lang.NullPointerException
07-25 20:39:14.605: E/AndroidRuntime(18942): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
07-25 20:39:14.605: E/AndroidRuntime(18942): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
07-25 20:39:14.605: E/AndroidRuntime(18942): 	at android.app.ActivityThread.access$700(ActivityThread.java:140)
07-25 20:39:14.605: E/AndroidRuntime(18942): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
07-25 20:39:14.605: E/AndroidRuntime(18942): 	at android.os.Handler.dispatchMessage(Handler.java:99)
07-25 20:39:14.605: E/AndroidRuntime(18942): 	at android.os.Looper.loop(Looper.java:137)
07-25 20:39:14.605: E/AndroidRuntime(18942): 	at android.app.ActivityThread.main(ActivityThread.java:4921)
07-25 20:39:14.605: E/AndroidRuntime(18942): 	at java.lang.reflect.Method.invokeNative(Native Method)
07-25 20:39:14.605: E/AndroidRuntime(18942): 	at java.lang.reflect.Method.invoke(Method.java:511)
07-25 20:39:14.605: E/AndroidRuntime(18942): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
07-25 20:39:14.605: E/AndroidRuntime(18942): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
07-25 20:39:14.605: E/AndroidRuntime(18942): 	at dalvik.system.NativeStart.main(Native Method)
07-25 20:39:14.605: E/AndroidRuntime(18942): Caused by: java.lang.NullPointerException
07-25 20:39:14.605: E/AndroidRuntime(18942): 	at com.raspberrypi.steuerung.MainActivity.onCreate(MainActivity.java:229)
07-25 20:39:14.605: E/AndroidRuntime(18942): 	at android.app.Activity.performCreate(Activity.java:5206)
07-25 20:39:14.605: E/AndroidRuntime(18942): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
07-25 20:39:14.605: E/AndroidRuntime(18942): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
 
Was steht in deiner MainActivity in Zeile 229?
Irgendwas, was da steht ist null.
 
Code:
if(Server.equals("") == false)

Aber was hat das mit der Datei Abfrage oben zu tun, weil sobald ich diese wieder weg nehme funktioniert alles wieder.
 
Weil da der Fehlerauftritt, vermutlich ist Server leer

Warum und wieso musst du jetzt selber rausfinden.

Oder die Abfrage ändern zu
if (Server != null && !Server.equals(""))

oder umdrehen
if ("".equals(Server) == false)

besser noch
if (!"".equals(Server))

Dann tritt da kein NullPointer mehr auf
 
Okey habs jetzt. Lag daran das die letzte Zeile der Datei leer war und daraus resultierte dann die NullException
 
Hallo,

ich bin seit 3 Wochen auch schon daran Textdateien zu speichern, jedoch ohne Erfolg.
Habe dieses Thema gerade im Forum gefunden und mich mal an dem Code probiert - in der Hoffnung dass es mit diesem endlich klappt. Jedoch wieder erfolglos.
Beim Start des Programms kommt die Fehlermeldung, dass das Programm beendet wurde. Das heißt ich konnte die Methoden noch nicht einmal ausprobieren.

Im LogCat erscheinen auch unzählige Meldungen, mit denen ich leider nichts anfangen kann:


11-25 17:33:25.461: E/Trace(623): error opening trace file: No such file or directory (2)
11-25 17:33:25.511: D/AndroidRuntime(623): Shutting down VM
11-25 17:33:25.511: W/dalvikvm(623): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
11-25 17:33:25.531: E/AndroidRuntime(623): FATAL EXCEPTION: main
11-25 17:33:25.531: E/AndroidRuntime(623): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.javasamples.filedemo2/com.javasamples.filedemo2.MainActivity}: java.lang.ClassNotFoundException: com.javasamples.filedemo2.MainActivity
11-25 17:33:25.531: E/AndroidRuntime(623): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1983)
11-25 17:33:25.531: E/AndroidRuntime(623): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
11-25 17:33:25.531: E/AndroidRuntime(623): at android.app.ActivityThread.access$600(ActivityThread.java:130)
11-25 17:33:25.531: E/AndroidRuntime(623): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
11-25 17:33:25.531: E/AndroidRuntime(623): at android.os.Handler.dispatchMessage(Handler.java:99)
11-25 17:33:25.531: E/AndroidRuntime(623): at android.os.Looper.loop(Looper.java:137)
11-25 17:33:25.531: E/AndroidRuntime(623): at android.app.ActivityThread.main(ActivityThread.java:4745)
11-25 17:33:25.531: E/AndroidRuntime(623): at java.lang.reflect.Method.invokeNative(Native Method)
11-25 17:33:25.531: E/AndroidRuntime(623): at java.lang.reflect.Method.invoke(Method.java:511)
11-25 17:33:25.531: E/AndroidRuntime(623): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
11-25 17:33:25.531: E/AndroidRuntime(623): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-25 17:33:25.531: E/AndroidRuntime(623): at dalvik.system.NativeStart.main(Native Method)
11-25 17:33:25.531: E/AndroidRuntime(623): Caused by: java.lang.ClassNotFoundException: com.javasamples.filedemo2.MainActivity
11-25 17:33:25.531: E/AndroidRuntime(623): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61)
11-25 17:33:25.531: E/AndroidRuntime(623): at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
11-25 17:33:25.531: E/AndroidRuntime(623): at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
11-25 17:33:25.531: E/AndroidRuntime(623): at android.app.Instrumentation.newActivity(Instrumentation.java:1053)
11-25 17:33:25.531: E/AndroidRuntime(623): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1974)
11-25 17:33:25.531: E/AndroidRuntime(623): ... 11 more




Vielleicht kann mir jemand einen Tipp geben ? :)

MfG

Mr.DH
 
Liegt deine Klasse wirklich in dem angegeben Package?
Oder hast du das nur in die Manifest Datei geschrieben (kopiert?).
Der findet nämlich deine MainActivity nicht wenn ich die Fehlermeldung richtig interpretiere.
 
Die Klasse liegt in dem selben Package wie auch die Manifest-Datei.
Muss die Klasse zwingend "MainActivity" heißen oder ist das egal ?
Ich hatte sie nämlich nach einem Beispiel aus Youtube benannt und danach eben mit verschiedenen Code-Beispielen "rumgedoktort" ...
 
Ja sie muss so heißen ODER du änderst das in der Manifest Datei auch.
Sonst will erhalt die MainActivity starten findet diese aber nicht.
Deswegen ja auch:
java.lang.ClassNotFoundException: com.javasamples.filedemo2.MainActivity

Die Klasse gibt es dann bei dir ja nicht, weil sie anders heißt.
Also Entweder Klasse in MainActivity umbennen oder Manifest auf den neuen Namen ändern.
 
Wow! Doch so einfach :)
Danke :smile:

Jetzt noch eine Frage: Um auf die Datei vom PC zugreifen zu können, muss ich mit "MODE_WORLD_READABLE" bzw. "WRITEABLE arbeiten, oder?

Dann kommt nämlich die Meldung "Context.MODE_WORLD_READABLE is deprecated" :sad:

Das ist die entsprechende Codezeile:

BufferedWriter out = new BufferedWriter(new FileWriter(f), Context.MODE_WORLD_WRITEABLE);

 
Unglaublich aber wahr. Es funktioniert :)
Vielen vielen Dank ! :thumbsup::thumbsup:

Die Datei vom vorhergehenden versuch ist übrigens auch aufgetaucht als ich nach der neuen Datei gesucht habe. Sie war nicht auf der SD-Karte sondern im internen Speicher.

Hauptsache es funktioniert ... nach Ewigkeiten von googeln ^^

Danke :biggrin:
 

Ähnliche Themen

AnnaBauer21
Antworten
0
Aufrufe
253
AnnaBauer21
AnnaBauer21
D
Antworten
8
Aufrufe
535
jogimuc
J
S
Antworten
7
Aufrufe
709
Silvasurf
S
AnnaBauer21
Antworten
6
Aufrufe
599
AnnaBauer21
AnnaBauer21
Jennywise
Antworten
2
Aufrufe
323
Jennywise
Jennywise
Zurück
Oben Unten