Android进阶(七)数据存储_"file file = new file(getexternalfilesdir(null),

29 阅读6分钟

如果您想缓存一些数据,而不是它长期存放,可以把文件保存为缓存文件;保存为缓存文件时,当设备内部存储空间不足,系统可能会删除这些缓存文件恢复空间;我们应该限制缓存空间的大小;

当用户卸载应用程序时,这些文件将被删除。

 

使用方法:
//获取保存文件系统的目录绝对路径
getFilesDir(); 
//在存储空间中创建或打开一个目录
getDir();
//删除存储文件
deleteFile();
//返回应用程序保存文件列表
fileList();
2使用外部存储
2.1.1检测外部存储状态:
Environment.getExternalStorageState()
boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
// We can read and write the media
mExternalStorageAvailable = mExternalStorageWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
// We can only read the media
mExternalStorageAvailable = true;
mExternalStorageWriteable = false;
} else {
// Something else is wrong. It may be one of many other states, but all we need
//  to know is we can neither read nor write
mExternalStorageAvailable = mExternalStorageWriteable = false;
}
2.1.2访问外部存储

 

API8以上,使用getExternalFilesDir()打开一个外部存储文件目录,这个方法需传递一个指定类型目录的参数,如:DIRECTORY_MUSIC和DIRECTORY_RINGTONES,为空返回应用程序文件根目录;

此方法可以根据指定的目录类型创建目录,该文件为应用程序私有,如果卸载应用程序,目录将会一起删除。

 

