代码之家  ›  专栏  ›  技术社区  ›  alex2k8

如何在android'/data/data/pkg/files'目录中创建文件层次结构?

  •  8
  • alex2k8  · 技术社区  · 15 年前

    我尝试在android的/data/data/pkg/files目录中创建'foo/bar.txt'。

    这似乎是文件中的矛盾:

    要写入文件,请使用名称和路径调用context.openfileoutput()。

    http://developer.android.com/guide/topics/data/data-storage.html#files

    要打开的文件的名称;不能包含路径分隔符。

    http://developer.android.com/reference/android/content/Context.html#openFileOutput(java.lang.String,%20int)

    当我打电话的时候

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

    引发异常:

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

    那么如何在子文件夹中创建文件呢?

    5 回复  |  直到 10 年前
        1
  •  13
  •   Dan Lew    15 年前

    看起来你确实遇到过文档问题。如果深入研究applicationContext.java的源代码,事情看起来不会更好。OpenFileOutput()内部:

    File f = makeFilename(getFilesDir(), name);
    

    getFilesDir() 始终返回目录“files”。和 makeFilename() ?

    private File makeFilename(File base, String name) {
        if (name.indexOf(File.separatorChar) < 0) {
            return new File(base, name);
        }
        throw new IllegalArgumentException(
            "File " + name + " contains a path separator");
    }
    

    所以通过使用 openFileOutput() 您将无法控制包含目录;它将始终位于“files”目录中。

    但是,没有什么能阻止您使用file和fileutils在包目录中自己创建文件。它只是意味着你会错过使用 OpenFileOutput()。 为您提供(如自动设置权限)。

        2
  •  9
  •   user865197    13 年前

    您可以像这样在私有目录中添加具有路径的文件

    String path = this.getApplicationContext().getFilesDir() + "/testDir/";
    File file = new File(path);
    file.mkdirs();
    path += "testlab.txt";
    OutputStream myOutput;
    try {
    myOutput = new BufferedOutputStream(new FileOutputStream(path,true));
    write(myOutput, new String("TEST").getBytes());
    myOutput.flush();
    myOutput.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    
        3
  •  7
  •   CommonsWare    15 年前

    使用 getFilesDir() 得到一个 File 在包的根目录 files/ 目录。

        4
  •  5
  •   Dave Pile    10 年前

    要写入内部存储子文件夹中的文件,您需要先创建该文件(如果尚未创建子文件夹,则创建子文件夹),然后创建FileOutputstream对象。

    这是我用的方法

        private void WriteToFileInSubfolder(Context context){
        String data = "12345";
        String subfolder = "sub";
        String filename = "file.txt";
    
        //Test if subfolder exists and if not create
        File folder = new File(context.getFilesDir() + File.separator + subfolder);
        if(!folder.exists()){
            folder.mkdir();
        }
    
    
        File file = new File(context.getFilesDir() + File.separator 
                             + subfolder + File.separator + filename);
        FileOutputStream outstream;
    
        try{
            if(!file.exists()){
                file.createNewFile();
            }
    
            //commented line throws an exception if filename contains a path separator
            //outstream = context.openFileOutput(filename, Context.MODE_PRIVATE);
            outstream = new FileOutputStream(file);
            outstream.write(data.getBytes());
            outstream.close();
    
        }catch(IOException e){
            e.printStackTrace();
        }
    }
    
        5
  •  0
  •   Neysor    12 年前

    假设原始文章寻求如何在“文件”区域中创建子目录并在其中写入文件,那么这在文档中可能是新的:

    public abstract File getDir (String name, int mode)
    

    自:API 1级

    检索并根据需要创建一个新目录,其中的应用程序 可以放置自己的自定义数据文件。您可以使用返回的文件 对象以创建和访问此目录中的文件。注意文件 通过文件对象创建的将只能由您自己访问 应用程序;只能设置整个目录的模式,而不能设置 单个文件。