# .txt File aus dem Speicher des Smartphone lesen



## werdas34 (16. Sep 2018)

Hallo,

ich bin blutiger Anfäger was App-Programmierung angeht.

Ich versuche nun seit paar Stunden aus dem Verzeichnis des Smartphones eine txt Datei auszulesen. Aber dies funktioniert nicht.
Mein Ziel ist es die player.txt aus dem Ordner Documents zu lesen und dann in meine Liste zu laden.

Was dagegen funktioniert ist, wenn die txt Datei im AndroidStudio gespeichert ist.

Hier mal der letzte Stand:

```
load.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final File file = new File(Environment.getExternalStorageDirectory()
                        .getAbsolutePath(), "player.txt");

                String[] arr = loadFile(file);
                String text = arrayToString(arr);


            String parts[] = text.split(";");
            for (int i = 0; i < parts.length; i++){
                String name[] = parts[i].split(", ");
                playerList.add(new Player(name[0], name[1]));
            }
            }
        });

public static String[] loadFile(File file)
    {
        FileInputStream fis = null;
        try
        {
            fis = new FileInputStream(file);
        }
        catch (FileNotFoundException e) {e.printStackTrace();}
        InputStreamReader isr = new InputStreamReader(fis);
        BufferedReader br = new BufferedReader(isr);

        String test;
        int anzahl=0;
        try
        {
            while ((test=br.readLine()) != null)
            {
                anzahl++;
            }
        }
        catch (IOException e) {e.printStackTrace();}

        try
        {
            fis.getChannel().position(0);
        }
        catch (IOException e) {e.printStackTrace();}

        String[] array = new String[anzahl];

        String line;
        int i = 0;
        try
        {
            while((line=br.readLine())!=null)
            {
                array[i] = line;
                i++;
            }
        }
        catch (IOException e) {e.printStackTrace();}
        return array;
    }

    public static String arrayToString(String[] arr){
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < arr.length; i++){
            sb.append(arr[i]);
        }
        return sb.toString();
    }
```

Habe auch die Permission gesetzt:

```
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.schda.game">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/icon"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        >

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
```

Würde mich freuen wenn ihr mir helfen könntet.

Danke.


----------



## Robat (16. Sep 2018)

werdas34 hat gesagt.:


> Aber dies funktioniert nicht.


Und das heißt?


----------



## werdas34 (16. Sep 2018)

Die App stürzt beim Klicken des load Buttons ab.


----------



## Robat (16. Sep 2018)

Und was kommt für eine Fehlermeldung. Schau mal ins LogCat


----------



## werdas34 (16. Sep 2018)

Process: com.example.schda.game, PID: 1960
    java.lang.NullPointerException: lock == null
        at java.io.Reader.<init>(Reader.java:64)
        at java.io.InputStreamReader.<init>(InputStreamReader.java:122)
        at java.io.InputStreamReader.<init>(InputStreamReader.java:57)
        at com.example.schda.game.MainActivity.loadFile(MainActivity.java:248)
        at com.example.schda.game.MainActivity$6.onClick(MainActivity.java:213)
        at android.view.View.performClick(View.java:5697)
        at android.widget.TextView.performClick(TextView.java:10826)
        at android.view.View$PerformClick.run(View.java:22526)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:158)
        at android.app.ActivityThread.main(ActivityThread.java:7224)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)


----------



## Robat (16. Sep 2018)

werdas34 hat gesagt.:


> at com.example.schda.game.MainActivity.loadFile(MainActivity.java:248)


Was steht in MainActivity.java in Zeile 248?


----------



## werdas34 (16. Sep 2018)

Siehe Bild.
Ist das erstellen eines InputStreamReader();


----------



## Robat (16. Sep 2018)

Dann wird wahrscheinlich der Inputstream null sein. Prüf das mal mit einer Ausgabe (und am Besten schaust du gleich noch mal ob der Pfad zum File stimmt)


----------



## werdas34 (16. Sep 2018)

9-16 21:10:36.550 14365-14365/com.example.schda.game W/System.err: java.io.FileNotFoundException: /storage/emulated/0/player.txt: open failed: ENOENT (No such file or directory)

Die Datei wird nicht gefunden.

Oder muss man die Datei besonders speichern?
Ich habe am Smartphone Eigene Dateien geöffnet und dann unter dem Ordner Documents die Datei erstellt.