API7一下,使用getExternalStorageDirectory(), 打开外部存储文件根目录 ,你的文件写入到如下目录中:/Android/data/<package_name>/files/
eg:
void createExternalStoragePrivateFile() {
// Create a path where we will place our private file on external storage.
File file = new File(getExternalFilesDir(null), "DemoFile.jpg");
try {
// Very simple code to copy a picture from the application's
// resource into the external file.  Note that this code does
// no error checking, and assumes the picture is small (does not
// try to copy it in chunks).  Note that if external storage is
// not currently mounted this will silently fail.
InputStream is = getResources().openRawResource(R.drawable.balloons);
OutputStream os = new FileOutputStream(file);
byte[] data = new byte[is.available()];
is.read(data);
os.write(data);
is.close();
os.close();
} catch (IOException e) {
// Unable to create file, likely because external storage is not currently mounted.
Log.w("ExternalStorage", "Error writing " + file, e);
}
}
void deleteExternalStoragePrivateFile() {
// Get path for the file on external storage. If external
// storage is not currently mounted this will fail.
File file = new File(getExternalFilesDir(null), "DemoFile.jpg");
if (file != null) {
file.delete();
}
}
boolean hasExternalStoragePrivateFile() {
// Get path for the file on external storage.  If external
// storage is not currently mounted this will fail.
File file = new File(getExternalFilesDir(null), "DemoFile.jpg");
if (file != null) {
return file.exists();
}
return false;
}
2.1.3保存为共享文件
如果想将文件保存为不为应用程序私有,在应用程序卸载时不被删除,需要将文件保存到外部存储的公共目录上,这些目录在存储设备根目录下;如:音乐,图片,铃声等。
API8以上,使用 getExternalStoragePublicDirectory(),传入一个公共目录的类型参数,如DIRECTORY_MUSIC, DIRECTORY_PICTURES, DIRECTORY_RINGTONES等, 目录不存在时这个方法会为你创建目录。
API7一下,使用 getExternalStorageDirectory() 打开存储文件根目录,保存文件到下面的目录中:
Music,Podcasts,Ringtones,Alarms,Notifications,Pictures,Movies,Download。
eg:
void createExternalStoragePublicPicture() {
// Create a path where we will place our picture in the user's public pictures directory. 
File path = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
File file = new File(path, "DemoPicture.jpg");
try {
// Make sure the Pictures directory exists.
path.mkdirs();
InputStream is = getResources().openRawResource(R.drawable.balloons);
OutputStream os = new FileOutputStream(file);
byte[] data = new byte[is.available()];
is.read(data);
os.write(data);
is.close();
os.close();
} catch (IOException e) {
Log.w("ExternalStorage", "Error writing " + file, e);
}
}
void deleteExternalStoragePublicPicture() {
// Create a path where we will place our picture in the user's
// public pictures directory and delete the file.  If external
// storage is not currently mounted this will fail.
File path = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
File file = new File(path, "DemoPicture.jpg");
file.delete();
}
boolean hasExternalStoragePublicPicture() {
// Create a path where we will place our picture in the user's
// public pictures directory and check if the file exists.  If
// external storage is not currently mounted this will think the
// picture doesn't exist.
File path = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
File file = new File(path, "DemoPicture.jpg");
return file.exists();
}
2.1.4保存缓存文件
API8以上,使用getExternalCacheDir() 打开存储目录保存文件,如卸载应用程序,缓存文件将自动删除,在应用程序运行期间你可以管理这些缓存文件,如不在使用可以删除以释放空间。
API7以下,使用getExternalStorageDirectory() 打开缓存目录,缓存文件保存在下面的目录中:
/Android/data/<package_name>/cache/
<package_name> 你的java包名如 "com.example.android.app".
2.1.5读写文件
提示:openFileOutput是在raw里编译过的访问设备存储,FileOutputStream是任何文件都可以
访问sdcard直接实例FileOutputStream对象,而访问存储设备文件通过openFileOutput返回FileOutputStream对象对数据操作。
2.1.6 sdcard中去读文件
示例:
String fileName = "/sdcard/Y.txt";
//也可以用String fileName = "mnt/sdcard/Y.txt";
String res="";     
try{ 
FileInputStream fin = new FileInputStream(fileName);
//FileInputStream fin = openFileInput(fileName);  
//用这个就不行了,必须用FileInputStream
int length = fin.available(); 
byte [] buffer = new byte[length]; 
fin.read(buffer);     
res = EncodingUtils.getString(buffer, "UTF-8"); 
fin.close();     
}catch(Exception e){ 
e.printStackTrace(); 

myTextView.setText(res);
2.1.7 SDCard中写文件 
般写在\data\data\com.test\files\里面,打开DDMS查看file explorer是可以看到仿真器文件存放目录的结构的
String fileName = "TEST.txt";
String message = "FFFFFFF11111FFFFF" ;
writeFileData(fileName, message);
public voidwriteFileData(String fileName,String message){ 
try{ 
FileOutputStream fout =openFileOutput(fileName, MODE_PRIVATE);
byte [] bytes = message.getBytes(); 
fout.write(bytes); 
fout.close(); 

catch(Exception e){ 
e.printStackTrace(); 

}    
2.1.8 写,读sdcard目录上的文件,要用FileOutputStream, 不能用openFileOutput
//写在/mnt/sdcard/目录下面的文件
public voidwriteFileSdcard(String fileName,String message){ 
try{ 
//FileOutputStream fout = openFileOutput(fileName, MODE_PRIVATE);
FileOutputStream fout = new FileOutputStream(fileName);
byte [] bytes = message.getBytes(); 
fout.write(bytes); 
fout.close(); 

catch(Exception e){ 
e.printStackTrace(); 

}
//读在/mnt/sdcard/目录下面的文件
public String readFileSdcard(String fileName){
String res=""; 
try{ 
FileInputStream fin = new FileInputStream(fileName); 
int length = fin.available(); 
byte [] buffer = new byte[length]; 
fin.read(buffer);     
res = EncodingUtils.getString(buffer, "UTF-8"); 
fin.close();     

catch(Exception e){ 
e.printStackTrace(); 

return res; 
}
3android读写文件正确实行方法
Android读写文件正确实行方法介绍
www.ehuait.com/skill/andro…

 

众所周知Android有一套自己的安全模型, 具体可参见Android开发文档。当应用程序(.apk)在安装时就会分配一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。

默认情况下,任何应用创建的文件,数据库,sharedpreferences都应该是私有的(位于/data/data/your_project/files/),其余程序无法访问。

除非在创建时指明是MODE_WORLD_READABLE 或者 MODE_WORLD_WRITEABLE,只要这样其余程序才能正确访问。

 

因为有这种Android读写文件的方法在安全上有所保障,进程打开文件时Android要求检查进程的user id。所以不能直接用java的api来打开,因为java的io函数没有提这个机制 。
无法用java的api直接打开程序私有的数据 ,默认路径为/data/data/your_project/files/

 

1.FileReader file = new FileReader("Android.txt"); 这里特别强调私有数据!言外之意是如果某个文件或者数据不是程序私有的,即访问它时无须经过Android的权限检查,那么还是可以用java的io api来直接访问的。

所谓的非私有数据是只放在sdcard上的文件或者数据,可以用java的io api来直接打开sdcard上文件。

1.FileReader file = new FileReader("/sdcard/Android.txt"); 如果要打开程序自己私有的文件和数据,那必须使用Activity提供openFileOutput和openFileInput方法。
创建程序私有的文件,由于权限方面的要求,必须使用activity提供的Android读写文件方法
1.FileOutputStream os = this.openFileOutput("Android.txt", MODE_PRIVATE);
2.OutputStreamWriter outWriter = new OutputStreamWriter (os);
读取程序私有的文件,由于权限方面的要求,必须使用activity提供的方法
1.FileInputStream os =this.openFileInput("Android.txt");
2.InputStreamReader inReader = new InputStreamReader(os); 
4Shared Preferences用户首选项
主要用于存放软件的配置参数等信息。sharedPreferences用于存取和修改软件配置参数数据的接口。存放键值对,保存用户个人首选项信息,比如喜爱音乐,主题,首选Activity等
4.1.1使用getSharedPrefernces()
使用步骤:
存放:
1.获得SharedPreferences 的实例对象,通过getSharedPreferences()传递文件名和模式;
2.获得Editor 的实例对象,通过SharedPreferences 的实例对象的edit()方法;
3.存入数据,利用Editor 对象的putXXX()方法;
4.提交修改的数据,利用Editor 对象的commit()方法。
读取:
1.获得SharedPreferences 的实例对象,通过getSharedPreferences()传递文件名和模式;

最后

给大家分享一些关于HTML的面试题。

开源分享:docs.qq.com/doc/DSmRnRG…