我正在尝试创建一个目录,然后将数据写入外部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"和"这是我的测试数据"。
第一个问题是,我第一次运行此操作时,我得到的吐司消息## 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模拟器上运行它。
有人可以告诉我这里有什么问题吗?
答案 0 :(得分:0)
不会自动创建目录。
您需要在文件对象上创建调用mkdir()的目录
datfile.mkdirs()
改变它
try {
String namFile = Environment.getExternalStorageDirectory() + "/AMJ/" + fnam;
File datfile = new File(namFile);
datfile.mkdirs();
Toast.makeText(getApplicationContext(), "File is: " + datfile, Toast.LENGTH_LONG).show(); //##4
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
}
答案 1 :(得分:0)
使用Log.e()的建议有助于指出我正确的方向 - 谢谢。我认为我的问题是我没有意识到内置内存和SD卡不一定与内部和外部存储相同,并且设备有时可以将SD卡上的内存用作“内部”。
我发现当我在真实设备上运行代码时会发生什么,一个是SD卡而另一个没有,而不是使用模拟器。这使得使用设备的FileCommander轻松查看文件夹和文件的创建位置。我会向那些正在努力解决这类问题的人推荐。