Android: Java.io.fileNotFoundException
Я получаю FileNotFoundException в строке, где я объявляю FileOutputStream. Я не совсем уверен, почему это происходит, особенно потому, что я создаю новый файл перед созданием FileOutputStream. Я не опубликовал всю функцию, но в основном она отменяет регистрацию датчиков гироскопа и акселерометра и записывает их вывод в файл.csv. Любая помощь будет принята с благодарностью, потому что я понятия не имею, что не так.
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: открыть не удалось: 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: открыть не удалось: 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
3 ответа
Я думаю, потому что вы не можете создать CSV-файл напрямую, просто используя File
учебный класс. Ты можешь измениться File file = new File(path, output+ "_A" + ".csv");
в File file = new File(path, output+ "_A" + ".txt");
Кроме того, формат вывода является недопустимым в какой-то момент.
Вы должны убедиться, что вы помещаете строки 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));
}
}
Я думаю, что это стоит попробовать (в любом случае, это хорошая практика). Чувствовал слишком долго для комментария, следовательно, ответ.
После того, как вы вызываете конструктор file
создать новый File
объект, проверьте, является ли он читаемым, доступным для записи [Ref: API]. Если нет, вы должны убедиться, что это так, прежде чем пытаться открыть FileOutputStream
на него [Ref: API].
Кроме того, я видел случай, когда вам нужно позвонить file.createNewFile()
чтобы убедиться, что файл создан. Итак, добавьте это до fos
декларация? Не должно иметь значение мира; но стоит попробовать, я думаю.
РЕДАКТИРОВАТЬ:
Сделай это изменение.
File path = Environment.getExternalStorageDirectory();
и убедитесь, что у вас есть
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
в вашем манифесте. Я хотел бы, чтобы Android LogCat был более конкретным об этом материале.