我是Android Studio 3.0的新手,在Nexus 4,Marshmallow上进行模拟。我正在尝试构建我的应用程序的简单“保存文件”和“加载文件”部分。这是“保存文件”部分:
String filename = "myFile01"; // Then "myFile02", "myFile03", etc...
String userData = "Some useful data here...";
try {
// Adapted from: https://www.youtube.com/watch?v=_15mKw--RG0
FileOutputStream fileOutputStream = openFileOutput(filename, MODE_PRIVATE); // creates a file with given filename
fileOutputStream.write(userData.getBytes()); // puts userData into the file
fileOutputStream.close();
Toast.makeText(getApplicationContext(), "File saved!", Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
当用户创建并保存其他文件时,将反复调用上述代码。稍后,用户可能想要查看所有已保存的文件并加载一个。我将有一个ListView显示所有文件...但我需要帮助阅读当前目录以获取该列表。
我以为我读过某个地方,在Android中,你的应用程序有一个平面目录可以保存和检索文件。所以我希望如果我保存了一堆文件然后调用了read()方法,我所保存的所有文件都只是在默认目录中,不需要搜索。这似乎是一个糟糕的假设;这就是原因:
这是我在默认目录中查找并列出其中所有文件的代码。首先,我需要所述默认目录的路径:
// Get current directory adapted from: https://stackoverflow.com/questions/5527764/get-application-directory
String packName, currDir;
PackageManager m = getPackageManager();
packName = getPackageName();
PackageInfo p = null;
try {
p = m.getPackageInfo(packName, 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
currDir = p.applicationInfo.dataDir;
然后我打开“currDir”,并将所有本地文件的名称存储在一个数组中:
// get list of files adapted from: https://stackoverflow.com/questions/9317483/showing-a-list-of-files-in-a-listview#9317583
File dir = new File(currDir);
File[] filelist = dir.listFiles();
String[] fileArr = new String[filelist.length];
for (int i = 0; i < fileArr.length; i++) {
fileArr[i] = filelist[i].getName();
}
此处的计划是将“fileArr”加载到ListView中并从那里开始。但是当我单步执行调试器时,我将其视为“fileArr”的内容:
"cache"
"code_cache"
"files"
无论我之前保存了多少文件,都是如此。
BTW,在调试器中,packName和currDir的赋值看起来100%正确:
packName = com.mydomain.myapp
currDir = /data/user/0/com.mydomain.myapp
所以...我有点假设我保存的文件实际上在这里:
/data/user/0/com.mydomain.myapp/files
因此,我应将此附加到我的“获取当前目录”代码:
// Get current directory adapted from: https://stackoverflow.com/questions/5527764/get-application-directory
String packName, currDir;
...everything from before...
currDir = p.applicationInfo.dataDir+"/files"; // <---- appending "+"/files"
还是我离开了?任何建议将不胜感激,谢谢!
答案 0 :(得分:0)
首先,如果要将文件保存在应用程序的目录中,则应调用create a directory,
File directoryDefault = new File(Environment.DIRECTORY_DOCUMENTS, "YOUR_FOLDER_NAME");
if (!directoryDefault.exists()) {
directoryDefault.mkdir();
}
然后你必须保存你在上述默认目录中保存的文件。之后,当您要列出该目录中可用的所有文件时,您应该调用
private ArrayList<String> fileNames() {
ArrayList<String> namesArray = new ArrayList<>();
File[] arrayFiles = directoryDefault.listFiles();
for (File file : arrayFiles) {
namesArray.add(file.getName());
}
return namesArray;
}