【问题标题】:How to create nested folders and file in Context.MODE_PRIVATE?如何在 Context.MODE_PRIVATE 中创建嵌套文件夹和文件?
【发布时间】:2014-01-24 06:55:11
【问题描述】:

我有一个要求,文件和文件夹需要使用Context.MODE_PRIVATE 以嵌套结构写入。

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

openFileOutput("foo/myText.txt", Context.MODE_PRIVATE);

抛出异常:

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

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

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

然后我发现getFilesDir()返回了Context的应用程序包,我可以使用普通的Java File I/O创建文件。但是我不知道它是在什么权限下创建的,即它是否是MODE_APPEND,@ 987654328@,MODE_WORLD_READABLEMODE_WORLD_WRITEABLE

所以,我有以下问题:-

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

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

【问题讨论】:

    标签: java android file-io


    【解决方案1】:

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

    使用getDir(String name, int mode) 在内存中创建目录。 Retrieve 方法,如果需要,创建一个新目录,应用程序可以在其中放置自己的自定义数据文件。您可以使用返回的 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);
    

    【讨论】:

    • 我不认为上述方式可以在所有场景中通用。它迫使我解析文件路径并一一传递每个子目录。如果我有四级嵌套文件夹怎么办,比如f1/f2/f3/f4/myText.txt?我正在寻找相当于File f = new File("f1/f2/f3/f4/myText.txt"); if(!f.getParentFile().exists()){ f.getParentFile().mkdirs(); }
    • 没有办法... AFIK。
    • 谢谢解决..但是你能回答我上面问的两个问题吗?
    • @Abhinav 你好,是的,当然.. 1. 不,正如我之前所说,你不能。 2.所有文件相关的类都来自java,看那里的路径。所以不用担心 Java/Android 文件。您不需要为此添加任何权限。希望我回答得很好:)
    【解决方案2】:
    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,您可以开始写入它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 2018-01-28
      • 2019-03-27
      • 2015-01-02
      • 1970-01-01
      相关资源
      最近更新 更多