1、Android 文件读取Android 数据存储1 2、访问资源文件直接将文件保存在设备的内部存储. 默认情况下,保存到内部存储的文件私有的,其他应用程序不能访问它们,当用户卸载应用程序时,所保存的文件也一并删除 1.1 访问静态应用程序文件-只读1.1.1 从resource中的res/raw文件夹中获取文件保存静态文件, 通过openRawResource()传入资源ID( R.raw. ID),返回InputStream读取文件,该文件不能用于更新操作。示例:String res = ; try InputStream in = getResources().openRawResourc
2、e(R.raw.bbi); /在Testresrawbbi.txt, int length = in.available(); byte buffer = new bytelength; in.read(buffer); /res = EncodingUtils.getString(buffer, UTF-8); /res = EncodingUtils.getString(buffer, UNICODE); res = EncodingUtils.getString(buffer, BIG5); /依bbi.txt的编码类型选择合适的编码,如果不调整会乱码 in.close(); catch
3、(Exception e) e.printStackTrace(); myTextView.setText(res);/把得到的内容显示在TextView上1.1.2 从asset中获取文件并读取数据(资源文件只能读不能写)asset目录下,称为原生文件,这类文件在被打包成apk文件时是不会进行压缩的, android使用AssetManager对asset文件进行访问,通过getResources().getAssets()获得AssetManager其内有一个open()方法可以根据用户提供的文件名,返回一个InputStream对象供用户使用。eg:String fileName = y
4、an.txt; /文件名字String res=; try InputStream in = getResources().getAssets().open(fileName); / Testassetsyan.txt这里有这样的文件存在 int length = in.available(); byte buffer = new bytelength; in.read(buffer); res = EncodingUtils.getString(buffer, UTF-8); catch(Exception e) e.printStackTrace(); 1.2 访问设备存储相当于API工作
5、目录访问目录是1.2.1 调用context.openFileInput() 返回 FileInputStream读文件1.2.2 通过调用context.openFileOutput() 返回FileOutputStream写文件/写文件在./data/data/com.tt/files/下面openFileOutput()参数filename 文件名int mode 操作模式 MODE_PRIVATE 默认,创建或替换该文件名的文件作为应用程序私有文件。 MODE_APPEND,MODE_WORLD_READABLE , MODE_WORLD_WRITEABLE,eg:String FIL
6、ENAME = hello_file;String string = hello world!;FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);fos.write(string.getBytes();fos.close(); 1.3 保存缓存文件如果您想缓存一些数据,而不是它长期存放,可以把文件保存为缓存文件;保存为缓存文件时,当设备内部存储空间不足,系统可能会删除这些缓存文件恢复空间;我们应该限制缓存空间的大小;当用户卸载应用程序时,这些文件将被删除。使用方法:getFilesDir() 获取的保存文
7、件系统的目录的绝对路径;getDir()在存储空间中创建或打开一个目录deleteFile()删除存储文件fileList()返回应用程序保存文件列表 2 3、使用外部存储2.1 1、检测外部存储状态:Environment.getExternalStorageState()boolean mExternalStorageAvailable = false;boolean mExternalStorageWriteable = false;String state = Environment.getExternalStorageState();if (Environment.MEDIA_MOU
8、NTED.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 wro
9、ng. 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.2 2、访问外部存储API8以上,使用getExternalFilesDir()打开一个外部存储文件目录,这个方法需传递一个指定类型目录的参数,如:DIRECTORY_MUSIC和DIRECTORY_RINGTONES,为空返回应用程序文件根目录;此方法可以根据指定的目录类
10、型创建目录,该文件为应用程序私有,如果卸载应用程序,目录将会一起删除。API7一下,使用getExternalStorageDirectory(), 打开外部存储文件根目录 ,你的文件写入到如下目录中:/Android/data/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
11、); try / Very simple code to copy a picture from the applications / 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.
12、 InputStream is = getResources().openRawResource(R.drawable.balloons); OutputStream os = new FileOutputStream(file); byte data = new byteis.available(); is.read(data); os.write(data); is.close(); os.close(); catch (IOException e) / Unable to create file, likely because external storage is / not curr
13、ently 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.de
14、lete(); 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.3 3、保存为共享文件如果想将文件保存为不为应用程序
15、私有,在应用程序卸载时不被删除,需要将文件保存到外部存储的公共目录上,这些目录在存储设备根目录下;如:音乐,图片,铃声等。API8以上,使用 getExternalStoragePublicDirectory(),传入一个公共目录的类型参数,如DIRECTORY_MUSIC, DIRECTORY_PICTURES, DIRECTORY_RINGTONES等, 目录不存在时这个方法会为你创建目录。API7一下,使用 getExternalStorageDirectory() 打开存储文件根目录,保存文件到下面的目录中:Music,Podcasts,Ringtones,Alarms,Notific
16、ations,Pictures,Movies,Download。eg:void createExternalStoragePublicPicture() / Create a path where we will place our picture in the users public pictures directory. File path = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES); File file = new File(path, DemoPicture.jpg)
17、; try / Make sure the Pictures directory exists. path.mkdirs(); InputStream is = getResources().openRawResource(R.drawable.balloons); OutputStream os = new FileOutputStream(file); byte data = new byteis.available(); is.read(data); os.write(data); is.close(); os.close(); catch (IOException e) Log.w(E
18、xternalStorage, Error writing + file, e); void deleteExternalStoragePublicPicture() / Create a path where we will place our picture in the users / public pictures directory and delete the file. If external / storage is not currently mounted this will fail. File path = Environment.getExternalStorageP
19、ublicDirectory( 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 users / public pictures directory and check if the file exists. If / external storage is not cu
20、rrently mounted this will think the / picture doesnt exist. File path = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES); File file = new File(path, DemoPicture.jpg); return file.exists();2.4 4、保存缓存文件API8以上,使用getExternalCacheDir() 打开存储目录保存文件,如卸载应用程序,缓存文件将自动删除,在应用程序运行期间你
21、可以管理这些缓存文件,如不在使用可以删除以释放空间。API7一下,使用getExternalStorageDirectory() 打开缓存目录,缓存文件保存在下面的目录中:/Android/data/cache/ 你的java包名如 com.example.android.app.2.5 5、读写文件提示:openFileOutput是在raw里编译过的访问设备存储,FileOutputStream是任何文件都可以访问sdcard直接实例FileOutputStream对象,而访问存储设备文件通过openFileOutput返回FileOutputStream对象对数据操作。 2.5.1 sd
22、card中去读文件示例: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 bytelength; fin.read(bu
23、ffer); res = EncodingUtils.getString(buffer, UTF-8); fin.close(); catch(Exception e) e.printStackTrace(); myTextView.setText(res);2.5.2 SDCard中写文件 般写在datadatacom.testfiles里面,打开DDMS查看file explorer是可以看到仿真器文件存放目录的结构的 String fileName = TEST.txt; String message = FFFFFFF11111FFFFF ;writeFileData(fileName
24、, 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.5.3 写, 读sdcard目录上的文件,要用FileOutputStream, 不能用openFileOutp
25、ut/写在/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.prin
26、tStackTrace(); /读在/mnt/sdcard/目录下面的文件 public String readFileSdcard(String fileName) String res=; try FileInputStream fin = new FileInputStream(fileName); int length = fin.available(); byte buffer = new bytelength; fin.read(buffer); res = EncodingUtils.getString(buffer, UTF-8); fin.close(); catch(Exc
27、eption e) e.printStackTrace(); return res; 3 4、android读写文件正确实行方法Android读写文件正确实行方法介绍众所周知Android有一套自己的安全模型, 具体可参见Android开发文档。当应用程序(.apk)在安装时就会分配一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下 ,任何应用创建的文件,数据库, sharedpreferences都应该是私有的(位于/data/data/your_project/files/),其余程序无法访问。除非在创建时指明是MODE_WORLD_READABL
28、E 或者 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); 如果要打开程序自己私有的文件和数据,那必须使用Activit
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1