Android: 写文件到SD卡
考虑到SD卡可能没有被mount,或者其他各种情况,操作SD卡上的文件总需要各种状态的判断。主要是使用Environment类里的一些接口进行判断:
private void writeFileToSD() { String sdStatus = Environment.getExternalStorageState(); if(!sdStatus.equals(Environment.MEDIA_MOUNTED)) { Log.d("TestFile", "SD card is not avaiable/writeable right now."); return; } try { String pathName="/sdcard/test/"; String fileName="file.txt"; File path = new File(pathName); File file = new File(pathName + fileName); if( !path.exists()) { Log.d("TestFile", "Create the path:" + pathName); path.mkdir(); } if( !file.exists()) { Log.d("TestFile", "Create the file:" + fileName); file.createNewFile(); } FileOutputStream stream = new FileOutputStream(file); String s = "this is a test string writing to file."; byte[] buf = s.getBytes(); stream.write(buf); stream.close(); } catch(Exception e) { Log.e("TestFile", "Error on writeFilToSD."); e.printStackTrace(); } }需要加入权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
看文档说,可以使用Context.getExternalFilesDir来取得一个特殊的文件夹,该文件夹对USER不可见,最重要的是:当系统卸载该程序时,会自动删除该目录下的文件。
如果不需要往SD卡上写文件,可以直接用以下简单代码:
private void writeFile() { try { FileOutputStream stream = openFileOutput("testfile.txt", Context.MODE_WORLD_WRITEABLE); String s = "this is a test string writing to file."; byte[] buf = s.getBytes(); stream.write(buf); stream.close(); } catch (FileNotFoundException e) { Log.d("TestFile", "File not found."); } catch (IOException e) { Log.d("TestFile", "File write error."); } }该文件会被放置于data/data/your_app_package_name/files下。
值得注意的是,我们可以在程序运行期间动态检查SD卡是否可用。大致就是通过注册BroadcastReceiver实现,这个官方文档里有提到:
void startWatchingExternalStorage() { mExternalStorageReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.i("test", "Storage: " + intent.getData()); updateExternalStorageState(); } }; IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_MEDIA_MOUNTED); filter.addAction(Intent.ACTION_MEDIA_REMOVED); registerReceiver(mExternalStorageReceiver, filter); updateExternalStorageState(); } void stopWatchingExternalStorage() { unregisterReceiver(mExternalStorageReceiver); }1 楼 Lee_Dewyze 2010-12-27 楼主 你这样直接将要写的文件路径定下来不太好吧 应该先获得sd卡的目录结构。。。 建议一下 互相学习哈 2 楼 kevinlynx 2010-12-27 Lee_Dewyze 写道楼主 你这样直接将要写的文件路径定下来不太好吧 应该先获得sd卡的目录结构。。。 建议一下 互相学习哈
恩。呵呵。