# Fehler beim Textdatei einlesen!?



## Schlucki6666 (14. Okt 2014)

Hallo;
Da ich neu bin im Forum und beim Java-programmieren, möchte ich mich kurz vorstellen:

Mein Name ist Michael und komme aus Ö. Bin knappe 50 und ein Neueinsteiger was das programmieren von APP´s und Java betrifft. Also bitte steinigt mich nicht, wenn ich hier/jetzt eine Frage stelle, die für viele das "einfachste auf der Welt" ist!
Vorweg ich habe das I-Net schon einige Tage nach einer Lösung durchsucht, aber vermutlich sehe ich vor lauter Bäume den Wald nicht mehr, bzw. die sicher vorhandene Lösung (vermutlich mehrfach) überlesen. Also nochmals, übt bitte Nachsicht mit mir 

Zu meinem Problem:
Ich habe versucht ein kleines Programm zu schreiben, mit dem ich Einträge aus einem TextView (EditView) in eine Datei (*.txt) schreiben kann - per Button - und diese Einträge wieder aus der Datei auslesen möchte - per Button.
Soweit so gut, das Programm läuft auch ohne Fehler.....bis ich auf Speichern oder Lesen drücke!!!
Es wird die Datei nicht gefunden. Es erscheint beim Lesen die Meldung: "not such file or Directory" und beim Schreiben: "Read-only file System"! Es befindet sich auch eine/die Datei an der angegebenen Örtlichkeit!?
Nochmals sorry, ich weis es ist vermutlich nur eine absolute Kleinigkeit, aber wie schon geschrieben, ich sehe offensichtlich vor lauter Bäume den Wald nicht mehr. :bahnhof:


Ich habe euch meine XML und Java Script angefügt und hoffe ihr könnt mir helfen oder sagen wo der Fehler liegt!


```
Meine XML einträge:

<LinearLayout
android:id="@+id/widget28"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#ff0000ff"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<EditText
android:id="@+id/txtData"
android:layout_width="fill_parent"
android:layout_height="180px"
android:textSize="18sp"  />

<Button
android:id="@+id/btnWriteSDFile"
android:layout_width="143px"
android:layout_height="104px"
android:text="1. Write SD File"  />

<Button
android:id="@+id/btnClearScreen"
android:layout_width="141px"
android:layout_height="102px"
android:text="2. Clear Screen"  />

<Button
android:id="@+id/btnReadSDFile"
android:layout_width="140px"
android:layout_height="102px"
android:text="3. Read SD File"  />

<Button
android:id="@+id/btnClose"
android:layout_width="141px"
android:layout_height="103px"
android:text="4. Close" />

</LinearLayout>
```

Meine Java Script:

```
import java.io.*;
import android.app.Activity;
import android.os.Bundle;
import android.view.*;
import android.view.View.OnClickListener;
import android.widget.*;

public class Dienst_Activity extends Activity {
	// GUI controls
	EditText txtData;
	Button btnWriteSDFile;
	Button btnReadSDFile;
	Button btnClearScreen;
	Button btnClose;

	@Override
	public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.main);
	// bind GUI elements with local controls
	txtData = (EditText) findViewById(R.id.txtData);
	txtData.setHint("Schreib mal was hier rein");

	btnWriteSDFile = (Button) findViewById(R.id.btnWriteSDFile);
	btnWriteSDFile.setOnClickListener(new OnClickListener() {

	public void onClick(View v) {
		// write on SD card file data in the text box
		try {
			
			File myFile = new File("C:\\Users\\Michael\\Test.txt");
			myFile.createNewFile();
			FileOutputStream fOut = new FileOutputStream(myFile);
			OutputStreamWriter myOutWriter = 
									new OutputStreamWriter(fOut);
			myOutWriter.append(txtData.getText());
			myOutWriter.close();
			fOut.close();
			Toast.makeText(getBaseContext(),
					"Done writing SD 'mysdfile.txt'",
					Toast.LENGTH_SHORT).show();
		} catch (Exception e) {
			Toast.makeText(getBaseContext(), e.getMessage(),
					Toast.LENGTH_SHORT).show();
		}
	}// onClick
	}); // btnWriteSDFile

		btnReadSDFile = (Button) findViewById(R.id.btnReadSDFile);
		btnReadSDFile.setOnClickListener(new OnClickListener() {

		public void onClick(View v) {
			// write on SD card file data in the text box
		try {
			File myFile = new File("C:\\Users\\Michael\\Test.txt");
			FileInputStream fIn = new FileInputStream(myFile);
			BufferedReader myReader = new BufferedReader(
					new InputStreamReader(fIn));
			String aDataRow = "";
			String aBuffer = "";
			while ((aDataRow = myReader.readLine()) != null) {
				aBuffer += aDataRow + "\n";
			}
			txtData.setText(aBuffer);
			myReader.close();
			Toast.makeText(getBaseContext(),
					"Done reading SD 'mysdfile.txt'",
					Toast.LENGTH_SHORT).show();
		} catch (Exception e) {
			Toast.makeText(getBaseContext(), e.getMessage(),
					Toast.LENGTH_SHORT).show();
		}
		}// onClick
		}); // btnReadSDFile

		btnClearScreen = (Button) findViewById(R.id.btnClearScreen);
		btnClearScreen.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				// clear text box
				txtData.setText("");
			}
		}); // btnClearScreen

		btnClose = (Button) findViewById(R.id.btnClose);
		btnClose.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				
			}
		}); 
	}

}//
```


