# Textdatei aus Assets lesen



## Xym13 (28. Okt 2012)

Hallo,

ich versuche für meine App eine Textdatei einzulesen. Die App ist ein Spiel und nutzt daher Slick AE (Android Version).

Bin mir nicht ganz sicher, wie ich das machen soll, da meine Main Klasse nicht von der Klasse Activity erbt.

Habe es so versucht:

Data.java

```
package de.game;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

import android.app.Activity;


public class Data extends Activity {

	public Data() {
		super();
	}
	
	public String readFile(String fileName) {
			try 
			{
				BufferedReader br = new BufferedReader(new FileReader(getResources().getAssets().toString()+fileName));
				
				while(br.readLine() != null) {
					return br.readLine();
				}
			} catch (IOException e) {
				e.printStackTrace();
			} 
			
			return "";
	}
	
	public void saveFile(String lines[]) {
		
	}
	
}
```

Main.java

```
...
public class Main extends BasicGameState {

...

public static Data daten = new Data();

...

public void render(....) {
...
g.drawString(daten.readFile("test.txt"), 0, 0);

.....
```

Hier bekomme ich eine NullPointerException herraus, da die Datei nicht gefunden wird. Habe aber leider keine Idee wie ich es sonst machen soll.


----------



## schlingel (28. Okt 2012)

Wie kommst du überhaupt auf die Idee, dass die Zeile:


```
BufferedReader br = new BufferedReader(new FileReader(getResources().getAssets().toString()+fileName));
```

das File findet? getAssets() liefert ein AssetManager-Objekt zurück. Wenn man in die Doku schaut, steht da nichts davon, dass hier ein Verzeichnispfad zurück kommt. Selbst wenn, müsstest du den Pfad ja noch richtig zusammen bauen - was du da nicht machst.

Mit dem AssetManager-Objekt kannst du allerdings direkt das File öffnen. In etwa so:


```
BufferedReader br = new BufferedReader(new InputStreamReader(getRessources().getAssets().open(fileName, AssetManager.ACCESS_STREAMING));
```

Warum erbt Data von Activity? Das ist ja gar keine UI-Klasse!?


----------



## Xym13 (28. Okt 2012)

Wenn ich deine Zeile nehme gibt mir Eclipse diese Fehlermeldung:

The constructor BufferedReader(InputStreamReader) is undefined


----------



## schlingel (29. Okt 2012)

> The constructor BufferedReader(InputStreamReader) is undefined


Irgend etwas machst du falsch. (Nicht alles importiert?)

Das Forum verlinkt sogar auf die Doku zu den Klassen und BufferedReader hat einen Konstruktor mit einem Reader als Parameter und InputStreamReader ist eine Unterklasse von Reader. Das funktioniert also!


----------



## Xym13 (29. Okt 2012)

Meine Klasse sieht jetzt so aus:

```
package de.game;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;

import android.app.Activity;
import android.content.ContextWrapper;
import android.content.res.AssetManager;


public class Data extends Activity{
	
	public String readFile(String fileName) {
		
		String s = "Datei konnte nicht eingelesen werden.";
		
			try 
			{
				BufferedReader br = new BufferedReader(new InputStreamReader(getResources().getAssets().open("test.txt", AssetManager.ACCESS_STREAMING)));
				while(br.readLine() != null) {
					s = br.readLine();
				}
			} catch (IOException e) {
				return ""+e;
			} 
			
			return s;
	}

	public void saveFile(String lines[]) {
		
	}
	
}
```

Habe noch "extends Activity" gelassen, da er sonst nicht die Methode getResources() kennt.

Bekomme aber wenn ich es starte eine NullPointerException in Zeile 20, obwohl eine test.txt im Ordner Assets liegt.


----------



## schlingel (30. Okt 2012)

> Habe noch "extends Activity" gelassen, da er sonst nicht die Methode getResources() kennt.


Das ist auf keinen Fall die richtige Vorgehensweise. Du musst deiner Klasse ein Context-Objekt mitgeben. Auf diesem kannst du dann getResources aufrufen.

Möglicherweise löst das auch schon dein Problem, weil dann das Context-Objekt richtig initialisiert wurde.


----------

