`
kevinlynx
  • 浏览: 82247 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

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);
    }

分享到:
评论
2 楼 kevinlynx 2010-12-27  
Lee_Dewyze 写道
楼主   你这样直接将要写的文件路径定下来不太好吧  应该先获得sd卡的目录结构。。。   建议一下  互相学习哈

恩。呵呵。
1 楼 Lee_Dewyze 2010-12-27  
楼主   你这样直接将要写的文件路径定下来不太好吧  应该先获得sd卡的目录结构。。。   建议一下  互相学习哈

相关推荐

Global site tag (gtag.js) - Google Analytics