在了解文件存储之前首先要了解一下内存,内部存储,外部存储的概念,以及清楚缓存与清除数据 清楚的是什么,详细请看 https://blog.csdn.net/u010937230/article/details/73303034 。
1 . 内存:我们在英文中称作memory,内存是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,所以说它是用于计算机运行时的,它不是用来存储数据的。
2 . 内部存储,外部存储:内部存储我们称为InternalStorage,外部我们称为ExternalStorage。一般情况,由于内部存储空间少,我们都把数据存储在外部存储中。主要分为两种情况:
一是Android4.4之前,内置存储就是内部存储,外置SD卡就是外置存储。
二是Android4.4之后,手机机身存储空间变大,这时外部存储就包含两部分了,机身存储的外部存储和外置SD卡。
3 . 清除缓存:应用程序在运行过程中需要经过很多过程,比如读入程序,计算,输入输出等等,这些过程中肯定会产生很多的数据,它们在内存中,以供程序运行时调用。所以清除缓存清除的是APP运行过程中所产生的临时数据。
4 . 清除数据:清除数据才是真正的删除了我们保存在文件中的数据(永久性数据,如果不人为删除的话会一直保存在文件中)例如当我们在设置里面清除了某个应用的数据,那么/data/user/0/packname/和/storage/emulated/0/Android/data/packname/下的文件里面的数据会全部删除,包括cache,files,lib,shared_prefs等等。
5 . 打印对比:
–> Environment.getDataDirectory() = (/data)获取内部存储的根路径
–> getFilesDir().getAbsolutePath() = (/data/user/0/packname/files )获取某个应用在内部存储中的files路径
–> getCacheDir().getAbsolutePath() =(/data/user/0/packname/cache )获取某个应用在内部存储中的cache路径
–> getDir(“myFile”, MODE_PRIVATE).getAbsolutePath() =( /data/user/0/packname/app_myFile )获取某个应用在内部存储中的自定义路径
–> Environment.getExternalStorageDirectory().getAbsolutePath() = (/storage/emulated/0 )获取外部存储的根路径
–> Environment.getExternalStoragePublicDirectory(“”).getAbsolutePath() = (/storage/emulated/0 )获取外部存储的根路径
–> getExternalFilesDir(“”).getAbsolutePath() = (/storage/emulated/0/Android/data/packname/files)获取某个应用在外部存储中的files路径 ,4.4以前的系统中返回为null
–> getExternalCacheDir().getAbsolutePath() = (/storage/emulated/0/Android/data/packname/cache)获取某个应用在外部存储中的cache路径 ,4.4以前的系统中返回为null
–> Environment.getDownloadCacheDirectory() = (/cache)每个版本的android系统都一样
–> Environment.getRootDirectory() = (/system)每个版本的android系统都一样
6 . 优点:文件可用来存放大量数据,如文本、图片、音频等
一 . 内部存储 读取数据:
描述:content提供了openFileInput(String name),openFileOutput(String name , int mode)两个方法可以直接打开文件IO流,其中name为文件名,mode为打开模式,分为以下几种:
–> MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容。
–> MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
–> MODE_WORLD_READABLE:表示当前文件可以被其他应用读取。
–> MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
–> MODE_WORLD_READABLE + MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用读取和写入。
默认路径:data/data/主包名/files
写入:
private void writeInside(String name, String content){
try {
FileOutputStream outStream=this.openFileOutput(name, Context.MODE_PRIVATE);
outStream.write(content.getBytes());
outStream.close();
} catch (FileNotFoundException e) {
return;
} catch (IOException e){
return ;
}
}
读取:
private String readInside(String name){
try {
FileInputStream inStream=this.openFileInput(name);//name=hello.txt
ByteArrayOutputStream stream=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int length=-1;
while((length=inStream.read(buffer))!=-1) {
stream.write(buffer,0,length);
}
stream.close();
inStream.close();
return new stream.toString();
} catch (FileNotFoundException e) {
return null;
} catch (IOException e){
return null;
}
}
二 . 外部存储 读取数据:
在AndroidManifest.XML中添加权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
判断是否存在:
private boolean judgeOutsude() {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
return true
} else {
return false;
}
}
写入:
private void writeOutside(String name, String content){
try {
File sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录
File saveFile = new File(sdCardDir, name);
FileOutputStream outStream = null;
outStream = new FileOutputStream(saveFile);
outStream.write(content.getBytes());
outStream.close();
} catch (FileNotFoundException e) {
return;
} catch (IOException e) {
return;
}
}
读取:
private String readOutside(String name){
try {
// 创建文件
File file = new File(Environment.getExternalStorageDirectory(), name);
if (file.exists()){
// 创建FileInputStream对象
FileInputStream fis = new FileInputStream(file);
// 创建字节数组 每次缓冲1M
byte[] b = new byte[1024];
int len = 0;// 一次读取1024字节大小,没有数据后返回-1.
// 创建ByteArrayOutputStream对象
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 一次读取1024个字节,然后往字符输出流中写读取的字节数
while ((len = fis.read(b)) != -1) {
baos.write(b, 0, len);
}
// 将读取的字节总数生成字节数组
byte[] data = baos.toByteArray();
// 关闭字节输出流
baos.close();
// 关闭文件输入流
fis.close();
// 返回字符串对象
return new String(data);
}else {
return null;
}
} catch (Exception e) {
return null;
}
}
三 . Assets资源文件:该文件是编译时存放的资源文件,只能读取,不能修改或删除。
(1) 读取图片
private void readAssetsImage(){
try {
//图片
InputStream inputStream = this.getAssets().open("wait.png");
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
inputStream.close();
inputStream = null;
save_file_iv_assets.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
}
(2) 读取文字
private void clickAssets(){
try {
//图片
InputStream inputStream = this.getAssets().open("wait.png");
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
inputStream.close();
inputStream = null;
save_file_iv_assets.setImageBitmap(bitmap);
//txt文件
inputStream = this.getAssets().open("hello.txt");
int size = inputStream.available();
byte[] buffer = new byte[size];
inputStream.read(buffer);
inputStream.close();
String text = new String(buffer, "utf-8");
save_file_txt_content.setText(text);
//
} catch (IOException e) {
e.printStackTrace();
}
}
刚开始写文章,有什么毛病请大家提出来,便于我及时改正,谢谢。