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

Abh*_*nav 4 java file-io android

我有一个要求,其中文件和文件夹需要使用Context.MODE_PRIVATE.

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

openFileOutput("foo/myText.txt", Context.MODE_PRIVATE);
Run Code Online (Sandbox Code Playgroud)

抛出异常:

java.lang.IllegalArgumentException: File foo/myText.txt contains a path separator
Run Code Online (Sandbox Code Playgroud)

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

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

后来我发现getFilesDir(),返回上下文的应用程序包,我可以通过普通的Java文件创建文件/ O.But我不知道下创建它,即无论是权限MODE_APPENDMODE_PRIVATEMODE_WORLD_READABLEMODE_WORLD_WRITEABLE

所以,我有以下问题:-

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

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

Pan*_*mar 6

您需要先创建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); 
Run Code Online (Sandbox Code Playgroud)

所以你需要把你的代码写成

// 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();
}
Run Code Online (Sandbox Code Playgroud)

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


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

new File(parentDir, "childDir").mkdir();
Run Code Online (Sandbox Code Playgroud)

所以更新的例子应该是

// 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);
Run Code Online (Sandbox Code Playgroud)