创建文件夹并将文件写入外部存储

时间:2017-06-19 17:12:41

标签: android file directory

我正在尝试创建一个目录,然后将数据写入外部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模拟器上运行它。

有人可以告诉我这里有什么问题吗?

2 个答案:

答案 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轻松查看文件夹和文件的创建位置。我会向那些正在努力解决这类问题的人推荐。