Android 文件读取.docx
《Android 文件读取.docx》由会员分享,可在线阅读,更多相关《Android 文件读取.docx(12页珍藏版)》请在冰豆网上搜索。
Android文件读取
Android数据存储
12、访问资源文件
直接将文件保存在设备的内部存储.默认情况下,保存到内部存储的文件私有的,其他应用程序不能访问它们,当用户卸载应用程序时,所保存的文件也一并删除
1.1访问静态应用程序文件-只读
1.1.1从resource中的res/raw文件夹中获取文件
保存静态文件,通过openRawResource()传入资源ID(R.raw.ID),返回InputStream读取文件,该文件不能用于更新操作。
示例:
Stringres="";
try{
InputStreamin=getResources().openRawResource(R.raw.bbi);
//在\Test\res\raw\bbi.txt,
intlength=in.available();
byte[]buffer=newbyte[length];
in.read(buffer);
//res=EncodingUtils.getString(buffer,"UTF-8");
//res=EncodingUtils.getString(buffer,"UNICODE");
res=EncodingUtils.getString(buffer,"BIG5");
//依bbi.txt的编码类型选择合适的编码,如果不调整会乱码
in.close();
}catch(Exceptione){
e.printStackTrace();
}
myTextView.setText(res);//把得到的内容显示在TextView上
1.1.2从asset中获取文件并读取数据(资源文件只能读不能写)
asset目录下,称为原生文件,这类文件在被打包成apk文件时是不会进行压缩的,android使用AssetManager对asset文件进行访问,通过getResources().getAssets()获得AssetManager其内有一个open()方法可以根据用户提供的文件名,返回一个InputStream对象供用户使用。
eg:
StringfileName="yan.txt";//文件名字
Stringres="";
try{
InputStreamin=getResources().getAssets().open(fileName);
//\Test\assets\yan.txt这里有这样的文件存在
intlength=in.available();
byte[]buffer=newbyte[length];
in.read(buffer);
res=EncodingUtils.getString(buffer,"UTF-8");
}catch(Exceptione){
e.printStackTrace();
}
1.2访问设备存储相当于API工作目录
访问目录是
1.2.1调用context.openFileInput()返回FileInputStream读文件
1.2.2通过调用context.openFileOutput()返回FileOutputStream写文件
//写文件在./data/data/com.tt/files/下面
openFileOutput()参数
filename文件名
intmode操作模式MODE_PRIVATE默认,创建或替换该文件名的文件作为应用程序私有文件。
MODE_APPEND,MODE_WORLD_READABLE,MODE_WORLD_WRITEABLE,
eg:
StringFILENAME="hello_file";
Stringstring="helloworld!
";
FileOutputStreamfos=openFileOutput(FILENAME,Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
1.3保存缓存文件
如果您想缓存一些数据,而不是它长期存放,可以把文件保存为缓存文件;保存为缓存文件时,当设备内部存储空间不足,系统可能会删除这些缓存文件恢复空间;我们应该限制缓存空间的大小;当用户卸载应用程序时,这些文件将被删除。
使用方法:
getFilesDir()
获取的保存文件系统的目录的绝对路径;
getDir()
在存储空间中创建或打开一个目录
deleteFile()
删除存储文件
fileList()
返回应用程序保存文件列表
23、使用外部存储
2.11、检测外部存储状态:
Environment.getExternalStorageState()
booleanmExternalStorageAvailable=false;
booleanmExternalStorageWriteable=false;
Stringstate=Environment.getExternalStorageState();
if(Environment.MEDIA_MOUNTED.equals(state)){
//Wecanreadandwritethemedia
mExternalStorageAvailable=mExternalStorageWriteable=true;
}elseif(Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)){
//Wecanonlyreadthemedia
mExternalStorageAvailable=true;
mExternalStorageWriteable=false;
}else{
//Somethingelseiswrong.Itmaybeoneofmanyotherstates,butallweneed
//toknowiswecanneitherreadnorwrite
mExternalStorageAvailable=mExternalStorageWriteable=false;
}
2.22、访问外部存储
API8以上,使用getExternalFilesDir()打开一个外部存储文件目录,这个方法需传递一个指定类型目录的参数,如:
DIRECTORY_MUSIC和DIRECTORY_RINGTONES,为空返回应用程序文件根目录;此方法可以根据指定的目录类型创建目录,该文件为应用程序私有,如果卸载应用程序,目录将会一起删除。
API7一下,使用getExternalStorageDirectory(),打开外部存储文件根目录,你的文件写入到如下目录中:
/Android/data//files/
eg:
voidcreateExternalStoragePrivateFile(){
//Createapathwherewewillplaceourprivatefileonexternal
//storage.
Filefile=newFile(getExternalFilesDir(null),"DemoFile.jpg");
try{
//Verysimplecodetocopyapicturefromtheapplication's
//resourceintotheexternalfile.Notethatthiscodedoes
//noerrorchecking,andassumesthepictureissmall(doesnot
//trytocopyitinchunks).Notethatifexternalstorageis
//notcurrentlymountedthiswillsilentlyfail.
InputStreamis=getResources().openRawResource(R.drawable.balloons);
OutputStreamos=newFileOutputStream(file);
byte[]data=newbyte[is.available()];
is.read(data);
os.write(data);
is.close();
os.close();
}catch(IOExceptione){
//Unabletocreatefile,likelybecauseexternalstorageis
//notcurrentlymounted.
Log.w("ExternalStorage","Errorwriting"+file,e);
}
}
voiddeleteExternalStoragePrivateFile(){
//Getpathforthefileonexternalstorage.Ifexternal
//storageisnotcurrentlymountedthiswillfail.
Filefile=newFile(getExternalFilesDir(null),"DemoFile.jpg");
if(file!
=null){
file.delete();
}
}
booleanhasExternalStoragePrivateFile(){
//Getpathforthefileonexternalstorage.Ifexternal
//storageisnotcurrentlymountedthiswillfail.
Filefile=newFile(getExternalFilesDir(null),"DemoFile.jpg");
if(file!
=null){
returnfile.exists();
}
returnfalse;
}
2.33、保存为共享文件
如果想将文件保存为不为应用程序私有,在应用程序卸载时不被删除,需要将文件保存到外部存储的公共目录上,这些目录在存储设备根目录下;如:
音乐,图片,铃声等。
API8以上,使用getExternalStoragePublicDirectory(),传入一个公共目录的类型参数,如DIRECTORY_MUSIC,DIRECTORY_PICTURES,DIRECTORY_RINGTONES等,目录不存在时这个方法会为你创建目录。
API7一下,使用getExternalStorageDirectory()打开存储文件根目录,保存文件到下面的目录中:
Music,Podcasts,Ringtones,Alarms,Notifications,Pictures,Movies,Download。
eg:
voidcreateExternalStoragePublicPicture(){
//Createapathwherewewillplaceourpictureintheuser'spublicpicturesdirectory.
Filepath=Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
Filefile=newFile(path,"DemoPicture.jpg");
try{
//MakesurethePicturesdirectoryexists.
path.mkdirs();
InputStreamis=getResources().openRawResource(R.drawable.balloons);
OutputStreamos=newFileOutputStream(file);
byte[]data=newbyte[is.available()];
is.read(data);
os.write(data);
is.close();
os.close();
}catch(IOExceptione){
Log.w("ExternalStorage","Errorwriting"+file,e);
}
}
voiddeleteExternalStoragePublicPicture(){
//Createapathwherewewillplaceourpictureintheuser's
//publicpicturesdirectoryanddeletethefile.Ifexternal
//storageisnotcurrentlymountedthiswillfail.
Filepath=Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
Filefile=newFile(path,"DemoPicture.jpg");
file.delete();
}
booleanhasExternalStoragePublicPicture(){
//Createapathwherewewillplaceourpictureintheuser's
//publicpicturesdirectoryandcheckifthefileexists.If
//externalstorageisnotcurrentlymountedthiswillthinkthe
//picturedoesn'texist.
Filepath=Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
Filefile=newFile(path,"DemoPicture.jpg");
returnfile.exists();
}
2.44、保存缓存文件
API8以上,使用getExternalCacheDir()打开存储目录保存文件,如卸载应用程序,缓存文件将自动删除,在应用程序运行期间你可以管理这些缓存文件,如不在使用可以删除以释放空间。
API7一下,使用getExternalStorageDirectory()打开缓存目录,缓存文件保存在下面的目录中:
/Android/data//cache/
你的java包名如"com.example.android.app".
2.55、读写文件
提示:
openFileOutput是在raw里编译过的访问设备存储,FileOutputStream是任何文件都可以
访问sdcard直接实例FileOutputStream对象,而访问存储设备文件通过openFileOutput返回FileOutputStream对象对数据操作。
2.5.1sdcard中去读文件
示例:
StringfileName="/sdcard/Y.txt";
//也可以用StringfileName="mnt/sdcard/Y.txt";
Stringres="";
try{
FileInputStreamfin=newFileInputStream(fileName);
//FileInputStreamfin=openFileInput(fileName);
//用这个就不行了,必须用FileInputStream
intlength=fin.available();
byte[]buffer=newbyte[length];
fin.read(buffer);
res=EncodingUtils.getString(buffer,"UTF-8");
fin.close();
}catch(Exceptione){
e.printStackTrace();
}
myTextView.setText(res);
2.5.2SDCard中写文件
般写在\data\data\com.test\files\里面,打开DDMS查看fileexplorer是可以看到仿真器文件存放目录的结构的
StringfileName="TEST.txt";
Stringmessage="FFFFFFF11111FFFFF";
writeFileData(fileName,message);
publicvoidwriteFileData(StringfileName,Stringmessage){
try{
FileOutputStreamfout=openFileOutput(fileName,MODE_PRIVATE);
byte[]bytes=message.getBytes();
fout.write(bytes);
fout.close();
}
catch(Exceptione){
e.printStackTrace();
}
}
2.5.3写,读sdcard目录上的文件,要用FileOutputStream,不能用openFileOutput
//写在/mnt/sdcard/目录下面的文件
publicvoidwriteFileSdcard(StringfileName,Stringmessage){
try{
//FileOutputStreamfout=openFileOutput(fileName,MODE_PRIVATE);
FileOutputStreamfout=newFileOutputStream(fileName);
byte[]bytes=message.getBytes();
fout.write(bytes);
fout.close();
}
catch(Exceptione){
e.printStackTrace();
}
}
//读在/mnt/sdcard/目录下面的文件
publicStringreadFileSdcard(StringfileName){
Stringres="";
try{
FileInputStreamfin=newFileInputStream(fileName);
intlength=fin.available();
byte[]buffer=newbyte[length];
fin.read(buffer);
res=EncodingUtils.getString(buffer,"UTF-8");
fin.close();
}
catch(Exceptione){
e.printStackTrace();
}
returnres;
}
34、android读写文件正确实行方法
Android读写文件正确实行方法介绍
众所周知Android有一套自己的安全模型,具体可参见Android开发文档。
当应用程序(.apk)在安装时就会分配一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。
默认情况下,任何应用创建的文件,数据库,sharedpreferences都应该是私有的(位于/data/data/your_project/files/),其余程序无法访问。
除非在创建时指明是MODE_WORLD_READABLE或者MODE_WORLD_WRITEABLE,只要这样其余程序才能正确访问。
因为有这种Android读写文件的方法在安全上有所保障,进程打开文件时Android要求检查进程的userid。
所以不能直接用java的api来打开,因为java的io函数没有提这个机制。
无法用java的api直接打开程序私有的数据,默认路径为/data/data/your_project/files/
1.FileReaderfile=newFileReader("Android.txt");这里特别强调私有数据!
言外之意是如果某个文件或者数据不是程序私有的,既访问它时无须经过Android的权限检查,那么还是可以用java的ioapi来直接访问的。
所谓的非私有数据是只放在sdcard上的文件或者数据,
可以用java的ioapi来直接打开sdcard上文件。
1.FileReaderfile=newFileReader("/sdcard/Android.txt");如果要打开程序自己私有的文件和数据,那必须使用Activit