Android 数据存储这File

这篇博客介绍了Android中使用File进行数据存储的方法,通过Context.openFileOutput()和openFileInput()进行文件操作。文章强调了文件路径的限制,并展示了如何在不同apk之间共享文件,通过设置MODE_WORLD_READABLE权限或使用chmod命令。同时,文中给出了一个读写配置文件的例子,以及如何播放MIDI音乐的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

二、数据存储之File

 

在Android中通常使用File存储方式是用Context.openFileOutput(String fileName, int mode)和Context.openFileInput(String fileName)。

 

    Context.openFileOutput(String fileName, int mode)生成的文件自动存储在/data/data/Package Name/files目录下,其全路径是/data/data/Package Name/files/fileName 。注意下,这里的参数fileName不可以包含路径分割符(如"/")。

 

    通常来说,这种方式生成的文件只能在这个apk内访问。但这个结论是指使用Context.openFileInput(String fileName)的方式。使用这种方式,每个apk只可以访问自己的/data/data/Package Name/files目录下的文件,原因很简单,参数fileName中不可以包含路径分割符,Android会自动在/data/data/Package Name/files目录下寻找文件名为fileName的文件。

 

    但是如果你直接使用这个File,那么这个File在其它apk中也是可以访问的,不过要注意在之前调用Context.openFileOutput(String file, int mode)时不要使用缺省的mode:MODE_PRIVATE ,而应该使用MODE_WORLD_READABLE 。使用缺省mode生成的文件的权限是“660”(也就是rw-rw----),而使用后者生成文件的权限是允许运行别的apk访问的。代码如下:

     File file = new File("/data/data/Package Name/files/fileName");

 

    另外还有一个方法可以改变这个生成文件的权限。可以直接在Java代码中执行Linux命令,毕竟Android归根到底也是Linux .代码如下:

    Process process = Runtime.getProcess().exec("chmod 666 /data/data/Package Name/files/fileName");
   process.waitFor();

 

下面是一个小例子:

 

public class ActivityMain1 extends Activity {

private TextView textview1=null;

private MIDIPlayer midiPlayer=null;

private boolean music=false;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

//初始化组件

textview1=(TextView)this.findViewById(R.id.texview1);

midiPlayer = new MIDIPlayer(this);

// //装载配置,获得SharePreferences对象

// SharedPreferences settings=this.getPreferences(MODE_PRIVATE);

// music=settings.getBoolean("music", false);

load();

if(music){

textview1.setText("当前音乐状态:开");

music=true;

midiPlayer.PlayerMusic(); //开始播放音乐

}else{

textview1.setText("当前音乐状态:关");

music=false;

midiPlayer.StopMusic(); //停止播放音乐

}

}

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

switch(keyCode){

case KeyEvent.KEYCODE_DPAD_DOWN:

textview1.setText("当前音乐状态:关");

music=false;

midiPlayer.StopMusic();

break;

case KeyEvent.KEYCODE_DPAD_UP:

textview1.setText("当前音乐状态:开");

music=true;

midiPlayer.PlayerMusic();

break;

}

return true;

}

@Override

public boolean onKeyUp(int keyCode, KeyEvent event) {

switch(keyCode){

case KeyEvent.KEYCODE_BACK:

SharedPreferences puts=this.getPreferences(0);

SharedPreferences.Editor eidit=puts.edit();

eidit.putBoolean("music", music);

eidit.commit();

save();

if(music){

midiPlayer.StopMusic();

}

this.finish();

return true;

}

return super.onKeyUp(keyCode, event);

}

 

//装载读取数据

public void load(){

//构建Properties对象

Properties properties = new Properties();

/*

* 打开文件,catch里面必须加上return;因为在第一次运行的时候,在创建的文件里什么没有,会抛出异常,

* 这时程序就会出错,所以把e.printStackTrace去掉,或加上return;程序就可以正常运行了。

*/

try {

FileInputStream stream=this.openFileInput("music.cfg");

//加载数据文件

properties.load(stream);

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

return;

//e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

return;

//e.printStackTrace();

}

//取得数据

music=Boolean.valueOf(properties.get("music").toString());

}

//保存数据

boolean save (){

Properties preoperties=new Properties();

//将数据打包成properties

preoperties.put("music", String.valueOf(music));

try {

FileOutputStream stream=this.openFileOutput("music.cfg", Context.MODE_WORLD_WRITEABLE);

preoperties.store(stream, "");

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

return false;

} catch (IOException e) {

// TODO Auto-generated catch block

return false;

}

return true;

}

}

 

 

 

这是MIDIPlayer.java文件

 

 

public class MIDIPlayer {

 

private MediaPlayer meidiaPlayer;

private Context context;

public MIDIPlayer(Context c){

this.context=c;

}

//开始播放音乐

public void PlayerMusic(){

//创建MediaPlayer播放器

meidiaPlayer=MediaPlayer.create(context, R.raw.start);

//是否循环

meidiaPlayer.setLooping(true);

//准备

try {

meidiaPlayer.prepare();

} catch (IllegalStateException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

//开始

meidiaPlayer.start();

}

public void StopMusic(){

if(meidiaPlayer!=null){

meidiaPlayer.stop(); //停止播放

meidiaPlayer.release(); //释放meidiaPlayer

}

}

}

 

 

 

main.xml

 

 

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"

    >

<TextView  

android:id="@+id/texview1"

    android:layout_width="fill_parent" 

    android:layout_height="wrap_content" 

 

    />

</LinearLayout>

 

 

在res文件下,新建一个raw文件夹,如图,

 

 

 

完成以上步骤后,运行就可以了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值