----------



## Robat (16. Sep 2018)

Das kommt drauf an. Du versuchst ja auf ein externes Speichermedium (SD-Karte o.ä) zu zugreifen .. gibt es das denn bei deinem Smartphone / liegt der Ordner "Eigene Dateien" auf der SD-Karte?


----------



## werdas34 (16. Sep 2018)

Auf der SD-Karte liegt die Datei in keinem Ordner. Eigentlich war der Plan im internen Speicher auf die diese Datei zuzugreifen. 
Kurz gesagt:
Ich habe diese Datei zweimal.
Einmal auf der SD Card in keinem Ordner.
Interner Speicher vom Smartphone im Ordner Documents.


----------



## mihe7 (17. Sep 2018)

https://www.codevoila.com/post/46/android-tutorial-android-external-storage


----------



## werdas34 (17. Sep 2018)

mihe7 hat gesagt.:


> https://www.codevoila.com/post/46/android-tutorial-android-external-storage



Danke, aber das bringt mir leider auch wenig, da die Datei aus mir unbekannten Gründen sich nicht öffnen lässt.
Habe auch schon mehrere Stackoverflow Beiträge durch gelesen, aber das funktioniert nicht so wies sollte.

Hier der letzte Stand des Fileopening Prozesses:

```
//   File file = new File(Environment.getExternalStorageDirectory()
             //           .getAbsolutePath(), "player.txt");

             //   File file = new File(context.getExternalFilesDir() + "/" + "player.txt")

                File sdcard = Environment.getExternalStorageDirectory();
                File file = new File(sdcard,"player.txt");
                String[] arr = loadFile(file);
```
Ich bekomme eine FileNotFoundException.


----------



## mihe7 (17. Sep 2018)

werdas34 hat gesagt.:


> Danke, aber das bringt mir leider auch wenig, da die Datei aus mir unbekannten Gründen sich nicht öffnen lässt.
> ...
> Ich bekomme eine FileNotFoundException.


Na, dann schauen wir mal... Mach mal folgendes:

```
File sdcard = Environment.getExternalStorageDirectory();
Log.i(TAG, "Listing dir " + sdcard.toString());
for (String s : sdcard.list()) {
    Log.i(TAG, s);
}
File file = new File(sdcard,"player.txt");
String[] arr = loadFile(file);
```
Was steht im Logcat?


----------



## werdas34 (17. Sep 2018)

09-17 18:37:01.240 16196-16196/com.example.schda.game D/ViewRootImpl: ViewPostImeInputStage processPointer 1
09-17 18:37:01.860 16196-16196/com.example.schda.game D/ViewRootImpl: ViewPostImeInputStage processPointer 0
09-17 18:37:02.010 16196-16196/com.example.schda.game D/ViewRootImpl: ViewPostImeInputStage processPointer 1
09-17 18:37:02.010 16196-16196/com.example.schda.game I/com.example.schda.game.MainActivity: Listing dir /storage/emulated/0
09-17 18:37:02.010 16196-16196/com.example.schda.game E/File: fail readDirectory() errno=13
09-17 18:37:02.010 16196-16196/com.example.schda.game D/AndroidRuntime: Shutting down VM
09-17 18:37:02.030 16196-16196/com.example.schda.game E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.schda.game, PID: 16196
    java.lang.NullPointerException: Attempt to get length of null array
        at com.example.schda.game.MainActivity$6.onClick(MainActivity.java:222)
        at android.view.View.performClick(View.java:5697)
        at android.widget.TextView.performClick(TextView.java:10826)
        at android.view.View$PerformClick.run(View.java:22526)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:158)
        at android.app.ActivityThread.main(ActivityThread.java:7224)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

Er erkennt offenbar die sd Karte nicht. Muss man da noch irgendwas einstellen?
Also ich habe eine sd Karte im Smartphone, daran liegts nicht.


----------



## mihe7 (17. Sep 2018)

werdas34 hat gesagt.:


> readDirectory() errno=13


Permission denied. Befolge mal das, was unter dem Link, den ich Dir geschickt habe, unter Punkt 4 steht. Beispiele findest Du unter 5, allerdings: falls Du unter Android 6+ unterwegs bist, reicht es nicht, die Permissions nur im Manifest festzulegen. S. dazu https://developer.android.com/training/permissions/requesting


----------

