如何在Android内部存储中创建文件?

27

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

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,但是当我想要创建media文件夹时,我遇到了异常"java.io.IOException: 只读文件系统"。有什么想法可以在内部手机存储中的media文件夹中写入我的文件吗?谢谢。


如果你想创建路径 /media,除非手机已经被root,否则是不可能的。应用程序不允许写入根目录。 - Seva Alekseyev
我能创建一个文件,但无法创建一个文件夹。文件夹有限制吗? - Buda Gavril
需要完整教程的人,请参考:http://chrisrisner.com/31-Days-of-Android--Day-23%E2%80%93Writing-and-Reading-Files - Jared Burrows
5个回答

23

你应该像这样使用 ContextWrapper

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

像往常一样,参考文档ContextWrapper有很多可以提供的功能。


我不明白一件事,它与调用原始上下文的相同方法有什么不同? - Malcolm
1
ContextWrapper只是原始上下文的代理。这里的好处是,您可以对ContextWrapper进行子类化以实现一些自定义行为,例如说getDir()实际上返回一些其他(非标准)目录。您是正确的,可以直接使用Context。 - Audrius

2
你应该创建一个名为media的文件夹,将其附加到getLocalPath()返回的路径上。

1
不,这不是一个解决方案,因为文件不存在,我想要创建它。 - Buda Gavril
4
不是,这是一个解决方案 - 你必须先创建文件夹,然后才能在其中写入文件。 - Chris Stratton

2

我也遇到了完全相同的错误。以下是解决方法。当你指定写入位置时,Android会自动将路径解析为/data//mnt/sdcard/。让我解释一下。

如果你执行以下语句:

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

它将解析 Android 中更高级别的根路径/data/

我弄清楚了这一点,因为在执行以下代码后,它会自动放置在根目录/mnt/中,而无需我自己进行任何翻译。

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

一个快速的解决方法是更改您的以下代码:
File f = new File(getLocalPath().replace("/data/data/", "/"));

希望这可以帮助到您。

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

0

编写文件

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

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.

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


-3

嗨,试试这个,它会创建一个目录和其中的文件。

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");  

6
/sdcard和内部存储(这就是这个问题的关键)是两个完全不同的东西。 - lenik
是的,这个问题是关于其他事情的。 - Paranoid Android
2
这不是关于外部存储的问题! - Tomask

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接