1

Я получаю исключение FileNotFoundException в строке, где объявляю FileOutputStream. Я не совсем уверен, почему это происходит особенно с тех пор, как я создаю новый файл перед созданием FileOutputStream. Я не опубликовал всю функцию, но в основном он откладывает регистраторы гироскопа и акселерометра и записывает их вывод в CSV-файл. Любая помощь будет очень признательна, потому что я не знаю, что не так.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 18684-18684 /? W/System.err: java.io.FileNotFoundException: /storage/emulated/0/Pictures/2016-03-22_11:43:40_A.csv: open failed: EACCES (разрешение отклонено) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at 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.TestEnvironmentActivity.stopRecording (TestEnvironmentActivity.java:172) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at com.example.alex.parkinsonsdiseaseapp.TestEnvironmentActivity $ 3.onClick (TestEnvironmentActivity.java:120) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at android.view.View.performClick (View.java:5226) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at android.view.View $ PerformClick.run (View.java:21266) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at 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 (собственный метод) 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: вызвано: android.system.ErrnoException: open failed: EACCES (разрешение отклонено) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at libcore.io.Posix.open (родной метод) 03-22 11: 43: 40.859 18684-18684 /? W/System.err: at 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 больше

+0

Я думаю, что вы не можете использовать: в именах файлов. – DonLeopardo

+0

Пробовал. Это не работает. –

+0

Можете ли вы добавить 'file.createNewFile();' перед объявлением fos? Не должно иметь значения; но стоит попробовать, я думаю –

ответ

0

Я думаю, что стоит попробовать (его хорошая практика в любом случае). Чувствовал себя слишком долго для комментария, отсюда и ответ.

После того, как вы назовете конструктор на file, чтобы создать новый объект File, проверьте его, можно ли его можно прочитать, [Ref: API]. Если нет, вы должны убедиться, что это так, прежде чем пытаться открыть на нем FileOutputStream [Ref: API].

Кроме того, я видел экземпляр, где вам нужно позвонить в file.createNewFile(), чтобы убедиться, что файл создан. Итак, добавьте это перед объявлением fos? Не следует создавать мир разницы; но стоит попробовать, я думаю.

EDIT:

Внесите такое изменение.

File path = Environment.getExternalStorageDirectory();

и обеспечить вам

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

в манифесте. Хотелось бы, чтобы Android logcat был более конкретным в этом вопросе.

+0

Я добавил его, но не повезло. –

+0

@AlexCauthen Ничего, даже если вы вызываете 'setWritable (..)' ?! –

+0

@AlexCauthen Я уверен, что у вас есть права на запись файла, установленные в манифесте? –

0

Вам необходимо убедиться, что вы положили строки FileOutputStream и BufferedWriter в блок try. Кроме того, используйте разные разделители на время, отличное от «:».

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

Это вызывает исключение, но не решает основной проблемы –

+0

Я попробовал, и это работает для меня. Компилятор дал мне сообщение о том, что ему нужно поймать FileNotFoundException, которое делает IOException. Как только я это сделал и изменил разделитель времени, он прошел отлично. Единственное, что я могу придумать, это то, какова ценность пути. –

+0

Это не проблема. В некоторых спецификационных комбинациях на Android некоторые вещи странно перестают работать. Исключение сбоя очень важно, но если функциональность является неотъемлемой частью приложения, вам нужно найти другой способ выполнить задание или указать, что именно проблема. Просто потому, что блок catch не попал на ваше устройство, он не гарантирует, что его не ударят в чужой. –

0

Я предполагаю, потому что вы не можете CSV-файл создающих непосредственно только с помощью File класса. Вы можете изменить File file = new File(path, output+ "_A" + ".csv"); на File file = new File(path, output+ "_A" + ".txt"); Также выходной формат в какой-то момент является незаконным.

Смежные вопросы