【发布时间】:2017-06-19 17:12:41
【问题描述】:
我正在尝试创建一个目录,然后将数据写入外部 SD 卡上的新文件。我之前已经成功地将文件写入内部存储,但是我似乎有两个问题(好吧,除了我自己,因为这只是我的第二个应用程序!)。
在 stackoverflow 上详细搜索建议和示例代码后,我构建了以下方法:
void filewriter(String fnam,String mdata){
if (useSD) {
//test to see if a directory called AMJ exists on external storage and create one if it does not
try {
File folder = new File(Environment.getExternalStorageDirectory() + "/AMJ");
if (folder.exists() && folder.isDirectory()) {
Toast.makeText(getApplicationContext(), "folder " + folder + " exists", Toast.LENGTH_LONG).show(); //##1
} else {
Toast.makeText(getApplicationContext(), "folder " + folder + " does not exist", Toast.LENGTH_LONG).show(); //##2
folder.mkdirs();
}
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "Unable to find or create a directory for route data on SD card", Toast.LENGTH_LONG).show(); //##3
}
//create a file with file name fnam and write String mdata into the AMJ directory
try {
String namFile = Environment.getExternalStorageDirectory() + "/AMJ/" + fnam;
File datfile = new File(namFile);
Toast.makeText(getApplicationContext(), "File is: " + datfile, Toast.LENGTH_LONG).show(); //##4
datfile.createNewFile();
FileOutputStream fOut = new FileOutputStream(datfile);
OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut);
myOutWriter.append(mdata);
myOutWriter.close();
fOut.close();
Toast.makeText(getApplicationContext(), "Finished writing to SD", Toast.LENGTH_LONG).show(); //##5
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "Write failure", Toast.LENGTH_SHORT).show(); //##6
}
}
}
fnam 和 mdata 是简单的文本,例如“myfile”和“This is my test data”。
第一个问题是我第一次运行它时,我得到了我预期的 toast 消息 ##2(文件夹不存在)。但是,我希望创建一个目录 AMJ,以便下次运行代码时,我会收到消息 ##1 说该目录现在存在,但这并没有发生 - 它仍然说该目录不存在.
第二个问题(当然可能只是第一个问题的结果)是文件创建/写入不起作用,我每次都收到“catch”消息##6。
我的清单如下所示:
package="com.example.chris.filewritetests">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
我在 Android Studio 模拟器上运行它。
谁能告诉我这里出了什么问题?
【问题讨论】:
-
摆脱所有
Toasts。使用Log.e()将消息记录到LogCat,特别是记录您在catch块中遇到的特定异常。另外,没有android.permission.STORAGE权限,你可能没有runtime permissions 的代码,你可能最终想要get this file indexed so that it shows up for users。