Android:Java.io.fileNotFoundException

时间:2016-03-22 00:37:31

标签: java android filenotfoundexception ioexception fileoutputstream

我在声明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

3 个答案:

答案 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");此外,输出格式在某些时候也是非法的。