Android -- 读写文件到内部ROM,SD卡,SharedPreferences,文件读写权限
来源:互联网 发布:软件开发中的专业术语 编辑:程序博客网 时间:2024/05/24 05:19
(内容整理自张泽华教程)
1. 概述
使用文件进行数据存储
首先给大家介绍使用文件如何对数据进行存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。
public class FileActivity extends Activity {
@Override public void onCreate(Bundle savedInstanceState) {
...
FileOutputStream outStream = this.openFileOutput("itcast.txt", Context.MODE_PRIVATE);
outStream.write("传智播客".getBytes());
outStream.close();
}
}
openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/”,如果文件不存在,Android会自动创建它。创建的文件保存在/data/data/<package name>/files目录,如:/data/data/cn.itcast.action/files/itcast.txt,通过点击Eclipse菜单“Window”-“Show View”-“Other”,在对话窗口中展开android文件夹,选择下面的File Explorer视图,然后在File Explorer视图中展开/data/data/<package name>/files目录就可以看到该文件。
openFileOutput()方法的第二参数用于指定操作模式,有四种模式,分别为:Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
如果希望文件被其他应用读和写,可以传入:
openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
读取文件内容
如果要打开存放在/data/data/<package name>/files目录应用私有的文件,可以使用Activity提供openFileInput()方法。
FileInputStream inStream = this.getContext().openFileInput("itcast.txt");
Log.i("FileTest", readInStream(inStream));
readInStream()的方法请看本页下面备注。
或者直接使用文件的绝对路径:
File file = new File("/data/data/cn.itcast.action/files/itcast.txt");
FileInputStream inStream = new FileInputStream(file);
Log.i("FileTest", readInStream(inStream));
注意:上面文件路径中的“cn.itcast.action”为应用所在包,当你在编写代码时应替换为你自己应用使用的包。
对于私有文件只能被创建该文件的应用访问,如果希望文件能被其他应用读和写,可以在创建文件时,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。
Activity还提供了getCacheDir()和getFilesDir()方法:
getCacheDir()方法用于获取/data/data/<package name>/cache目录
getFilesDir()方法用于获取/data/data/<package name>/files目录
把文件存放在SDCard
在程序中访问SDCard,你需要申请访问SDCard的权限。
在AndroidManifest.xml中加入访问SDCard的权限如下:
<!-- 在SDCard中创建与删除文件权限-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
要往SDCard存放文件,程序必须先判断手机是否装有SDCard,并且可以进行读写。
注意:访问SDCard必须在AndroidManifest.xml中加入访问SDCard的权限
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录
File saveFile = new File(sdCardDir, “itcast.txt”);
FileOutputStream outStream = new FileOutputStream(saveFile);
outStream.write("传智播客".getBytes());
outStream.close();
}
Environment.getExternalStorageState()方法用于获取SDCard的状态,如果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于Environment.MEDIA_MOUNTED。
Environment.getExternalStorageDirectory()方法用于获取SDCard的目录,当然要获取SDCard的目录,你也可以这样写:
File sdCardDir = new File("/mnt/sdcard"); //获取SDCard目录
File saveFile = new File(sdCardDir, "itcast.txt");
//上面两句代码可以合成一句:File saveFile = new File("/mnt/sdcard/itcast.txt");
FileOutputStream outStream = new FileOutputStream(saveFile);
outStream.write("传智播客test".getBytes());
outStream.close();
2. 示例代码
获取SD卡大小示例代码
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);TextView tv = (TextView) findViewById(R.id.tv_sdsize);File path = Environment.getExternalStorageDirectory();StatFs stat = new StatFs(path.getPath());long blockSize = stat.getBlockSize();long availableBlocks = stat.getAvailableBlocks();long sizeAvailSize = blockSize * availableBlocks;String str = Formatter.formatFileSize(this, sizeAvailSize);tv.setText(str);}
数据存储示例代码:
activity_main.xml 布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/input_name" /> <EditText android:id="@+id/et_name" android:layout_width="fill_parent" android:layout_height="wrap_content" android:inputType="text" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/input_password" /> <EditText android:id="@+id/et_password" android:layout_width="fill_parent" android:layout_height="wrap_content" android:inputType="textPassword" /> <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" > <CheckBox android:id="@+id/cb_remember" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/remember_pwd" /> <Button android:onClick="login" android:layout_alignParentRight="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/login" /> </RelativeLayout> <RadioGroup android:id="@+id/rg_save_location" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" > <RadioButton android:id="@+id/rb_rom" android:layout_width="wrap_content" android:layout_height="wrap_content" android:checked="true" android:text="ROM" /> <RadioButton android:id="@+id/rb_sd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="SD" /> <RadioButton android:id="@+id/rb_sp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="SP" /> </RadioGroup></LinearLayout>
AndroidManifest.xml SD权限
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.itheima.login" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.itheima.login.MainActivity" 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>
SaveService.java 业务类
package com.itheima.login.service;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.HashMap;import java.util.Map;import android.content.Context;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.os.Environment;import com.itheima.login.utils.StreamTools;public class SaveService {/** * 保存数据到手机rom的文件里面. * @param context 应用程序的上下文 提供环境 * @param name 用户名 * @param password 密码 * @throws Exception */public static void saveToRom(Context context, String name , String password) throws Exception{//File file = new File("/data/data/com.itheima.login/files/pwd.txt");File file = new File(context.getFilesDir(),"pwd.txt");FileOutputStream fos = new FileOutputStream(file);String txt = name+":"+password;fos.write(txt.getBytes());fos.flush();fos.close();}/** * 从rom读取用户的密码信息 * @param context * @return */public static String readFromRom(Context context) throws Exception{File file = new File(context.getFilesDir(),"pwd.txt");FileInputStream fis = new FileInputStream(file);String result = StreamTools.readFromStream(fis);return result;}/** * 保存数据到SD卡 * @param name 用户名 * @param password 密码 * @throws Exception */public static void saveTOSD(String name ,String password) throws Exception{File file = new File(Environment.getExternalStorageDirectory(),"pwd.txt");FileOutputStream fos = new FileOutputStream(file);String txt = name+":"+password;fos.write(txt.getBytes());fos.flush();fos.close();}/** * 保存应用程序数据 到sharedpreference * @param context 上下文 * @param name 姓名 * @param password 密码 */public static void saveTOSP (Context context, String name, String password){//获取系统的一个sharedpreference文件 名字叫 spSharedPreferences sp = context.getSharedPreferences("sp", Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE);//创建一个编辑器 可以编辑 spEditor editor = sp.edit();editor.putString("name", name);editor.putString("password", password);editor.putBoolean("boolean", false);editor.putInt("int", 8888);editor.putFloat("float",3.14159f);//注意:调用 commit 提交 数据到文件.editor.commit();//editor.clear();}/** * 获取系统sharepreference里面的数据 * @param context * @return */public static Map<String,String> readFromSP(Context context){Map<String,String> map = new HashMap<String, String>();SharedPreferences sp = context.getSharedPreferences("sp", Context.MODE_PRIVATE);String name = sp.getString("name", "defaultname");String password = sp.getString("password", "password");map.put("name", name);map.put("password", password);return map;}}
MainActivity.java
package com.itheima.login;import java.util.Map;import com.itheima.login.service.SaveService;import android.os.Bundle;import android.os.Environment;import android.app.Activity;import android.text.TextUtils;import android.util.Log;import android.view.View;import android.widget.CheckBox;import android.widget.EditText;import android.widget.RadioGroup;import android.widget.Toast;public class MainActivity extends Activity {private static final String TAG = "MainActivity";private EditText et_name;private EditText et_password;private CheckBox cb_remember;private RadioGroup rg_save_location;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);et_name = (EditText) findViewById(R.id.et_name);et_password = (EditText) findViewById(R.id.et_password);cb_remember = (CheckBox) findViewById(R.id.cb_remember);rg_save_location = (RadioGroup) findViewById(R.id.rg_save_location);// 检查 rom文件里面是否 有 密码信息/*try {String result = SaveService.readFromRom(this);String[] infos = result.split(":");et_name.setText(infos[0]);et_password.setText(infos[1]);} catch (Exception e) {e.printStackTrace();}*///获取sp里面的数据Map<String, String> map = SaveService.readFromSP(this);et_name.setText(map.get("name"));et_password.setText(map.get("password"));}public void login(View view) {String name = et_name.getText().toString().trim();String password = et_password.getText().toString().trim();if (TextUtils.isEmpty(name) || TextUtils.isEmpty(password)) {Toast.makeText(this, R.string.error_msg, Toast.LENGTH_SHORT).show();return;}if (cb_remember.isChecked()) {Log.i(TAG, "记住密码");Log.d(TAG, "NAME=" + name);Log.d(TAG, "PASSWORD=" + password);int radiobuttonId = rg_save_location.getCheckedRadioButtonId();switch (radiobuttonId) {case R.id.rb_rom:try {SaveService.saveToRom(this, name, password);Toast.makeText(this, "保存rom用户名密码 成功", Toast.LENGTH_LONG).show();} catch (Exception e) {e.printStackTrace();Toast.makeText(this, "保存rom用户名密码 失败", Toast.LENGTH_LONG).show();}break;case R.id.rb_sd:if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {try {SaveService.saveTOSD(name, password);Toast.makeText(this, "保存sd用户名密码 成功", Toast.LENGTH_LONG).show();} catch (Exception e) {e.printStackTrace();Toast.makeText(this, "保存sd用户名密码 失败", Toast.LENGTH_LONG).show();}}else{Toast.makeText(this, "sd卡不可用 ,请检查sd卡状态", 0).show();}break;case R.id.rb_sp:SaveService.saveTOSP(this, name, password);Toast.makeText(this, "保存到sp完成", 0).show();break;}} else {Log.i(TAG, "不需要记住密码");}}}
------------------- sharePreference 可以使用 PreferenceScreen 通过xml配置文件生成
activity文件
package com.example.datastoragetest;import java.io.FileNotFoundException;import java.io.FileOutputStream;import org.apache.http.client.methods.HttpGet;import android.os.Bundle;import android.os.Environment;import android.preference.Preference;import android.preference.Preference.OnPreferenceClickListener;import android.preference.PreferenceActivity;import android.preference.PreferenceFragment;import android.preference.PreferenceManager;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.util.Log;import android.view.Menu;import android.widget.Toast;public class MainActivity extends Activity {//方式一: 已过时//@Override//protected void onCreate(Bundle savedInstanceState) {//super.onCreate(savedInstanceState);////setContentView(R.layout.activity_main);////addPreferencesFromResource(R.xml.preferencedata1);//Preference preference = findPreference("orientation");//preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {//@Override//public boolean onPreferenceClick(Preference preference) {//Toast.makeText(MainActivity.this, "orientation click", Toast.LENGTH_SHORT).show();//return false;//}//});////}//方式二: 使用fragment@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); //R.id.content为布局文件中的一个ViewGroupgetFragmentManager().beginTransaction().replace(R.id.content, new Prefs2Fragment()).commit();//文件的读写Log.i("myLog", getFilesDir().getPath());Log.i("myLog", Environment.getExternalStorageState());try {FileOutputStream fos = openFileOutput("text.txt", Context.MODE_WORLD_WRITEABLE);fos.write("hello wold\n".getBytes());fos.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static class Prefs2Fragment extends PreferenceFragment {@Overridepublic void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);//设置sharepreference的资源文件addPreferencesFromResource(R.xml.preferencedata1);Preference preference = findPreference("orientation");//监听事件preference.setOnPreferenceClickListener(new OnPreferenceClickListener() {@Overridepublic boolean onPreferenceClick(Preference preference) {Log.i("myLog", "click event");return false;}}); }}}res/xml/preferencedata1.xml PreferenceScreen 配置文件
其中WIFI可以通过添加intent 直接开启其他的activity
<?xml version="1.0" encoding="utf-8"?><PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > <PreferenceCategory android:title="屏幕"> <CheckBoxPreference android:key="orientation" android:title="屏幕方向" android:summary="设置你屏幕的方向" /> <ListPreference android:key="resolution " android:title="分辨率" android:summary="设置你要的分辨率" android:dialogTitle="选择分辨率" android:entries="@array/resolution" android:entryValues="@array/resolutionValue" /> <RingtonePreference android:key="myRingtone" android:title="手机铃声" /> </PreferenceCategory><PreferenceScreen android:title="WIFI"> <intent android:action="android.settings.WIFI_SETTINGS"> </intent></PreferenceScreen><PreferenceScreen android:title="其他"> <PreferenceCategory android:title="wifi"> <EditTextPreference android:title="设置wifi地址" android:key="wifiaddr"/> <EditTextPreference android:title="设置wifi密码" android:key="wifipasswd" /> </PreferenceCategory> </PreferenceScreen> </PreferenceScreen>
- Android -- 读写文件到内部ROM,SD卡,SharedPreferences,文件读写权限
- android 读写SD卡文件
- Android 读写SD卡文件
- Android 内部存储文件读写权限
- Android读写文件、写文件到SD卡
- Android: SD卡访问及文件读写权限
- Android SD卡文件读写目录及权限
- SD卡读写文件
- 读写SD卡文件
- sd卡读写文件
- SD卡文件读写
- android文件读写权限
- android读写文件权限
- android sd卡读写权限
- android sd卡读写权限
- android SD卡学习3-读写文件
- Android的SD卡文件读写
- android中读写sd卡文件
- 一道考递归的题目
- 猜数游戏
- 浏览器默认样式表 - 清风小阁 - 博客频道 - CSDN.NET
- FIO 硬盘测试
- 软件测试基础理论杂记一
- Android -- 读写文件到内部ROM,SD卡,SharedPreferences,文件读写权限
- 测试用例设计方法大全
- 独立开发电子商务网站---功能分析
- Android 判断横屏还是竖屏以及设置方式
- 解决Android ListView中图片异步加载错位问题
- Python库集锦
- opencv学习笔记12 图像轮廓的提取和绘制
- mockMvc的url详解
- [置顶] JavaWeb学习篇之----web应用的虚拟目录映射和主机搭建(Tomcat)