我在声明FileOutputStream的行上收到FileNotFoundException。我不确定为什么会发生这种情况,特别是因为我在创建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:open failed:EACCES(Permission denied) 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:在java.io.FileOutputStream。(FileOutputStream.java:87) 03-22 11:43:40.859 18684-18684 /? W / System.err:在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:在android.view.View.performClick(View.java:5226) 03-22 11:43:40.859 18684-18684 /? W / System.err:在android.view.View $ PerformClick.run(View.java:21266) 03-22 11:43:40.859 18684-18684 /? W / System.err:在android.os.Handler.handleCallback(Handler.java:739) 03-22 11:43:40.859 18684-18684 /? W / System.err:在android.os.Handler.dispatchMessage(Handler.java:95) 03-22 11:43:40.859 18684-18684 /? W / System.err:在android.os.Looper.loop(Looper.java:168) 03-22 11:43:40.859 18684-18684 /? W / System.err:在android.app.ActivityThread.main(ActivityThread.java:5845) 03-22 11:43:40.859 18684-18684 /? W / System.err:at java.lang.reflect.Method.invoke(Native Method) 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(Native Method) 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 more
答案 0 :(得分:0)
我认为值得一试(无论如何都是好的做法)。觉得评论太久了,因此得到答案。
在file
上调用构造函数以创建新的File
对象后,检查它是否可读,可写[Ref:API]。如果没有,您可以在尝试打开FileOutputStream
之前确保它是[参考:API]。
此外,我已经看到您需要调用file.createNewFile()
以确保创建文件的实例。那么,在fos
声明之前添加它?不应该让世界变得不同;但我认为值得一试。
编辑:
进行此更改。
File path = Environment.getExternalStorageDirectory();
并确保您拥有
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
我希望Android logcat对这个东西更加特别。
答案 1 :(得分:0)
您需要确保将FileOutputStream和BufferedWriter行放在try块中。此外,除了&#34;之外的时间使用不同的分隔符:&#34;。
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));
}
}
答案 2 :(得分:0)
我猜是因为你不能直接使用File
类创建csv文件。您可以将File file = new File(path, output+ "_A" + ".csv");
更改为File file = new File(path, output+ "_A" + ".txt");
此外,输出格式在某些时候也是非法的。