发觉上篇翻译只注意一些细节,却没有写出数据存储的编程实现,这篇文章通过实例来完整的体现数据存储。
在实践中,发现的主要问题:
读取和写入的字符流和字节流,API文档上的对于FileInputStream的方法write()和read()属于字符流。
assets目录和R,raw目录的区别。
写入时,不可避免的字符编码问题。
package com.study.test02;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import android.app.Activity;
import android.content.Context;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class Activity_00 extends Activity {
private Button btn0, btn1, btn2, btn3, btn4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_activity00);
btn0 = (Button) findViewById(R.id.btn0_activity00);
btn1 = (Button) findViewById(R.id.btn1_activity00);
btn2 = (Button) findViewById(R.id.btn2_activity00);
btn3 = (Button) findViewById(R.id.btn3_activity00);
btn4 = (Button) findViewById(R.id.btn4_activity00);
btn0.setOnClickListener(listener);
btn1.setOnClickListener(listener);
btn2.setOnClickListener(listener);
btn3.setOnClickListener(listener);
btn4.setOnClickListener(listener);
}
private OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn0_activity00:
readAssetsFile();
break;
case R.id.btn1_activity00:
readSystemFile();
break;
case R.id.btn2_activity00:
writeSystemFile();
break;
case R.id.btn3_activity00:
readSDCardFile();
break;
case R.id.btn4_activity00:
writeSDCardFile();
break;
}
}
};
// 目前大多被R.raw代替,用来读取固定不变的数据。
private void readAssetsFile() {
AssetManager asm = this.getAssets();
BufferedReader br = null;
try {
InputStream is = asm.open("wom" + File.separator + "file01.txt");
br = new BufferedReader(new InputStreamReader(is));
StringBuffer sb = new StringBuffer();
String str = null;
while ((str = br.readLine()) != null) {
sb.append(str + "\n");
}
// String str = br.readLine();
// while(str!=null){
// sb.append(str+"\n");
// str = br.readLine();
// }
Toast.makeText(this, "Read from assets:" + sb.toString(), 4000)
.show();
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 读取和写入时字节流和字符流的尝试
*/
// FileInputStream的read()方法返回是得到的字节数量的整型值,不像write一样经常使用。
private void readSystemFile() {
FileInputStream fis = null;
BufferedReader br = null;
try {
fis = this.openFileInput("file03.txt");
try {
br = new BufferedReader(new InputStreamReader(fis, "utf-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
StringBuffer sb = new StringBuffer();
String str = null;
try {
while ((str = br.readLine()) != null) {
sb.append(str + "\n");
}
Toast.makeText(this, "Read from System:" + sb.toString(), 4000)
.show();
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void writeSystemFile() {
FileOutputStream fos = null;
try {
fos = this.openFileOutput("file03.txt", Context.MODE_PRIVATE);
// PrintWriter pw = new PrintWriter(fos);
// pw.println("我的名字是帅哥哥");
// pw.flush();
try {
fos.write("我的名字是帅哥哥,哈哈".getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Toast.makeText(this, "已写完", 4000).show();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void readSDCardFile() {
FileInputStream fis = null;
BufferedReader br = null;
try {
fis = new FileInputStream("/mnt/sdcard/contacts.txt");
try {
br = new BufferedReader(new InputStreamReader(fis, "GBK"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
StringBuffer sb = new StringBuffer();
String str = null;
try {
while ((str = br.readLine()) != null) {
sb.append(str + "\n");
}
Toast.makeText(this, "Read from SDCard:" + sb.toString(), 4000)
.show();
fis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void writeSDCardFile() {
FileOutputStream fos = null;
try {
fos = new FileOutputStream("/mnt/sdcard/contacts.txt");
// PrintWriter pw = new PrintWriter(fos);
// pw.println("我的名字是帅哥哥");
// pw.flush();
try {
fos.write("我的名字是帅哥哥,哈哈".getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Toast.makeText(this, "已写完", 4000).show();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
谢谢~