android读写⽂件简书,Android中的⽂件操作
Android ⽂件操作
概述
Android 中的⽂件操作主要涉及到两个部分,⼀个是内部存储的读写,⼀个是外部存储的读写两者的主要区别如下表:
内部存储
外部存储
始终可⽤
它并⾮始终可⽤,因为⽤户可采⽤ USB 存储的形式装载外部存储,并在某些情况下会从设备中将其删除。
默认情况下只有您的应⽤可以访问此处保存的⽂件。
它是全局可读的,因此此处保存的⽂件可能不受您控制地被读取
当⽤户卸载您的应⽤时,系统会从内部存储中删除您的应⽤的所有⽂件。
当⽤户卸载您的应⽤时,只有在您通过 getExternalFilesDir() 将您的应⽤的⽂件保存在⽬录中时,系统才会从此处删除您的应⽤的⽂件。
当您希望确保⽤户或其他应⽤均⽆法访问您的⽂件时,内部存储是最佳选择
对于⽆需访问限制以及您希望与其他应⽤共享或允许⽤户使⽤电脑访问的⽂件,外部存储是最佳位置。
内部存储
内部⽂件
你可以直接使⽤内部存储,⽽⽆需任何的权限。默认情况下,内部存储的⽂件只属于你的应⽤,任何其他应⽤都⽆法访问。并且内部存储的⽂件在应⽤被卸载的时候会被删除
FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.Bytes());
fos.close();
或者
File file = new File(getFilesDir(), "hello_file2");
if(!ists()){
}
FileOutputStream fos = new FileOutputStream(file);
fos.Bytes());
fos.close();
这⾥⼀般使⽤Context.MODE_PRIVATE就可以了。你还以使⽤MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE. 这样你的⽂件就可以被其他应⽤访问到。但是这两个选项已经被废弃了。并且在未来的android N 中如果使⽤, 会抛出 SecurityException, 如果你真的要与其他应⽤之间
共享⽂件,请使⽤FileProvider.简述android概述
当你需要读取内部存储的⽂件的时候,你可以使⽤:
openFileInput(String fileName)
获取⼀个FileInputStream.. 或者使⽤
File file = new File(getFileFir(), fileName)
如果你想在应⽤编译的时候就带有⼀些⽂件, 你可以选择存放在 assets/ ⽬录, 你可以通过:
InputStream is = getResources().getAssets().open(String fileName);
来读取该⽂件。
或者你也可以将⽂件放在 res/raw/ ⽬录下通过:
InputStream is = getResources().openRawResource(R.raw.raw_file);
来获取该⽂件的InputStream.
内部缓存 Cache
内部存储中与file ⽂件夹同级有⼀个cache ⽂件夹。可以⽤来存储⼀些缓存⽂件, 你可以通过:
File file = new File(getCacheDir(), fileName)
来创建⽂件。
但是缓存⽂件并不能保证持久。 系统内存低的时候,系统会优先删除这些缓存⽂件。如果你写⼊⼀些缓存⽂件, 你需要⾃⼰管理这个cache 的⼤⼩以及⽂件的存活时间。
外部存储
外部存储通常所指为我们的sdcard 存储。但是现在⼤部分出⼚的⼿机都会在内部存储器上划出⼀部分作为外部存储sdcard。当然还是有很多⼿机也⽀持外部 sdcard 扩展的。如果⼿机上插有外部的sdcard. 我们的⼿机Settings⾥⾯⼀般会有⼀个选项可以选择哪⼀个作为当前的主存储。
由于外部存储存在着在PC上挂载的可能性,所以每次使⽤之前需要对外存储的mount state 做检查
/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
String state = ExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
return true;
}
return false;
}
/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
String state = ExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state) ||
Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
return true;
}
return false;
}
保证外部存储是可读写的状态才可以继续操作。
私有⽂件
android 在外部存储上会为每⼀个app 建⽴私有⽂件夹 Android/data/应⽤包名/ 下 当然这⾥的⽂件夹虽然是私有,但是对其他⼈都是可读可写的。如果你想要⽂件只被⾃⼰读写,还是建议存储在内部存储。
私有⽂件夹⾥的内容与内部存储的⽂件⼀样,在应⽤删除之后也会被清除。
对于外部存储的私有⽂件的读写,android4.4及以后并不需要声明特别的权限。但是对于4.4以前需要
申明
WRITE_EXTERNAL_STORAGE 权限.
或者你也可以这样做:
android:maxSdkVersion="18" />
...
想要获取外部存储的私有⽂件夹, 你可以通过:
File file = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), FILENAME);
来获取这个⽂件夹的File 对象。 type可以是
DIRECTORY_PICTURES 之类的, 会返回对应的Pictures ⽂件夹。或者直接传null会直接返回这个⽬录的⽂件夹。
公有⽂件
公有⽂件存储必须要声明WRITE_EXTERNAL_STORAGE 权限.
公有⽂件不属于app 所有。当你的应⽤被删除的时候应该被保留的⽂件,如⽤户的相⽚,铃声等。
想要获取外部存储的公有⽂件夹, 你可以通过:
File file = new ExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), FILENAME);
存储在这⾥⽂件夹下⾯的⽂件,会被系统media scanner 扫⾯到。由media provider 提供给⽤户使⽤。
在读写外部存储公有⽂件的时候,在android 6.0 之后android 权限系统由安装时改成运⾏时检查。所以如果你的应⽤⽬标SDK版本(targetSDKVersion)为23及以上时(这意味着程序可以在Android 6.0及以上的版本中运⾏),将应⽤安装在Android 6.0及以上机型中时,需要动态的申请权限:
//申请权限
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
int hasWriteSdcardPermission = ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE);
if(hasWriteSdcardPermission != PackageManager.PERMISSION_GRANTED){
requestPermissions(new String[]{"android.permission.WRITE_EXTERNAL_STORAGE"} ,
REQUEST_WRITE_EXTNARL_PERMISSION);
return;
}
}
writeSdcard();
获取权限后的回调:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if(requestCode == REQUEST_WRITE_EXTNARL_PERMISSION){
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Permission Granted
writeSdcard();
} else {
// Permission Denied
Toast.makeText(MainActivity.this, "WRITE_CONTACTS Denied", Toast.LENGTH_SHORT)
.show();
}
}else {
}
}
外置sdcard 的 操作:
.
File[] files = ExternalFilesDirs(this,null);
//当⼀个⼿机插⼊sdcard之后。这⾥会返回2个file,file[0] primary external storage ,file[1]为 second external storage,
// file[0] 与 file 相同
if(files.length > 1) {
if (StorageState(files[1]).equals(Environment.MEDIA_MOUNTED)){
try {
String FILENAME = "pic_file.png";
File file = new File(files[1], FILENAME);
当然,在读取之前也需要做StorageState 的检查。
本⽂介绍了android 中⽂件操作的⽅法,以及使⽤过程中的注意的问题。更多的代码你可以查看⽰例:
⽰例Demo
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论