天天看点

Android File 文件存储

Activity提供了openFileOutput()方法可以用于把数据输出到文件中,同时提供了openFileInput()方法读取数据,具体实现看代码:

首先是一个自定义的MediaPlayer类:

import java.io.IOException;

import android.content.Context;

import android.media.MediaPlayer;

public class MyPlayer {

 private Context mContext;

 private MediaPlayer mPlayer;

 public MyPlayer(Context context) {

  mContext = context;

 }

 public void playMusic(){

  mPlayer = MediaPlayer.create(mContext, R.raw.start);

  mPlayer.setLooping(false);

  try {

   mPlayer.prepare();

  } catch (IllegalStateException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  } catch (IOException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

  mPlayer.start();

 }

 public void freeMusic(){

  if (mPlayer != null) {

   mPlayer.stop();

   mPlayer.release();

  }

 }

}

实现file存储代码:

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.Properties;

import android.os.Bundle;

import android.annotation.SuppressLint;

import android.app.Activity;

import android.content.Context;

import android.view.KeyEvent;

import android.widget.TextView;

@SuppressLint("WorldWriteableFiles")

public class MainActivity extends Activity {

 private MyPlayer myPlayer;

 private boolean mbMusic;

 private TextView mTextView;

 @Override

 protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.activity_main);

  mTextView = (TextView) findViewById(R.id.text_view_01);

  myPlayer = new MyPlayer(this);

  loader();

  if (mbMusic) {

   myPlayer.playMusic();

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

  } else {

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

  }

 }

 @Override

 public boolean onKeyUp(int keyCode, KeyEvent event) {

  // TODO Auto-generated method stub

  switch (keyCode)

  {

   case KeyEvent.KEYCODE_DPAD_UP:

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

    mbMusic = true;

    myPlayer.playMusic();

    break;

   case KeyEvent.KEYCODE_DPAD_DOWN:

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

    mbMusic = false;

    myPlayer.freeMusic();

    break;

  }

  return true;

 }

 @Override

 public boolean onKeyDown(int keyCode, KeyEvent event) {

  // TODO Auto-generated method stub

  if (keyCode == KeyEvent.KEYCODE_BACK)

  {

   save();

   if ( mbMusic )

   {

    myPlayer.freeMusic();

   }

   this.finish();

   return true;

  }

  return super.onKeyDown(keyCode, event);

 }

 private boolean save() {

  // TODO Auto-generated method stub

  Properties properties = new Properties();

  properties.put("mbMusic", String.valueOf(mbMusic));

  try {

   @SuppressWarnings("deprecation")

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

   properties.store(foStream, null);

  } catch (FileNotFoundException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  } catch (IOException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

  return true;

 }

 private void loader() {

  // TODO Auto-generated method stub

  Properties pro = new Properties();

  try {

   FileInputStream fiStream = openFileInput("music.cfg");

   pro.load(fiStream);

   mbMusic = Boolean.valueOf(pro.getProperty("mbMusic"));

  } catch (FileNotFoundException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  } catch (IOException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

 }

}

介绍一下Android提供的读写模式:

Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。 Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。 MODE_WORLD_READABLE:表示当前文件可以被其他应用读取; MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。 如果希望文件被其他应用读和写,可以传入: openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE); android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data/<package name>/files),其他程序无法访问。除非在创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有这样其他程序才能正确访问。  l

Context.MODE_PRIVATE    =  0 Context.MODE_APPEND    =  32768 Context.MODE_WORLD_READABLE =  1 Context.MODE_WORLD_WRITEABLE =  2