首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android内部存储机制

Android内部存储机制
EN

Stack Overflow用户
提问于 2022-08-16 05:25:42
回答 1查看 138关注 0票数 0

我试图了解Android内部存储是如何工作的。为此,我阅读了一些关于StackOverFlow的教程和许多文章。

然而,在测试真正的代码时,事情并不那么清楚。

这里有一个问题,下面的代码用于创建一个目录和一个文件:

代码语言:javascript
复制
val dirName = "myNewDir"
createDir(dirName)

val fileName = "myNewFile"
writeToFile("Some random text for testing purpose ...",fileName)

val directory = filesDir

val files: Array<File> = directory.listFiles()
println("Files count = "+files.size)

for (f in files) {
    println("Name: "+f.name)
}

这是两个函数createDir()和writeToFile()的代码:

代码语言:javascript
复制
fun createDir(dirName:String): File? {
    return applicationContext.getDir(dirName, MODE_PRIVATE)
} /* End of createDir */


fun writeToFile(dataBufr:String, fileName:String) {
    applicationContext.openFileOutput(fileName, Context.MODE_PRIVATE).use {
            output -> output.write(dataBufr.toByteArray())
    }
} /* End of writeToFile */

这就是在执行上面的代码时控制台中显示的内容:

代码语言:javascript
复制
I/System.out: Files count = 1
I/System.out: Name: myNewFile

我的问题是:为什么目录(myNewDir)没有创建或者列表没有出现在控制台中?

EN

回答 1

Stack Overflow用户

发布于 2022-08-16 09:36:52

最新的安卓版本,所有默认的dir都将在第一个由LoadAPK.java打开,getDir将得到存在的dir。

代码语言:javascript
复制
public File getDir(String name, int mode) {
    checkMode(mode);
    name = "app_" + name;
    File file = makeFilename(getDataDir(), name);
    if (!file.exists()) {
        file.mkdir();
        setFilePermissionsFromMode(file.getPath(), mode,
                FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH);
    }
    return file;
}

getDataDir()

代码语言:javascript
复制
@Override
public File getDataDir() {
    if (mPackageInfo != null) {
        File res = null;
        if (isCredentialProtectedStorage()) {
            res = mPackageInfo.getCredentialProtectedDataDirFile();
        } else if (isDeviceProtectedStorage()) {
            res = mPackageInfo.getDeviceProtectedDataDirFile();
        } else {
            res = mPackageInfo.getDataDirFile();
        }

        if (res != null) {
            if (!res.exists() && android.os.Process.myUid() == android.os.Process.SYSTEM_UID) {
                Log.wtf(TAG, "Data directory doesn't exist for package " + getPackageName(),
                        new Throwable());
            }
            return res;
        } else {
            throw new RuntimeException(
                    "No data directory found for package " + getPackageName());
        }
    } else {
        throw new RuntimeException(
                "No package details found for package " + getPackageName());
    }
}

frameworks/base/core/java/android/app/LoadedApk.java中,ApplicationInfo将插入所有文件。

代码语言:javascript
复制
private void setApplicationInfo(ApplicationInfo aInfo) {
    final int myUid = Process.myUid();
    aInfo = adjustNativeLibraryPaths(aInfo);
    mApplicationInfo = aInfo;
    mAppDir = aInfo.sourceDir;
    mResDir = aInfo.uid == myUid ? aInfo.sourceDir : aInfo.publicSourceDir;
    mLegacyOverlayDirs = aInfo.resourceDirs;
    mOverlayPaths = aInfo.overlayPaths;
    mDataDir = aInfo.dataDir;
    mLibDir = aInfo.nativeLibraryDir;
    mDataDirFile = FileUtils.newFileOrNull(aInfo.dataDir);
    mDeviceProtectedDataDirFile = FileUtils.newFileOrNull(aInfo.deviceProtectedDataDir);
    mCredentialProtectedDataDirFile = FileUtils.newFileOrNull(aInfo.credentialProtectedDataDir);

    mSplitNames = aInfo.splitNames;
    mSplitAppDirs = aInfo.splitSourceDirs;
    mSplitResDirs = aInfo.uid == myUid ? aInfo.splitSourceDirs : aInfo.splitPublicSourceDirs;
    mSplitClassLoaderNames = aInfo.splitClassLoaderNames;

    if (aInfo.requestsIsolatedSplitLoading() && !ArrayUtils.isEmpty(mSplitNames)) {
        mSplitLoader = new SplitDependencyLoaderImpl(aInfo.splitDependencies);
    }
}

frameworks/base/core/java/android/os/FileUtils.java

代码语言:javascript
复制
public static @Nullable File newFileOrNull(@Nullable String path) {
    return (path != null) ? new File(path) : null;
}

public static @Nullable File createDir(File baseDir, String name) {
    final File dir = new File(baseDir, name);

    return createDir(dir) ? dir : null;
}

public static boolean createDir(File dir) {
    if (dir.mkdir()) {
        return true;
    }

    if (dir.exists()) {
        return dir.isDirectory();
    }

    return false;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73369113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档