Presentation is loading. Please wait.

Presentation is loading. Please wait.

SharedPreferences与文件存储

Similar presentations


Presentation on theme: "SharedPreferences与文件存储"— Presentation transcript:

1 SharedPreferences与文件存储

2 课程安排 SharedPreferences 不同应用共享数据 Android文件操作 SDCard文件存取

3 Android数据存储方式 Shared Preferences 存储到文件 SQLite数据库
内容提供者(Content provider) 存储到网络服务器

4 SharedPreferences 如何保存软件配置参数: Window: 采用ini文件进行
j2se应用: 采用properties属性文件 Android平台提供一个SharedPreferences类,它是一个轻量级的存储类,适合用于保存软件配置参数。 使用SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs目录下

5 SharedPreferences接口 SharedPreferences接口主要负责读取应用程序的Preferences数据,它提供了如下常用方法来访问SharedPreferences的key_value键值对。 方法名称 描述 public abstract boolean contains (String key) 判断SharedPreferences是否包含特定key的数据 public abstract SharedPreferences.Editor edit () 返回一个Edit对象用于操作SharedPreferences public abstract Map<String, ?> getAll () 获取SharedPreferences数据里全部的key-value对 getXXX(String key,XXX defvlaue) 获取SharedPreferences数据指定key所对应的value,如果该key不存在,返回默认值defValue。其中XXX可以是boolean、float、int、long、String等基本类型的值

6 Editor接口 由于SharedPreference是一个接口,而且在这个接口里并没有提供写入数据和读取数据的能力。但是在其内部有一个Editor内部的接口,Edit这个接口有一系列的方法用于操作SharedPreference。 方法名称 描述 public abstract SharedPreferences.Editor clear () 清空SharedPreferences里所有的数据 public abstract boolean commit () 当Editor编辑完成后,调用该方法可以提交修改,而且必须要调用这个数据才修改 public abstract SharedPreferences.Editor putXXX (String key, boolean XXX) 向SharedPreferences存入指定的key对应的数据,其中XXX可以是boolean、float、int、long、String等基本类型的值 public abstract SharedPreferences.Editor remove (String key) 删除SharedPreferences里指定key对应的数据项

7 SharedPreferences存储数据
SharedPreferences sharedPreferences = getSharedPreferences("lxt008", Context.MODE_PRIVATE); Editor editor = sharedPreferences.edit();//获取编辑器 editor.putString("name", "lxt"); editor.putInt("age", 35); editor.commit();//提交修改 生成的lxt008.xml文件内容如下: <?xml version=“1.0” encoding=“utf-8” standalone=“yes” ?> <map> <string name="name">lxt</string> <int name="age" value=“30" /> </map>

8 SharedPreferences操作模式
getSharedPreferences(na, memode)方法 参数1:指定该文件名称,名称不用带后缀。 参数2:指定文件的操作模式,共有四种操作模式。 Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。 Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。 MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。 getPreferences(mode)方法操作SharedPreferences,这个方法默认使用当前类不带包名的类名作为文件的名称。

9 访问SharedPreferences数据
SharedPreferences sharedPreferences = getSharedPreferences("lxt008", Context.MODE_PRIVATE); //getString()第二个参数为缺省值,如果preference中不存在该key,将返回缺省值 String name = sharedPreferences.getString("name", ""); int age = sharedPreferences.getInt("age", 1);

10 课程安排 SharedPreferences 不同应用共享数据 Android文件操作 SDCard文件存取

11 访问其他应用SharedPreferences数据
其他应用要访问上面应用的preference,首先需要创建上面应用的Context,然后通过Context访问preference,访问preference时会在应用所在包下的shared_prefs目录找到preference : Context otherAppsContext = createPackageContext(“com.test",Context.CONTEXT_IGNORE_SECURITY); SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences(“test", Context.MODE_WORLD_READABLE); String name = sharedPreferences.getString("name", ""); int age = sharedPreferences.getInt("age", 0);

12 课程安排 SharedPreferences 不同应用共享数据 Android文件操作 SDCard文件存取

13 文件存储 文件可以存储比使用引用更大数量的数据 Android 提供方法来读、写文件 只有本地文件可以被访问 优点:可以存储大容量的数据
缺点:文件更新或是格式改变可能会导致巨大的编程工作

14 Java提供了一套完整的IO流体系,用来对文件进行操作。Android同样支持以这种方式来访问手机存储器上的文件,包括内部存储器和外部存储器
第二种方式,使用Context提供的方法来直接操作

15 Java IO读文件操作 Context.openFileInput(String name) 打开一个与应用程序联系的私有文件输入流
// 读取文件内容       private String readFiles() {           String content = null;           try {               FileInputStream fis = openFileInput(FILENAME);               ByteArrayOutputStream baos = new ByteArrayOutputStream();               byte[] buffer = new byte[1024];               int len = 0;               while ((len = fis.read(buffer)) != -1) {                   baos.write(buffer, 0, len);               }               content = baos.toString();               fis.close();               baos.close();           } catch (Exception e) {               e.printStackTrace();           }           return content;       }   Context.openFileInput(String name) 打开一个与应用程序联系的私有文件输入流 当文件不存在时抛出FileNotFoundException FileInputStream in = this.openFileInput("test.txt");//打开文件"test.txt" …… in.close();//关闭输入流

