Java提供了一套完整的IO流体系,用来对文件进行操作。Android同样支持以这种方式来访问手机存储器上的文件,包括内部存储器和外部存储器
Android中可以在设备本身的存储设备或者外接的存储设备中创建用于保存数据的文件。默认情况下,文件是不能在不同的程序间共享的。当该应用程序卸载时,这些文件将被删除掉。
二、File 数据内部存储
1、在应用程序的私有文件夹(data/data/包名)下存储文件
因为根据包名的标志创建的文件夹,所以称为该应用程序的私有文件夹。这样的存储有两种方式:
第一种方式 类似于Java平台下的实现方式,直接根据data/data/包名 路径操作IO流来存储数据。
第二种方式,使用Context提供的方法来直接操作
第一种方式和Java平台下的基本一样,不多说,看下第二种方式。
①、在内部存储器中的私有文件夹中创建一个文件写入数据:
1、根据文件名字和操作模式,调用openFileoutput()方法,返回一个FileOutputStream流
2、调用write()方法,向文件写数据
3、调用close()方法关闭流
例子:
<span class="typ">String</span><span class="pln"> FILENAME </span><span class="pun">=</span><span class="pln"> </span><span class="str">"hello_file"</span><span class="pun">;</span><span class="pln"> </span><span class="typ">String</span><span class="pln"> </span><span class="kwd">string</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"hello world!"</span><span class="pun">;</span><span class="pln"> </span><span class="typ">FileOutputStream</span><span class="pln"> fos </span><span class="pun">=</span><span class="pln"> openFileOutput</span><span class="pun">(</span><span class="pln">FILENAME</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Context</span><span class="pun">.</span><span class="pln">MODE_PRIVATE</span><span class="pun">);</span><span class="pln"> fos</span><span class="pun">.</span><span class="pln">write</span><span class="pun">(</span><span class="kwd">string</span><span class="pun">.</span><span class="pln">getBytes</span><span class="pun">());</span><span class="pln"> fos</span><span class="pun">.</span><span class="pln">close</span><span class="pun">();</span>
Context.MODE_PRIVATE = 0 为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND = 32768 模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
Context.MODE_WORLD_READABLE = 1 表示当前文件可以被其他应用读取
Context.MODE_WORLD_WRITEABLE = 2 表示当前文件可以被其他应用写入
②、从内部存储器读取一个文件:
1、调用openFileInput()方法,指定文件的名字,返回一个FileInputStream流
2、调用read()方法读取数据
3、调用close()方法关闭流
例子:
- public class InteralFile_Activity extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- try {
- //创建一个文件,写入数据
- FileOutputStream outputStream=openFileOutput("test.txt", MODE_PRIVATE);
- BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(outputStream));
- writer.write("12123");
- writer.close();
- //读取数据
- FileInputStream inputStream=openFileInput("test.txt");
- BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream));
- String line=reader.readLine();
- Log.i("Test", line);
- reader.close();
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
③、另外一些Context提供的操作方法:
我们通过openFileInput和openFileOutout创建和读取的文件在应用程序中有一个固定的位置:
File Explorer / data /data / 包名 /files /文件名
我们知道在Java IO流中,可以自己去手动创建一个文件,在Android中同样可以。只要我们能确定内部存储器的路径,就可以自己去创建和读取我们自己的文件。
Android提供了几个方法,用来完成我们自己的操作:
1、getFilesDir()
根据这个方法,我们可以得到内部存储器文件系统目录的绝对路径 就是data /data / 包名 /files
当然也可以直接使用绝对路径,比如:
- File file = new File("/data/data/cn.itcast.action/files/itcast.txt");
2、getDir() 在内部存储器中创建(或者打开一个已经存在的)文件夹
3、deleteFile() 删除一个私有文件夹下的文件(即files目录下的文件,该方法指定文件名直接删除)
4、fileList() 返回私有文件夹下面所有文件,以字符串数组的形式返回。
④、保存缓存文件
如果你想缓存一些数据,而不是持久的存储它,你应该使用getCacheDir()来打开一个文件,它代表应用程序保存临时缓存文件的内部目录。
当设备内存不足时,Android系统可能删除这些缓存文件来恢复空间。但是,您不应该依赖于系统来清理这些文件。你应该自己处理这些缓存文件,保持在合理限度的空间消耗,如1 mb。当用户卸载应用程序时,这些文件被删除。
2、读取工程中Resources和Assets中的文件
在Android中,除了对应用程序私有文件夹中的文件进行操作之外,还可以从资源文件和Assets中获得输入流读取数据。这些文件分别存放在应用程序的res/raw目录和assets目录下。这些文件将在编译的时候和其他文件一起打包进APK中。
注意,这两个文件夹下的文件只能进行读操作,不能进行写操作。
①、res/raw下的文件操作:
通过Context的方法获得
- try {
- InputStream inputStream1=getResources().openRawResource(R.raw.test);//获取输入流
- byte[] buffer1=new byte[256];
- inputStream1.read(buffer1);
- Log.i("Test", new String(buffer1).trim());
- inputStream1.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
通过Uri的方式获得
Uri uri=Uri.parse("android.resource://" + getPackageName() + "/"+R.raw.test);
②、assets目录下的文件操作:
- try {
- InputStream inputStream3=getAssets().open("test.txt");
- byte[] buffer2=new byte[256];
- inputStream3.read(buffer2);
- Log.i("Test", new String(buffer2).trim());
- inputStream3.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
还可以通过AssetManager的list方法得到文件的文字,再去打开输入流
- try {
- String[] str=getAssets().list("");
- for(String s:str) //得到文件的名字,可以用来打开输入流
- Log.i("Test", s);
- } catch (IOException e) {
- e.printStackTrace();
- }