lg
Schlucki


----------



## sti (14. Okt 2014)

Hi Michael,

ohne mich länger damit befasst zu haben befürchte ich das du vom Smartphone aus auf : 

```
File myFile = new File("C:\\Users\\Michael\\Test.txt");
```
 
zugreifen willst. 
Lokal auf deinem Rechner ausgeführt geht das wahrscheinlich. Auf dem Smartphone hast du zum einen keinen Zugriff auf deinen Pc, aber auch die Dateistruktur eines Androidsmartphones ist vollständig anders. 

Du könntest beispielsweise soetwas versuchen:


```
// finden der external Storage, da je nach Smartphone auf andre Art und Weise partitioniert
File sdcard = Environment.getExternalStorageDirectory();
// File öffnen
File file = new File(sdcard,"file.txt");
```

Ich hoffe ich konnte dir ein wenig weiterhelfen.

Wenn Fragen, fragen! 

Grüße

Sti


----------



## Schlucki6666 (14. Okt 2014)

Sti danke für die Antwort, aber das die Struktur auf dem Handy anders ist als am PCs ist mir bekannt. Ich habe den Pfad zur Datei aus der Testversion am PCs genommen. Ergo Programm läuft am PC (virtuelles Handy) daher soll er auch eine Datei (vorerst) vom PC lesen. Hoffe man versteht was ich meine und tue?

Schlucki


----------



## sti (14. Okt 2014)

Selbst die App auf dem Rechner läuft, wie du schon sagtest in einem virtuellen Smartphone welches in seiner eigenen Virtuellen Maschine läuft. Du hast von dort aus, meines Wissens nach keinen Zugriff auf deinen Rechner.

Versuche am besten nicht mit Hard-gecodeten Filepaths zu arbeiten sondern nutze Environment.getExternalStorageDirectory(). 

Zu Testfällen würde ich eventuell das File in dein Workspace einbinden um Lesen/Schreiben zu testen.


Edit: Es gibt ebenfalls den Fileprovider der die Verwaltung für dich übernimmt.


----------



## Schlucki6666 (14. Okt 2014)

Danke sti!
Bin gerade in der Arbeit, werde aber morgen versuchen mit dem Enviroment...... zum Erfolg zu kommen. 
Auch habe ich versucht die Datei im Workspace und dort auch im Projekt zu "integrieren", was ohne Enviroment.... jedenfalls nicht funktionierte. 
Naja, mühsam ernährt sich das Eichhörnchen oder langsam werde ich schon zum Erfolg kommen 

lg
Schlucki


----------



## Schlucki6666 (16. Okt 2014)

Dank sti kann ich nun die Textdatei auslesen! Geht aber nur am Handy. In Eclipse (virtuelles Handy) funktioniert es nicht. Ist aber soweit kein Problem ;-)
Wenn ich aber nun die Datei wieder "zurück" speichere/schreibe erhalte ich eine Fehlermeldung!? Ich habe mich im I-Net schlau gemacht, aber es sollte eigentlich mit den nun eingefügten Codezeilen von sti funktionieren.



File sdcard = Environment.getExternalStorageDirectory();

File file = *new* File(sdcard,"file.txt");

Code wurde bei Zeile 30/31 eingefügt!

Fehlermeldungen sind:
"not such file or Directory" wenn ich einen Text im Textfeld eingeben!
"Read-only file System" wenn ich keinen Text eingegebn habe!
Hat jemand eine Idee worand es liegen könnte?

Danke 
Schlucki


----------



## sti (17. Okt 2014)

Das klingt mir persönlich stark nach einem Rechteproblem. 

Eventuell musst du noch den Zugriff auf die SD-Karte / Speicher im Android Manifest deklarieren.


```
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
```


----------



## Schlucki6666 (17. Okt 2014)

@sti;
Danke, du warst etwas schneller als ich  Habe die vermutliche Ursache (wie du auch vermutest) im WWW gefunden. Lesen bildet oder macht schlau feif:
Jetzt bin ich aber am suchen, da ich gerne die Textdatei in einer ListView ausgeben möchte und nicht im EditText! 
Sieht optisch doch etwas professioneller aus 
Wie ich die ListView erstelle, habe ich schon, ABER die Textdatei hineinzaubern, da stolpere ich noch gewaltig herum ;(

lg
Schlucki


----------

