Android:Java.io.fileNotFoundException

问题描述 投票:1回答:3

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

java android filenotfoundexception ioexception fileoutputstream
3个回答
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
投票

我认为这值得一试(无论如何都是好的做法)。觉得评论太久了,因此得到答案。

file上调用构造函数创建一个新的File对象后,检查它是否可读,可写[Ref:API]。如果没有,你会想要确保它,然后尝试打开它上面的FileOutputStream [参考:API]。

此外,我已经看到你需要调用file.createNewFile()以确保创建文件的实例。那么,在fos声明之前添加它?不应该让世界变得不同;但我认为值得一试。

编辑:

进行此更改。

File path = Environment.getExternalStorageDirectory();

并确保你拥有

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

在你的清单中。我希望Android logcat对这个东西更加特别。


0
投票

我想因为你不能直接使用File类创建csv文件。您可以将File file = new File(path, output+ "_A" + ".csv");更改为File file = new File(path, output+ "_A" + ".txt");。输出格式在某些时候也是非法的。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.