【问题标题】:Write file to external storage将文件写入外部存储
【发布时间】:2014-02-24 19:59:42
【问题描述】:

我正在尝试将新的波形文件写入外部存储上的 Ringtones 文件夹。但不幸的是,该文件没有被创建。

我遵循了有关如何执行此操作的 android 文档,并按照建议的方式实施了它。

我还在清单中添加了适当的权限。同样,我检查了我的设备外部存储是否可读/可写。

以下代码写入日志语句“目录未创建”。同样,对流的任何后续调用都会导致 nullPointer。

public WavFileOutStream(String fileName)
{

    // Get the directory for the user's public pictures directory. 
    File file = new File(Environment.getExternalStoragePublicDirectory(
             Environment.DIRECTORY_RINGTONES), fileName);
    if (!file.getParentFile().mkdirs()) {
         Log.e("trace", "Directory not created");
    }

    try {
        stream = new DataOutputStream(new FileOutputStream(file));

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 

}

【问题讨论】:

  • 您的文件系统中是否已经存在 Ringtones 目录?
  • 是的,目录铃声已经存在。
  • 在这种情况下 mkdir() 将返回 false....请参阅 docs.oracle.com/javase/7/docs/api/java/io/File.html#mkdir()
  • 是的,我忘记添加我认为它没有成功打开的其他原因。我编辑了最初的帖子。我得到对 DataOutputStream 流的任何其他调用的空指针异常。
  • 尝试 file.createFile() 然后创建 OutputStream'

标签: java android file-io


【解决方案1】:

您误解了日志消息的含义及其原因。

File.mkdirs() 被记录为返回:

  • 如果目录已创建,则为真,

  • 如果失败或者目录已经存在

  • ,则为false

由于铃声文件夹可能已经存在,您可能会遇到第二种情况。

如果您仍有其他原因认为这不起作用,请将以下 catch 块产生的任何堆栈跟踪编辑到您的问题正文中。

【讨论】:

  • 是的,对 DataOutputStream 流的任何后续调用都会导致 nullPointer 异常。这让我相信文件没有被打开。
  • 然后你需要编辑你的catch块产生的堆栈跟踪,或者(如果它没有失败的话)平台未捕获的异常处理程序,进入你的问题。
  • 每当调用 stream.anyMethod() 时,它都会简单地归结为一个空指针异常。
  • 这不是信息。也许您需要将 FileOutputStream 构造函数分解为自己的行,以便在失败时获得有意义的堆栈跟踪,并且只有当它不尝试从中创建 DataOutputStream 时。最好也记录您的预期路径,看看它对设备是否合理。
  • 如何查看从 catch 语句中捕获的 strack 痕迹?
【解决方案2】:

我经常忘记自己。确保您在应用程序清单中拥有此权限:)

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

【讨论】:

  • 感谢您的回复。我已经添加了。
  • 哦,这还没有解决您的问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 2015-10-21
  • 1970-01-01
  • 2012-01-09
相关资源
最近更新 更多