【问题标题】:How to create a file on Android Internal Storage?如何在 Android 内部存储上创建文件?
【发布时间】:2011-02-16 13:53:22
【问题描述】:

我想将内部存储上的文件保存到特定文件夹中。我的代码是:

File mediaDir = new File("media");
if (!mediaDir.exists()){
   mediaDir.createNewFile();
   mediaDir.mkdir();

}
File f = new File(getLocalPath());
f.createNewFile();
FileOutputStream fos = new FileOutputStream(f);
fos.write(data);
fos.close();

getLocalPath 返回/data/data/myPackage/files/media/qmhUZU.jpg 但是当我想创建媒体文件夹时,我收到异常“java.io.IOException:只读文件系统”。任何想法如何在文件夹媒体中的内部手机存储中写入我的文件?谢谢。

【问题讨论】:

  • 如果你想创建路径 /media,你不能 - 除非手机已经root。应用程序不允许写入根文件夹。
  • 我可以创建一个文件,但不能创建一个文件夹。文件夹有限制吗?
  • 对于那些需要完整教程的人:chrisrisner.com/…

标签: android file storage internal


【解决方案1】:

你应该像这样使用ContextWrapper

ContextWrapper cw = new ContextWrapper(context);
File directory = cw.getDir("media", Context.MODE_PRIVATE);

和往常一样,请参考documentationContextWrapper 有很多东西可以提供。

【讨论】:

  • 一件事没看懂,和调用原始上下文的同一个方法有什么区别?
  • ContextWrapper 只是原始上下文的代理。这里的好处是你可以继承 ContextWrapper 来实现一些自定义行为,所以说 getDir() 实际上返回一些其他(非标准)目录。你是对的,一个人可以直接使用上下文。
【解决方案2】:

您应该创建 media 目录附加到 getLocalPath() 返回的内容。

【讨论】:

  • 不,这不是解决方案,因为该文件不存在,我想创建它
  • 不,这是一个解决方案 - 您必须先创建文件夹,然后才能在其中写入文件。
【解决方案3】:

我也遇到了同样的错误。这是修复。当您指定写入位置时,Android 会自动将您的路径解析为/data//mnt/sdcard/。让我解释一下。

如果执行以下语句:

File resolveMe = new File("/data/myPackage/files/media/qmhUZU.jpg");
resolveMe.createNewFile();

它将解析到根目录/data/ 在 Android 中更高位置的路径。

我想通了,因为在我执行以下代码后,它会自动放置在根目录/mnt/ 中,而无需我自己翻译任何内容。

File resolveMeSDCard = new File("/sdcard/myPackage/files/media/qmhUZU.jpg");
resolveMeSDCard.createNewFile();

快速解决方法是更改​​以下代码:

File f = new File(getLocalPath().replace("/data/data/", "/"));

希望对你有帮助

【讨论】:

  • 这是用一个稍微不那么糟糕的想法代替一个非常糟糕的想法,但仍然不明智 - 通常应用程序不应该假设绝对路径,而是使用提供的 API 在运行时发现适用的路径。
【解决方案4】:

写一个文件

将文件保存到内部存储时,您可以通过调用以下两种方法之一来获取适当的目录作为文件:

getFilesDir()

      Returns a File representing an internal directory for your app.

getCacheDir()

     Returns a File representing an internal directory for your 
     app's temporary cache files.
     Be sure to delete each file once it is no longer needed and implement a reasonable 
     size limit for the amount of memory you use at any given time, such as 1MB.

注意:如果系统存储空间不足,它可能会在没有警告的情况下删除您的缓存文件。

【讨论】:

    【解决方案5】:

    你好,试试这个,它会在里面创建目录+文件

    File mediaDir = new File("/sdcard/download/media");
    if (!mediaDir.exists()){
        mediaDir.mkdir();
    }
    
    File resolveMeSDCard = new File("/sdcard/download/media/hello_file.txt");
    resolveMeSDCard.createNewFile();
    FileOutputStream fos = new FileOutputStream(resolveMeSDCard);
    fos.write(string.getBytes());
    fos.close();
    
    System.out.println("Your file has been written");  
    

    【讨论】:

    • /sdcard 和内部存储(这就是这个问题所涉及的)是两个完全不同的东西。
    • 是的,问题是关于别的事情
    • 这与外部存储无关!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多