有些手机正在获取java.io.FileNotFoundException,但为什么呢?

时间:2015-04-30 13:22:32

标签: android

我的应用程序中有自定义日志记录功能,代码如下。

private boolean ready = false;
private File logFile1 = null;
private File logFile2 = null;
private String filePath1,filePath2,filePath3;

public NanoLog(int maxBytes)
{
    try
    {
        String sdcard_status = Environment.getExternalStorageState();
        if(sdcard_status.equals(Environment.MEDIA_MOUNTED) == false)
        {
            return;
        }
        String targetFolder = Environment.getExternalStorageDirectory().toString() + File.separator + "imadoco_log";
        File folder = new File(targetFolder);
        if(folder.exists() == false && folder.mkdir() == false)
        {
            return;
        }
        filePath1 = targetFolder + File.separator + "log1.txt";
        filePath2 = targetFolder + File.separator + "log2.txt";
        filePath3 = targetFolder + File.separator + "log.txt";
        logFile1 = new File(filePath1);
        logFile2 = new File(filePath2);
        if(logFile1.exists() == false)
        {
            logFile1.createNewFile();
        }
        else
        {
            limitBytes(maxBytes);
        }
        ready = true;
    }
    catch(Exception e)
    {
        ACRA.getErrorReporter().handleException(e);
    }
}

public synchronized void put(String text)
{
    if(ready)
    {
        try
        {
            BufferedWriter bw = new BufferedWriter(new FileWriter(logFile1,true));
            bw.append(text);
            bw.newLine();
            bw.close();
        }
        catch(IOException e)
        {
            ACRA.getErrorReporter().handleException(e);
            ready = false;
        }
    }
}

类NanoLog用于将调试跟踪写入文件。上面代码的重要部分是准备文件夹和写文件。

我的应用程序正在通过一些手机获得如下所示的例外情况大多数手机都按预期工作,所以我认为问题不是由清单文件中的权限引起的。

  • java.io.FileNotFoundException:/mnt/sdcard/imadoco_log/log1.txt(Permission denied)
  • java.io.FileNotFoundException:/storage/sdcard0/imadoco_log/log1.txt:open failed:EROFS(只读文件系统)
  • java.io.FileNotFoundException:/storage/emulated/0/imadoco_log/log1.txt:open failed:EACCES(Permission denied)

为了清楚说明,我有这个许可。

android.permission.WRITE_EXTERNAL_STORAGE

我用ACRA的崩溃报告得到了它们。他们被下一行代码所吸引。

BufferedWriter bw = new BufferedWriter(new FileWriter(logFile1,true));

我无法理解为什么有些手机会获得这些例外。如果在构造函数中检测到某些错误,函数put()不会尝试写入文件。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您不仅要检查要写入的文件夹是否存在,还要检查是否可写。使用File:canWrite()就可以了。

logFile1.createNewFile();

您没有检查返回值。所以你不知道它是否成功。

但无论如何你最好不要使用那个陈述。新的Filewriter会关心它。