4

虽然我对Android相对较新,但我有基于Java和C的编程方面的经验,并且我正在使用Eclipse和常用工具集发展。我已经阅读了围绕这个主题的大部分帖子,我相信我已经包含/应用了所有的建议和测试。我以前使用FileOutputStream来写入内部,应用程序特定的文件,为L8构建,没有任何问题。我现在正在写一个SD卡上的文件,搭配Android 2.1的Build L7。以下代码来自单击3个按钮的活动(写入,读取&发送),我正在使用它来测试基本代码。虽然所有包含在FileOutputStream(FOS)构造函数中的测试(存在,可写和createNewFile或mkdirs上的IOException)都通过AOK,但FOS构造失败,抛出FileNotFoundException,见下文。我已经完成了调试并确认了问题,请参阅底部的LogCat。这是通过ADB在Eclipse标准模拟器上运行的,SD卡包含在256kB版本中。FileOutputStream失败,FileNotFoundException即使该文件显然存在也是可写的并且具有权限

从我的onw createExternalStorageFile()方法。

File file = null; 
     file = new File(Environment.getExternalStorageDirectory(), mfileName);    
     if(file != null) { 
      //file.mkdirs(); 
      try { 
       file.createNewFile(); 
      } catch (IOException e1) { 
       Log.e(TAG, "createNewFile() failed!", e1); 
       return false; 
      } 
     } 
     if(!file.exists()) { 
      Log.d(TAG, "file does not exist!"); 
     } 
     if(!file.canWrite()) { 
      Log.d(TAG, "cannot write to file!"); 
     } 
     Log.d(TAG, "full file-path is: " + file.toString()); 

     FileOutputStream fOS = null; 
     try { 
      //fOS = new FileOutputStream(file); 
      fOS = new FileOutputStream(file.toString()); 
      // *** THIS THROW THE FILENOTFOUNDEXCEPTION *** 
     } catch (FileNotFoundException e1) { 
      Log.e(TAG, "fOS-FileNotFoundException", e1); 
      return false; 
     } 
     // fOS IS STILL NULL - HOW CAN THIS BE! 
     if(fOS != null) { 
      try { 
       fOS.write(TESTDATA.getBytes()); 
       fOS.close(); 
      } catch (IOException e1) { 
       Log.e(TAG, "IOException from fOS-write()!", e1); 
       return false; 
      } 
      Log.d(TAG, "fos-fd is: " + fOS.toString()); 
     } 
     return true; 

>

我的清单文件包含的使用许可权的声明如下:

>

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="org.eddiem.adeveloper.externalfilesend" 
     android:versionCode="1" android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="7" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true"> 
     <activity android:name=".ExternalFileSendActivity" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

>

因此,这是声明之外,应该OK?

任何人都可以请帮助解决为什么FileOutputStream失败即使我的所有测试似乎证实它应该工作的谜语?

> logcat的: 11-02 15:40:54.754:DEBUG/MediaScannerService(154):开始扫描体积外部 11-02 15:40:54.764:VERBOSE/MediaProvider(154):/ SD卡卷ID:300427547 11-02 15:40:54.894:INFO/System.out(202):调试器已结算(1479) 11-02 15:40:55.024:VERBOSE/MediaProvider(154):附加卷:外部VERBOSE/MediaScanner(154):pruneDeadThumbnailFiles ... [email protected] 11-02 15:40:55.915:VERBOSE/MediaScanner(154):/ pruneDeadThumbnailFiles。 .. [email protected] 11-02 15:4 0:55.925:DEBUG/MediaScanner(154):预扫描时间:715ms 11-02 15:40:55.955:DEBUG/MediaScanner(154):扫描时间:4ms 11-02 15:40:55.955:DEBUG/MediaScanner 154):后扫描时间:55ms 11-02 15:40:55.955:调试/ MediaScanner(154):总时间:774ms 11-02 15:40:55.964:DEBUG/MediaScannerService(154):完成扫描音量外部 (52):pokeWakelock(5000) 11-02 15:44:51.334:DEBUG/KeyguardViewMediator(52):pokeWakelock(5000) 11-02 15:44:51.384 :INFO/ActivityManager(52):显示的活动org.eddiem.adeveloper。filesendl7/.FileSendL7Activity:239793 ms(total 255760 ms) 11-02 15:44:51.394:INFO/ARMAssembler(52):生成的scanline__00000077:03545404_00000A04_00000000 [29 ipp](51 ins)在[0x46ac60:0x46ad2c] in 757079 ns 11-02 15:44:51.414:657626 ns中的[0x46ad30:0x46aeb8]处生成的scanline__00000177:03515104_00001A01_00000000 [73 ipp](98 ins)信息/ ARMA编组器(52): 11-02 15:45:05.884:DEBUG/FileSendL7Activity(202):完整文件路径是:/sdcard/testFile.txt 11-02 15:45:22.484:ERROR/FileSendL7Activity(202):fOS-FileNotFoundException 11-02 15:45:22.484:ERROR/FileSendL7Activity (202):java.io.FileNotFoundException:/sdcard/testFile.txt 11-02 15:45:22.484:ERROR/FileSendL7Activity(202):at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem。 java:244) 11-02 15 :45:22.484:错误/ FileSendL7Activity(202):在java.io.FileOutputStream。(FileOutputStream.java:97) 11-02 15:45:22.484:ERROR/FileSendL7Activity(202):在java.io.FileOutputStream。 (FileOutputStream.java:168) 11-02 15:45:22.484:ERROR/FileSendL7Activity(202):at java.io.FileOutputStream。(FileOutputStream.java:147) 11-02 15:45:22.484:ERROR/FileSendL7Activity(202):at org.eddiem.adeveloper.filesendl7.FileSendL7Activity.creatExternalStorageFileOS(FileSendL7Activity.java:149) 11-02 15:45:22.484:ERROR/FileSendL7Activity(202):at org.eddiem.adeveloper.filesendl7。 FileSendL7Activity.access $ 0(FileSendL7Activity.java:124) 11-02 15:45:22.484:ERROR/FileSendL7Activity(202):at org.eddiem.adeveloper.filesendl7.FileSendL7Activity $ 1.onClick(FileSendL7Activity.java:176) 11 -02 15:45:22.484:错误/ FileSendL7Act ivity(202):在android.view.View.performClick(View.java:2364)

