文件存储
1.SharedPreference只能保存一些简单的数据,要想存储更多类型的数据,需要使用文件的存储操作。有两种形式:
形式一:直接利用Activity提供的文件操作方法。此类操作的所有文件路径只能是“data\data\<packagename>\files\文件名称”。
形式二:利用Java IO流执行操作。此类操作的文件可以保存在任意路径下,但需要为其操作授权。
利用Activity类操作数据文件
1.文件操作的方法只有两个:一个是进行文件的输出(openFileOutputStream(),返回OutputStream),另一个是进行文件的输入(openFileInputStream(),返回InputStream),这两个方法返回的类型都是Java IO流中的字节操作流对象。
使用openFileInput()和openFileOutput()方法进行写入/读取写入操作时,接收的文件中不能包含任何的分隔符(\),只能写文件名称,而文件名称会默认保存在“data\data\<package name>\files\”目录中。
2.保存文件
publicclass FileOperate extends Activity {
private static final String FILENAME ="mldn.txt" ; // 设置文件名称
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
FileOutputStream output = null ; // 接收文件输出对象
try {//设置输出文件的名称,及文件创建模式
output =super.openFileOutput(FILENAME, Activity.MODE_PRIVATE) ;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
PrintStream out = newPrintStream(output) ; // 输出方便
out.println("姓名:李华;") ;
out.println("年龄:20;") ;
out.println("地址:天方夜谈学院。") ;
out.close() ; // 资源一定要关闭,关闭流
}
}
3.读取文件:
publicclass FileOperate extends Activity {
private static final String FILENAME ="mldn.txt" ; // 设置文件名称
private TextView msg = null ; // 文本组件
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
this.msg = (TextView)super.findViewById(R.id.msg) ;
FileInputStream input = null ;
try {
input = super.openFileInput(FILENAME) ; // 取得输入流
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Scanner scan = new Scanner(input) ;
while(scan.hasNext()) {
this.msg.append(scan.next() +"\n") ;
}
scan.close() ;
}
}
利用IO流操作文件
1.以上程序直接将文件保存在手机的默认存储空间,要想把文件保存在自定义目录及sdcard上,可以使用传统的IO流完成。
2.向sdcard上保存文件
publicclass FileOperate extends Activity {
private static final String FILENAME ="/mnt/sdcard/mldndata/mymldn.txt" ; //设置文件名称
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
File file = new File(FILENAME) ; // 定义要操作的文件
if(!file.getParentFile().exists()) {
file.getParentFile().mkdirs() ; // 创建父文件夹路径
}
PrintStream out = null;//打印流对象,用于输出
try {
out = new PrintStream(newFileOutputStream(file));
out.println("天方夜谭学院(MLDN,www.baidu.cn),作者:李华");
} catch (Exception e) {
e.printStackTrace() ;
} finally { // 一定要关闭流
if(out != null) {
out.close() ;
}
}
}
}
由于用到外部设备(sdcard),所以要为程序配置相应的权限。
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" />
3.判断sdcard是否存在,如果存在则保存;否则提示不存在,无法保存。要实现该功能,要使用android.os.Environment类取得目录的信息。
publicclass FileOperate extends Activity {
private static final String FILENAME ="mymldn.txt" ; // 设置文件名称
private static final String DIR ="mldndata" ; // 操作文件夹的名称
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
//如果sdcard存在则创建文件便于接下来的操作 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File file = new File(Environment.getExternalStorageDirectory()
+ File.separator + DIR +File.separator + FILENAME); // 定义要操作的文件
if (!file.getParentFile().exists()){
file.getParentFile().mkdirs();// 创建父文件夹路径
}
PrintStream out = null;//打印流对象用于输出
try {
out = new PrintStream(newFileOutputStream(file));
out.println("天方夜谭学院(MLDN,www.MLDNJAVA.cn),作者:李华");
} catch (Exception e) {
e.printStackTrace();
} finally { // 一定要关闭流
if (out != null) {
out.close();
}
}
} else {
Toast.makeText(this, "保存失败,SD卡不存在!", Toast.LENGTH_LONG).show() ;
}
}
}
参考文章:Android开发实战经典