16 Java IO写文件操作 Context.openFileOutput(String name,int mode)
开启一个与应用程序联系的私有文件输出流 当文件不存在时该文件将被创建 文件输出流可以在添加模式中打开,这意味新的数据将被添加到文件的末尾 FileOutputStream out = this.openFileOutput("test2.txt",MODE_APPEND); //打开文件"test2.txt"进行写操作、使用MODE_APPEND 在添加模式中打开文件 …… out.close();//关闭输出流 // 保存文件内容       private void writeFiles(String content) {           try {               // 打开文件获取输出流,文件不存在则自动创建               FileOutputStream fos = openFileOutput(FILENAME,                     Context.MODE_PRIVATE);               fos.write(content.getBytes());               fos.close();           } catch (Exception e) {               e.printStackTrace();           }       }  

17 使用Context进行文件存储 Context提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。 public class FileActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { ... FileOutputStream outStream = this.openFileOutput(“test.txt", Context.MODE_PRIVATE); outStream.write(“zf".getBytes()); outStream.close(); } openFileOutput()方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android 会自动创建它。创建的文件保存在/data/data/<package name>/files目录,如: /data/data/com.test/files/test.txt ,通过点击Eclipse菜单“Window”-“Show View”-“Other”,在对话窗口中展开android文件夹,选择下面的File Explorer视图,然后在File Explorer视图中展开/data/data/<package name>/files目录就可以看到该文件。

18 使用Context进行文件存储 openFileOutput()方法的第二参数用于指定操作模式,有四种模式,分别为:
Context.MODE_PRIVATE    = 0   为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND Context.MODE_APPEND    = 32768  模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。 Context.MODE_WORLD_READABLE = 1  表示当前文件可以被其他应用读取 Context.MODE_WORLD_WRITEABLE = 2  表示当前文件可以被其他应用写入

19 使用Context读取文件 如果要打开存放在/data/data/<package name>/files目录应用私有的文件,可以使用Context提供openFileInput()方法。 FileInputStream inStream = this.getContext().openFileInput(“lxt008.txt"); Log.i("FileTest", readInStream(inStream)); readInStream()的方法请看本页下面备注。 或者直接使用文件的绝对路径: File file = new File("/data/data/com.test/files/lxt008.txt"); FileInputStream inStream = new FileInputStream(file); 注意:上面文件路径中的“com.test”为应用所在包,应替换为你自己应用使用的包。 对于私有文件只能被创建该文件的应用访问,如果希望文件能被其他应用读和写,可以在创建文件时,指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。 Activity还提供了getCacheDir()和getFilesDir()方法: getCacheDir()方法用于获取/data/data/<package name>/cache目录 getFilesDir()方法用于获取/data/data/<package name>/files目录 public static String readInStream(FileInputStream inStream){ try { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length = -1; while((length = inStream.read(buffer)) != -1 ){ outStream.write(buffer, 0, length); } outStream.close(); inStream.close(); return outStream.toString(); } catch (IOException e) { Log.i("FileTest", e.getMessage()); return null; 19

20 读取Resources和Assets中的文件
在Android中,除了对应用程序私有文件夹中的文件进行操作之外,还可以从资源文件和Assets中获得输入流读取数据。这些文件分别存放在应用程序的res/raw目录和assets目录下。这些文件将在编译的时候和其他文件一起打包进APK中。 注意,这两个文件夹下的文件只能进行读操作,不能进行写操作。 1.读取res/raw下的文件资源,通过以下方式获取输入流来进行写操作 InputStream is = getResources().openRawResource(R.id.filename);   2.读取assets下的文件资源,通过以下方式获取输入流来进行写操作 AssetManager am = null;   am = getAssets();   InputStream is = am.open("filename");   public static String readInStream(FileInputStream inStream){ try { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length = -1; while((length = inStream.read(buffer)) != -1 ){ outStream.write(buffer, 0, length); } outStream.close(); inStream.close(); return outStream.toString(); } catch (IOException e) { Log.i("FileTest", e.getMessage()); return null; 20

21 课程安排 SharedPreferences 不同应用共享数据 Android文件操作 SDCard文件存取

22 把文件存放在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"/>

23 把文件存放在SDCard 要往SDCard存放文件,程序必须先判断手机是否装有SDCard,并且可以进行读写。
注意:访问SDCard必须在AndroidManifest.xml中加入访问SDCard的权限 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ File sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录 File saveFile = new File(sdCardDir, “test.txt”); FileOutputStream outStream = new FileOutputStream(saveFile); outStream.write(“test".getBytes()); outStream.close(); }

24 课程总结 SharedPreferences 不同应用共享数据 Android文件操作 SDCard文件存取

25


Download ppt "SharedPreferences与文件存储"

Similar presentations


Ads by Google