Android中可以在
设备本身的存储设备或者外接的存储设备中创建用于保存数据的文件。同样,在默认状态下,文件是不能在不同的程序之间共享的。用文件来存储数据可以通过 openFileOutput方法打开一个文件(如果这个文件不存在就自动创建这个文件),通过load方法来
获取文件中的数据,通过deleteFile方法可以删除一个指定的文件。
现在我们就用文件的方式实现我们的上一次写的保存音乐状态的
例子。这个例子在这里,可以看一下--》http://byandby.javaeye.com/blog/833292 我们这里就换一种实现方式,但是要达到的目的是一样的。首先,在退出应用程序之前,通过我们自己实现的一个save方法来保存这些数据(音效状态),然后,在应用程序启动时,通过一个load方法来读取这些数据。下边我们就来看看代码吧,图就不上了 大家去上一篇文章看吧。
MIDIPlayer类主要用来
开启和关闭音乐服务
package com.yarin.android.Examples_06_02;
import java.io.IOException;
import android.content.Context;
import android.media.MediaPlayer;
public class MIDIPlayer {
public MediaPlayer playerMusic = null;
private Context mContext = null;
public MIDIPlayer(Context context) {
mContext = context;
}
/* 播放音乐 */
public void PlayMusic() {
/* 装载资源中的音乐 */
playerMusic = MediaPlayer.create(mContext, R.raw.start);
/* 设置是否循环 */
playerMusic.setLooping(true);
try {
playerMusic.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
playerMusic.start();
}
/* 停止并释放音乐 */
public void FreeMusic() {
if (playerMusic != null) {
playerMusic.stop();
playerMusic.release();
}
}
}
Activity01 类
package com.yarin.android.Examples_06_02;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.TextView;
public class Activity01 extends Activity {
private MIDIPlayer mMIDIPlayer = null;
private boolean mbMusic = false;
private TextView mTextView = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mTextView = (TextView) this.findViewById(R.id.TextView01);
mMIDIPlayer = new MIDIPlayer(this);
/* 读取文件数据 */
load();
if (mbMusic) {
mTextView.setText("当前音乐状态:开");
mbMusic = true;
mMIDIPlayer.PlayMusic();
} else {
mTextView.setText("当前音乐状态:关");
}
}
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_UP:
mTextView.setText("当前音乐状态:开");
mbMusic = true;
mMIDIPlayer.PlayMusic();
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
mTextView.setText("当前音乐状态:关");
mbMusic = false;
mMIDIPlayer.FreeMusic();
break;
}
return true;
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
/* 退出应用程序时保存数据 */
save();
if (mbMusic) {
mMIDIPlayer.FreeMusic();
}
this.finish();
return true;
}
return super.onKeyDown(keyCode, event);
}
/* 装载、读取数据 */
void load() {
/* 构建Properties对对象 */
Properties properties = new Properties();
try {
/* 开发文件 */
FileInputStream stream = this.openFileInput("music.cfg");
/* 读取文件内容 */
properties.load(stream);
} catch (FileNotFoundException e) {
return;
} catch (IOException e) {
return;
}
/* 取得数据 */
mbMusic = Boolean.valueOf(properties.get("bmusic").toString());
}
/* 保存数据 */
boolean save() {
Properties properties = new Properties();
/* 将数据打包成Properties */
properties.put("bmusic", String.valueOf(mbMusic));
try {
FileOutputStream stream = this.openFileOutput("music.cfg",
Context.MODE_WORLD_WRITEABLE);
/* 将打包好的数据写入文件中 */
properties.store(stream, "");
} catch (FileNotFoundException e) {
return false;
} catch (IOException e) {
return false;
}
return true;
}
}
注意:如果使用绝对路径来存储文件,那么在其它应用程序中一样不能通过这个绝对路径来访问和操作该文件。
同样,我们知道了通过Preferences 存储的数据保存在 shared_prefs文件夹下,那么如果我们没有指定路径的文件存储方式,数据又保存在什么地方呢?如果我们采用了文件存储数据的方式,系统就会在和 shared_prefs 相同的目录中产生一个名为
files 的文件夹,它下面的文件就是我们通过Files 存储数据的文件。
如果在开发一个应用程序时,需要通过加载一个文件的内容来初始化程序,就可以在编译程序之前,在res/raw/tempFile中建立一个static 文件,这样在程序中通过Resources.openRawResources(R.raw.文件名) 方法同样返回一个InputStream 对象,直接读取文件内容。
源码见附件