读书人

Android: 写资料到SD卡

发布时间: 2012-09-06 10:37:01 作者: rapoo

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卡的目录结构。。。 建议一下 互相学习哈
恩。呵呵。

读书人网 >Android

热点推荐