全面掌握SharePreferences和android里的IO
一、SharePreferences是什么?
1、当程序中有少量的数据保存,而且这些数据的格式简单:都是一些字符串、标量类型的值等。比如应用程序的各种配置信息,应用程序的使用次数。这个时候就可以用SharePreferences对象保存,SharePreferences的数据总保存在/data/data/<package name>/shared_prefs目录下,SharePreferences数据总是以XML格式保存。
2、SharePreferences数据文件是一个跟元素为<map>,每一个子元素是一个key-value,value是字符串类型时,使用<string name="time" value="sfdas"/>,如果是int就<int name="count" value="23"/>
二、SharePreferences开发步骤
①通过Sharepreferences preferences = getSharedPreferences(String name,int mode);创建SharePreferences实例(name是文件名,mode是权限模式)
②获取编辑对象SharePreferences.Editor editor = preferences.edit();
③写入数据,editor.putString("time",sdf.format(new Date()));
editor.putInt("random",12);
editor.commit();
④读数据 String time = preferences.getString("time",null);//防止文件不存在或属性不存在,也会返回默认值
//防止文件不存在或属性不存在,也会返回默认值
⑤删除 editor.remove("time");
editor.remove("random");
editor.commit();
⑥全部删除 editor.clear();
editor.commit();
三、SharePreferences 写入时的权限。
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
public class PermissionActivity extends Activity {
private final int[] MODES=new int[]{
Activity.MODE_PRIVATE,//默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中,可以使用Activity.MODE_APPEND
Activity.MODE_WORLD_READABLE,//表示当前文件可以被其他应用读取,
Activity.MODE_WORLD_WRITEABLE,//表示当前文件可以被其他应用写入;
//如果希望文件被其他应用读和写,可以传入:Activity.MODE_WORLD_READABLE+Activity.MODE_WORLD_WRITEABLE
Activity.MODE_APPEND//该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
for(int i=0;i<MODES.length;i++){
SharedPreferences mySharedPreferences=getSharedPreferences("data_"+String.valueOf(i+1),MODES[i]);
SharedPreferences.Editor editor=mySharedPreferences.edit();
editor.putString("name",String.valueOf(i+1));
editor.commit();
}
}
}
四、File存储
java提供了一套完整的FileInputStream ,FileOutputStream,通过这些IO方便访问磁盘中的内容
Android同样支持
Context 提供了如下两个方法打开本应用程序的文件。
1、FileInputStream openFileIput(String name);
FileOutputStream openFileOutput(String name, int mode)
mode 同样对应四种
Activity.MODE_PRIVATE,//默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中,可以使用Activity.MODE_APPEND
Activity.MODE_WORLD_READABLE,//表示当前文件可以被其他应用读取,
Activity.MODE_WORLD_WRITEABLE,//表示当前文件可以被其他应用写入;
//如果希望文件被其他应用读和写,可以传入:Activity.MODE_WORLD_READABLE+Activity.MODE_WORLD_WRITEABLE
Activity.MODE_APPEND//该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件
getDir(String name,int mode) 获取或创建文件夹
File getFilesDir();获取该应用程序的数据文件夹下的全部文件
String[]fileList(); 返回该应用程序的数据文件夹下的全部文件
deleteFile(String name);删除指定文件
五、读写SD卡
当程序通过Context的openFileInput 或openFileOutput来打开文件输入流,输出流,程序所打开的是应用程序的数据文件夹里的问价,这样所储存得数据少
读写步骤
①调用Environment 的getExternalStorageState()方法判断手机上是否插SD卡
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED),返回true,就是有
②调用Environment的getExternalStorageDirectory()方法来获取外部设备,也就是sd卡
③读写
package org.crazyit.io;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
/**
*
* @author qiyue
*
*/
public class SDCardTest extends Activity
{
final String FILE_NAME = "/crazyit.bin";
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 获取两个按钮
Button read = (Button) findViewById(R.id.read);
Button write = (Button) findViewById(R.id.write);
// 获取两个文本框
final EditText edit1 = (EditText) findViewById(R.id.edit1);
final EditText edit2 = (EditText) findViewById(R.id.edit2);
// 为write按钮绑定事件监听器
write.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View source)
{
// 将edit1中的内容写入文件中
write(edit1.getText().toString());
edit1.setText("");
}
});
read.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
// 读取指定文件中的内容,并显示出来
edit2.setText(read());
}
});
}
private String read()
{
try
{
// 如果手机插入了SD卡,而且应用程序具有访问SD的权限
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED))
{
// 获取SD卡对应的存储目录
File sdCardDir = Environment.getExternalStorageDirectory();
// 获取指定文件对应的输入流
FileInputStream fis = new FileInputStream(
sdCardDir.getCanonicalPath() + FILE_NAME);
// 将指定输入流包装成BufferedReader
BufferedReader br = new BufferedReader(new
InputStreamReader(fis));
StringBuilder sb = new StringBuilder("");
String line = null;
// 循环读取文件内容
while ((line = br.readLine()) != null)
{
sb.append(line);
}
// 关闭资源
br.close();
return sb.toString();
}
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
private void write(String content)
{
try
{
// 如果手机插入了SD卡,而且应用程序具有访问SD的权限
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED))
{
// 获取SD卡的目录
File sdCardDir = Environment.getExternalStorageDirectory();
File targetFile = new File(sdCardDir
.getCanonicalPath() + FILE_NAME);
// 以指定文件创建 RandomAccessFile对象
RandomAccessFile raf = new RandomAccessFile(
targetFile, "rw");
// 将文件记录指针移动到最后
raf.seek(targetFile.length());
// 输出文件内容
raf.write(content.getBytes());
// 关闭RandomAccessFile
raf.close();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
上面程序用RandomAccessFile向SD卡中追加写入内容。他是基于游标去读写的,可以将游标每次移到最后皆可以了
通过以上只是我们就可以开发一个简单的文件管理器了