1

Ich erhalte eine FileNotFoundException in der Zeile, in der ich den FileOutputStream deklariere. Ich bin nicht wirklich sicher, warum das passiert, besonders da ich eine neue Datei mache, bevor ich den FileOutputStream erstelle. Ich habe nicht die gesamte Funktion gepostet, aber im Grunde nimmt die Registrierung der Sensoren Gyroskop und Beschleunigungssensor auf und schreibt ihre Ausgabe in eine .csv-Datei. Jede Hilfe würde sehr geschätzt werden, weil ich keine Ahnung habe, was falsch ist.Android: Java.io.fileNotFoundException

protected void stopRecording() throws IOException{ 
    sm.unregisterListener(this); 


    File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
    //file name is the current date and time 
    cal = Calendar.getInstance(TimeZone.getDefault()); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_hh:mm:ss"); 

    String output = sdf.format(cal.getTime()).toString(); 
    File file = new File(path, output+ "_A" + ".csv"); 
    FileOutputStream fos = new FileOutputStream(file); 
    out = new BufferedWriter(new OutputStreamWriter(fos)); 

    for(int i = 0; i < a.size(); i++){ 
     try { 
      out.write(a.get(i)); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
    } 

03-22 11: 43: 40,845 18.684-18.684 /? W/System.err: java.io.FileNotFoundException: /storage/emulated/0/Pictures/2016-03-22_11:43:40_A.csv: Öffnen fehlgeschlagen: EACCES (Berechtigung verweigert) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: bei libcore.io.IoBridge.open (IoBridge.java:452) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at java.io.FileOutputStream. (FileOutputStream.java:87) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at java.io.FileOutputStream. (FileOutputStream.java:72) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at com.example.alex.parkinsonsdiseaseapp.TestUmgebungActivity.stopRecording (TestEnvironmentActivity.java:172) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at com.beispiel.alex.parkinsonsdiseaseapp.TestEnvironmentActivity $ 3.onClick (TestEnvironmentActivity.java:120) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: bei android.view.View.performClick (View.java:5226) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: bei android.view.View $ PerformClick.run (View.java:21266) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: bei android.os.Handler.handleCallback (Handler.java:739) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at android.os.Handler.dispatchMessage (Handler.java:95) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at android.os.Looper.loop (Looper.java:168) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at android.app.ActivityThread.main (ActivityThread.java:5845) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at java.lang.reflect.Method.invoke (systemeigene Methode) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:797) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:687) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: verursacht durch: android.system.ErrnoException: Öffnen fehlgeschlagen: EACCES (Berechtigung verweigert) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: bei libcore.io.Posix.open (native Methode) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: bei libcore.io.BlockGuardOs.open (BlockGuardOs.java:186) 03-22 11: 43: 40.860 18684-18684 /? W/System.err: at libcore.io.IoBridge.open (IoBridge.java:438) 03-22 11: 43: 40.860 18684-18684 /? W/System.err: ... 13 mehr

+0

Ich denke, dass Sie nicht verwenden können: in Dateinamen. – DonLeopardo

+0

Versuchte es. Es hat nicht funktioniert. –

+0

Können Sie 'file.createNewFile();' vor der fos-Deklaration hinzufügen? Sollte keinen Unterschied machen; aber einen Versuch wert, denke ich –

Antwort

0

Ich denke, das ist einen Versuch wert (seine gute Praxis sowieso). Fühlte zu lange nach einem Kommentar, daher eine Antwort.

Nachdem Sie den Konstruktor auf file ruft ein neues File-Objekt zu erstellen, überprüfen, ob es lesbar, beschreibbar [Ref: API]. Wenn nicht, möchten Sie sicherstellen, dass es ist, bevor Sie versuchen, eine FileOutputStream darauf zu öffnen [Ref: API].

Auch ich habe Instanz gesehen, wo Sie einen Anruf an file.createNewFile() müssen, um sicherzustellen, dass eine Datei erstellt wird. Also, fügen Sie das vor der fos Deklaration hinzu? Sollte keinen Unterschied machen; aber einen Versuch wert, denke ich.

BEARBEITEN:

Nehmen Sie diese Änderung vor.

File path = Environment.getExternalStorageDirectory();

und stellen Sie sicher,

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

in Ihrem Manifest haben. Ich wünschte, das Android-Logcat wäre etwas spezieller über dieses Zeug.

+0

Ich habe es hinzugefügt, aber kein Glück. –

+0

@AlexCauthen Nichts, selbst wenn du 'setWritable (..)' nennst ?! –

+0

@AlexCauthen Ich bin sicher, Sie haben die Datei schreiben Berechtigungen im Manifest festgelegt? –

0

Sie müssen sicherstellen, dass Sie Ihre FileOutputStream- und BufferedWriter-Zeilen in den try-Block setzen. Verwenden Sie für die Zeit außer ":" auch andere Trennzeichen.

protected void stopRecording() throws IOException{ 
    sm.unregisterListener(this); 


    File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
    //file name is the current date and time 
    cal = Calendar.getInstance(TimeZone.getDefault()); 
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_hh.mm.ss"); 

    String output = sdf.format(cal.getTime()).toString(); 
    File file = new File(path, output+ "_A" + ".csv"); 

    for(int i = 0; i < a.size(); i++){ 
     try { 
      FileOutputStream fos = new FileOutputStream(file); 
      out = new BufferedWriter(new OutputStreamWriter(fos)); 
      out.write(a.get(i)); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
      FileOutputStream fos = new FileOutputStream(file); 
      out = new BufferedWriter(new OutputStreamWriter(fos)); 
     } 
    } 
+0

Dies löst eine Ausnahme aus, löst jedoch nicht das zugrunde liegende Problem –

+0

Ich habe es ausprobiert, und es funktioniert für mich. Der Compiler gab mir eine Fehlermeldung, die besagt, dass die FileNotFoundException abgefangen werden muss, was die IOException bewirkt. Sobald ich das getan und das Zeittrennzeichen geändert habe, lief es gut. Die einzige andere Sache, die ich mir vorstellen kann, ist der Wert des Pfades. –

+0

Das ist nicht das Problem. In bestimmten Spezifikationskombinationen auf Android funktionieren bestimmte Dinge seltsamerweise nicht mehr. Catching Exception ist sehr wichtig, aber wenn die Funktionalität in die App integriert ist, müssen Sie einen anderen Weg finden, um die Aufgabe zu erledigen, oder genau bestimmen, was genau das Problem ist. Nur weil der Catch-Block nicht auf Ihrem Gerät getroffen wurde, wird nicht sichergestellt, dass es nicht von jemand anderem getroffen wird. –

0

Ich denke, da Sie nicht direkt CSV-Datei Creat kann nur File Klasse. Sie können File file = new File(path, output+ "_A" + ".csv"); zu File file = new File(path, output+ "_A" + ".txt"); ändern Auch das Ausgabeformat ist zu irgendeinem Zeitpunkt illegal.