>

由于

+0

你正在测试什么设备? – FoamyGuy

+0

导致异常的线是什么?你能指出我们吗? – androidnoob

+0

对不起。我在Eclipse的模拟器上测试了这一点,构建的是Android 2.1,API Level 7.失败的行是:fOS = new FileOutputStream(file); –

回答

1

尝试此

if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 
     Log.e("TEST", "this is bad"); 
} 

File file = new File(getExternalFilesDir(null), "test.csv"); 

try { 
    FileOutputStream fos = new FileOutputStream(file); 
fos.write(...); 
fos.close(); 
} catch (FileNotFoundException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} catch (IOException e) { 
// TODO Auto-generated catch block 
e.printStackTrace(); 
} 
+0

这个例子适用于我。但是,我只是尝试添加file.createNewfile();在创建FileOutputStream之前,然后我得到了同样的错误。 –

+0

尽管getExternalFilesDir()方法出现在http://developer.android.com/reference/android/content/Context.html ..Eclipse声称这在Level 7构建的上下文中没有定义。所以我更加困惑于我的设置。 –

4

有许多的从阅读中吸取教训。 首先确保您的Eclipse或其他IDE已完全更新,并且所有软件包和工具都已正确加载。下一课是确保你知道所有的工具是如何工作的!见下文 - DDMS中的File_Explorer。 与这些明显的编码问题相关的最大的单一问题是,通过Eclipse调试工具提供的编码实验的结果显示出与Android文档中描述的完全不同的图像。我自己的偏执狂造成了其余的问题,我只是将其包含到许多版本的代码片段和太多的测试中。

的技术问题/答案是如下:

  1. 的Android 2.1(API-L7)和2.2(API-L8)实现不同的SD卡的文件结构。所以getExternalStorageDirectory()返回/ sdcard /为 L7和/ mnt/sdcard /为L8。

  2. http://developer.android.com/guide/topics/data/data-storage.html上的外部存储的Android文档是 正确;使用Environment.getExternalStorageDirectory()2.1(L7)+ 只有使用Context.getExternalFilesDir(空)2.2(L8)+

  3. Contructing一个文件对象不创建文件或所提供的名称的目录。如果要实际创建超出根目录树和其中的文件的目录树 ,则必须使用mkdirs()和 createNewFile()。但是,在成功打开FileOutputStream时创建的实际文件是 ,因此 通常不需要使用createNewFile()。你必须使用mkdirs,你需要 来创建你自己的目录。

  4. Android的虚拟设备在Eclipse中创建和仿真器使用其实并创建目录和文件,你可以看到 调试过程中,这些使用上的DDMS的File_Explorer标签。注: 这些目录和文件是永久性的,并不会自动删除 。在运行 或调试代码后,使用这些工具自行删除文件。

  5. 最后使用字节数组的BufferedOutputStream是小文件和/或多写的首选选项。 FILEWRITE用于 字符数组,并在所有的情况下,你必须在你的 的manifest.xml

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

的罗嗦Q & A A最终道歉,但我希望很多人阅读和学习我的痛苦。 :o)

相关问题