【问题标题】:Creating folders and writing files to external storage创建文件夹并将文件写入外部存储
【发布时间】: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 模拟器上运行它。

谁能告诉我这里出了什么问题?

【问题讨论】:

标签: android file directory


【解决方案1】:

目录不是自动创建的。 您需要在文件对象上创建那些调用 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
       }

【讨论】:

  • 我按照建议尝试了这段代码,但没有成功。它在 datfile.createNewFile() 行失败。我在设置文件路径和名称(String namFile=..........)的方式上做错了吗?
  • 你不需要第一个 if 来检查文件夹是否存在,因为 mkdirs() 会为你做这件事。而且 createNewFile() 也不需要。
【解决方案2】:

使用 Log.e() 的建议帮助我指明了正确的方向 - 谢谢。我认为我的问题是我没有意识到内置内存和 SD 卡不一定与内部和外部存储相同,并且设备有时可以将 SD 卡上的内存用作“内部”。

当我在真实设备上运行代码时,我发现了发生了什么,一个有 SD 卡,一个没有 SD 卡,而不是使用模拟器。这使得使用设备的 FileCommander 可以轻松查看创建文件夹和文件的确切位置。我会向所有遇到此类问题的人推荐它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    相关资源
    最近更新 更多