我在我声明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: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:在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:open failed:EACCES(Permission denied)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个
您需要确保将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
[参考:API]。
此外,我已经看到你需要调用file.createNewFile()
以确保创建文件的实例。那么,在fos
声明之前添加它?不应该让世界变得不同;但我认为值得一试。
编辑:
进行此更改。
File path = Environment.getExternalStorageDirectory();
并确保你拥有
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
在你的清单中。我希望Android logcat对这个东西更加特别。
我想因为你不能直接使用File
类创建csv文件。您可以将File file = new File(path, output+ "_A" + ".csv");
更改为File file = new File(path, output+ "_A" + ".txt");
。输出格式在某些时候也是非法的。