如何在Context.MODE_PRIVATE中创建嵌套文件夹和文件?

时间:2014-01-24 06:55:11

标签: java android file-io

我要求使用Context.MODE_PRIVATE以嵌套结构编写文件和文件夹。

我发现我们可以使用openFileOutput(FILENAME, Context.MODE_PRIVATE);创建文件,并且能够使用此方法创建文件。但后来我发现使用此方法我无法创建嵌套文件结构,即

openFileOutput("foo/myText.txt", Context.MODE_PRIVATE);
抛出异常:

java.lang.IllegalArgumentException: File foo/myText.txt contains a path separator

可能是因为它只需要一个fileName & not a filepath,而且还需要文档

  

打开与此Context的应用程序包关联的私有文件   写作。

然后我发现getFilesDir()返回Context的应用程序包,我可以使用普通的Java File I / O创建文件。但我不知道创建它的权限,即它是否{{1 }},MODE_APPENDMODE_PRIVATEMODE_WORLD_READABLE

所以,我有以下问题: -

  1. 如何使用MODE_PRIVATE下的openFileOutput()方法创建嵌套文件结构(如果可能的话)?

  2. 如果openFileOutput()不适用于创建嵌套结构,那么根据我的要求使用MODE_WORLD_WRITEABLE和Java File I / O组合是否安全?使用这种方式创建的文件的权限是什么?

2 个答案:

答案 0 :(得分:3)

您需要先创建foo目录,然后在该目录中创建文件。

使用getDir(String name, int mode)将目录创建到内部存储器中。方法检索,创建需要的新目录,应用程序可以在其中放置自己的自定义数据文件。您可以使用返回的File对象来创建和访问此目录中的文件。


例如

// Create directory into internal memory;
File mydir = context.getDir("mydir", Context.MODE_PRIVATE);
// Get a file myfile within the dir mydir.
File fileWithinMyDir = new File(mydir, "myfile"); 
// Use the stream as usual to write into the file.
FileOutputStream out = new FileOutputStream(fileWithinMyDir); 

因此您需要将代码编写为

// Create foo directory into internal memory;
File mydir = getDir("foo", Context.MODE_PRIVATE);
// Get a file myText.txt within the dir foo.
File fileWithinMyDir = new File(mydir, "myText.txt"); 
// Use the stream as usual to write into the file.
try {
    FileOutputStream out = new FileOutputStream(fileWithinMyDir);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

将foo / myText.txt创建到内部存储区。


对于嵌套目录,您应该使用普通的java方法。喜欢

new File(parentDir, "childDir").mkdir();

如此更新的示例应为

// Create directory into internal memory;
File mydir = getDir("mydir", Context.MODE_PRIVATE);

// Create sub-directory mysubdir
File mySubDir = new File(mydir, "mysubdir");
mySubDir.mkdir();

// Get a file myfile within the dir mySubDir.
File fileWithinMyDir = new File(mySubDir, "myfile"); 
// Use the stream as usual to write into the file.
FileOutputStream out = new FileOutputStream(fileWithinMyDir);

答案 1 :(得分:0)

public OutputStream openFile(String absolutePath) throws FileNotFoundException {
  File file = new File(absolutePath);
  new File(file.getParent()).mkdirs();

  return new FileOutputStream(absolutePath);
}

public OutputStream openInternalFile(String relativePath) throws FileNotFoundException {
  String rootPath = this.getFilesDir().getPath();
  File file = new File(rootPath, relativePath);
  return openFile(file.getAbsolutePath());
}

这是我提出的涵盖您的用例的内容。您可以传递absolutePathrelativePath。在场景后面它会在内部存储中创建一个嵌套文件夹并返回一个OutputStream,你可以开始写入它。