Android基础(二) 文件的读写及数据存储
一、文件的读写
public class MainActivity extends Activity {
private EditText titleET;
private EditText contentET;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
titleET = (EditText) findViewById(R.id.titleET);
contentET = (EditText) findViewById(R.id.contentET);
}
public void save(View view){
try {
String title = titleET.getText().toString();
String content = contentET.getText().toString();
FileService service = new FileService(this);
switch (view.getId()) {
case R.id.save2SDCardBT:
service.save2SD(title, content);
break;
case R.id.save2Rom:
service.save2Rom(title, content);
break;
default:
break;
}
Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
Toast.makeText(this, "SD卡异常,请重新加载SD卡", Toast.LENGTH_SHORT).show();
}
Toast.makeText(this, "保存失败", Toast.LENGTH_SHORT).show();
}
}
}public class FileService {
private Context context;
public FileService(Context context){
this.context=context;
}
public void save2SD(String name,String content) throws Exception{
//获取SD卡路径
File sdc = Environment.getExternalStorageDirectory();
//在SD卡中创建一个路径
File file = new File(sdc, name);
//创建一个输出流,关联SD卡文件(如果存在就清空,不存在则创建)
OutputStream out = new FileOutputStream(file);
//用输出流写出数据,平台默认码表为UTF-8
out.write(content.getBytes());
//关闭输出流
out.close();
//输出总空间和可用空间
System.out.println("totalSapce:"+file.getTotalSpace());
System.out.println("availabeSpace:"+file.getFreeSpace());
}
public void save2Rom(String name,String content) throws Exception{
OutputStream out = context.openFileOutput(name, Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE);
out.write(content.getBytes());
out.close();
}
}布局文件(XML):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/titleTV" />
<EditText
android:id="@+id/titleET"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/title_hint"
android:inputType="text" />
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/contentTV" />
<EditText
android:id="@+id/contentET"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/content_hint"
android:inputType="textMultiLine"
android:lines="3" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/save2SDCardBT"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="save"
android:text="@string/save2SD_text" />
<Button
android:id="@+id/save2Rom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="save"
android:text="@string/save2Rom_text" />
</LinearLayout>
</LinearLayout>1.写文件到SD卡:
使用IO流写出数据时,需要注意文件的路径。
由于不同版本Android系统SD卡的路径可能不同,建议使用Environment.getExternalStorageDirectory()方法来获取文件的路径。
如果需要判断SD卡的状态,可以使用Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
注意:将文件写入SD卡需要在清单列表中配置权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2.写文件到手机机身内存
使用Context类的openFileOutput()方法可以在当前应用所在文件夹打开一个输出流,关联指定的文件。openFileOutput()方法可以指定文件模式MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE,MODE_APPEND。
注意:使用openFileOutput()方法写入到机身内存的文件,会随着应用的卸载而删除。而存放在SD卡的文件则可以长久保存。
二、XML的Pull解析
public class Person {
private Integer id;
private String name;
private Integer age;
public Person() {
super();
}
public Person(Integer id, String name, Integer age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
}
}public class PersonService {
/**
* 通过一个关联了XML文件的输出流,解析出一个List集合,其中包含若干Person对象
* @param in 关联XML文件的输入流
* @return 返回一个包含Person对象的List集合,如果输入流关联的XML文件中不包含Person数据,则得到一个size=0的集合
* @throws Exception
*/
public List<Person> getPersons(InputStream in) throws Exception {
List<Person> persons = new ArrayList<Person>();
Person p = null;
XmlPullParser parser = Xml.newPullParser();//得到解析器对象
parser.setInput(in,"UTF-8");//设置输入流
for (int type = parser.getEventType(); type != XmlPullParser.END_DOCUMENT; type = parser
.next()) {//解析XML创建Person对象,装入集合
if (type == XmlPullParser.START_TAG) {//如果是开始标签事件
if ("person".equals(parser.getName())) {//开始的是person
p = new Person();
String id = parser.getAttributeValue(0);//获取属性
p.setId(Integer.parseInt(id));
persons.add(p);
} else if ("name".equals(parser.getName())) {
String name = parser.nextText();//获取文本
p.setName(name);
} else if ("age".equals(parser.getName())) {
String age = parser.nextText();
p.setAge(Integer.parseInt(age));
}
}
}
return persons;//返回集合
}
/**
* 向指定的输出流写出XML数据,XML数据为指定集合中的Person信息
* @param out 指定的输出流
* @param persons 要写出的集合
* @throws Exception
*/
public void writePersons(OutputStream out,List<Person> persons) throws Exception{
XmlSerializer serializer = Xml.newSerializer();//获取序列化工具
serializer.setOutput(out,"UTF-8");//设置输出流
serializer.startDocument("UTF-8", true);//开始文档
serializer.startTag(null, "persons");//开始标签
for (Person person : persons) {
serializer.startTag(null, "person");
serializer.attribute(null, "id", person.getId().toString());//设置属性
serializer.startTag(null, "name");
serializer.text(person.getName());//设置文本
serializer.endTag(null, "name");
serializer.startTag(null, "age");
serializer.text(person.getAge().toString());
serializer.endTag(null, "age");
serializer.endTag(null, "person");
}
serializer.endTag(null, "persons");//结束标签
serializer.endDocument();//结束文档
}
}public class PersonServiceTest extends AndroidTestCase {
public void testGetPersons() throws Exception{
PersonService service = new PersonService();
InputStream in = PersonServiceTest.class.getClassLoader().getResourceAsStream("persons.xml");
List<Person> persons = service.getPersons(in);
in.close();
for (Person person : persons) {
System.out.println(person);
}
OutputStream out = new FileOutputStream("/mnt/sdcard/persons.xml");
persons.add(new Person(4, "xxx", 24));
persons.add(new Person(4, "Lucas", 24));
service.writePersons(out, persons);
}
}
三、SharedPreferences
public class MainActivity extends Activity {
private EditText nameET;
private EditText phoneET;
private EditText emailET;
private SharedPreferences sp;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获取3个EditText
nameET = (EditText) findViewById(R.id.nameET);
phoneET = (EditText) findViewById(R.id.phoneET);
emailET = (EditText) findViewById(R.id.emailET);
sp = this.getSharedPreferences("config",MODE_PRIVATE);
//获取以前存储的数据,把数据放到EditText中
nameET.setText(sp.getString("name", ""));
phoneET.setText(sp.getString("phone", ""));
emailET.setText(sp.getString("email", ""));
}
public void save(View view){
String name=nameET.getText().toString();
String phone=phoneET.getText().toString();
String email=emailET.getText().toString();
//用SharedPreferences存储数据
Editor editor=sp.edit();
editor.putString("name", name);
editor.putString("phone", phone);
editor.putString("email", email);
editor.commit();
//弹出提示
Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();
}
}布局文件(XML):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/nameTV" />
<EditText
android:id="@+id/nameET"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textPersonName"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/phoneTV" />
<EditText
android:id="@+id/phoneET"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="phone"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/emalTV" />
<EditText
android:id="@+id/emailET"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:inputType="textEmailAddress"
/>
<Button
android:id="@+id/saveBT"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/save2Default"
android:onClick="save"
/>
</LinearLayout>1.什么是SharedPreferences
它是一个Map集合,可以持久化存储数据,通常用来保存程序中的一些键值对数据。
2.怎么使用SharedPreferences
Context类可以调用getSharedPreferences()方法来得到SharedPreferences的对象。获取数据的时候则直接调用getString(),getInt()等方法。
在设置数据的时候,需要先调用SharedPreferences.edit()方法得到一个Editor对象,然后使用putString(),putInt()等方法,最后使用Editor.commit()方法进行提交。


浙公网安备 33010602011771号