Android File存储:文件读写

会挽雕弓如满月,西北望,射天狼。这篇文章主要讲述Android File存储:文件读写相关的知识,希望能为你提供帮助。
【Android File存储:文件读写】brave-sailor    https://www.cnblogs.com/Free-Thinker/p/11937531.html
_奇点    https://www.cnblogs.com/qi-dian/p/6132694.html
  一、android 应用常用存储路径
1.1、常用路径

  • /data/data/包名/
  • /sdcard/Android/data/包名/
  • /sdcard/xxx
    前两个是应用内部存储, 会随着app的卸载而自动删除, sdcard中其他的文件夹不会自动删除, 除非用户手动删除, 否则会一直存在, 换句话说就是垃圾.
    Google官方建议把数据存储在 /sdcard/Android/data/包名/ 下.
1.2、路径获取方法
前两个应用内部存储通过 Context 来获取, 第三个作为外部存储是通过 Environment 类来获取. 注释为返回值.
1 a、/data/data/包名/ 2 context.getFilesDir(); // /data/data/包名/files 3 context.getCacheDir(); // /data/data/包名/cache 4 b、/sdcard/Android/data/包名/ 5 context.getExternalFilesDir(); // /sdcard/Android/data/包名/files 6 context.getExternalCacheDir(); // /sdcard/Android/data/包名/cache 7 c、/sdcard/xxx 8 Environment.getExternalStorageDirectory(); //内置sdcard

  注意, 根据源码文档中说明, 获取外部存储时, 有可能会因为各种问题导致获取失败, 建议先使用 getExternalStorageState 来判断外部存储状态, 如果已挂载的话再存储.
二、Android应用私有存储文件的写入与读取
使用文件I/O 方法可以直接往手机中存储数据,默认情况下这些文件不可以被其他的应用程序访问。Android平台支持 java平台下的 文件I/O操作, 主要使用FileInputStream 和 FileOutputStream 这两个类来实现文件的存储与读取。获取这两个类对象的方式有两种。
2.1、第一种方式就是像Java平台下的实现方式一样通过构造器直接创建,如果需要向打开的文件末尾写入数据,可以通过使用构造器FileOutputStream(File file, boolean append)将 append设置为true来实现。不过需要注意的是采用这种方式获得FileOutputStream 对象时如果文件不存在或不可写入时,会抛出 FileNotFoundException 异常。
2.2、第二种获取 FileInputStream 和 FileOutputStream 对象的方式是调用 Context.openFileInput 和 Context.openFileOutput两个方法来创建。除了这两个方法外,Context对象还提供了其他几个用于对文件操作的方法,如下所示
在使用openFileOutput方法打开文件以写入数据时,需要指定打开模式。默认为零,即MODE_PRIVATE。
2.3、允许读写权限:
openFileOutput(“gatsby.txt”, Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);

2.4、mode
      模式
  含义
      MODE_PRIVATE
默认模式,文件只可以被调用
    MODE_ APPEND
如果文件已存在就向该文件的末尾继续写入数据。而不是覆盖原来的数据
      MODE_WORLD_ READABLE
赋予所有的应用程序对该文件读的权限
    MODE_WORLD_WRITEABLE
赋予所有的应用程序对该文件写的权限
 
三、WriteFile.apk
3.1、功能:实现新建文件、文件存储读写
3.2、activiry_main.xml
1 < ?xml version="1.0" encoding="utf-8"?> 2 < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3android:layout_width="match_parent" 4android:layout_height="match_parent" 5android:orientation="vertical"> 6 7< EditText 8android:id="@+id/FileName" 9android:layout_width="match_parent" 10android:layout_height="wrap_content" 11android:hint="输入文件名" 12android:padding="10dp" /> 13 14< EditText 15android:id="@+id/FileContent" 16android:layout_width="match_parent" 17android:layout_height="wrap_content" 18android:hint="输入文件内容" 19android:padding="10dp" /> 20 21< LinearLayout 22android:layout_width="match_parent" 23android:layout_height="wrap_content" 24android:orientation="horizontal"> 25 26< Button 27android:id="@+id/save" 28android:layout_width="0dp" 29android:layout_height="wrap_content" 30android:layout_weight="1" 31android:onClick="save" 32android:text="路径一保存" /> 33 34< Button 35android:id="@+id/read" 36android:layout_width="0dp" 37android:layout_height="wrap_content" 38android:layout_weight="1" 39android:onClick="read" 40android:text="路径一读取" /> 41< /LinearLayout> 42 43< TextView 44android:id="@+id/tv1" 45android:layout_width="match_parent" 46android:layout_height="wrap_content" 47android:padding="10dp" 48android:text="文件内容" /> 49 50 51 < /LinearLayout>

  3.3、MainActivity.java
1 package com.gatsby.writefile; 2 3 import android.os.Bundle; 4 import android.os.Environment; 5 import android.util.Log; 6 import android.view.View; 7 import android.widget.EditText; 8 import android.widget.TextView; 9 import android.widget.Toast; 10 11 import androidx.appcompat.app.AppCompatActivity; 12 13 import java.io.ByteArrayOutputStream; 14 import java.io.File; 15 import java.io.FileInputStream; 16 import java.io.FileNotFoundException; 17 import java.io.FileOutputStream; 18 import java.io.IOException; 19 20 public class MainActivity extends AppCompatActivity { 21 22private EditText mFilename; 23private EditText mFileContent; 24private TextView tv; 25 26@Override 27protected void onCreate(Bundle savedInstanceState) { 28super.onCreate(savedInstanceState); 29setContentView(R.layout.activity_main); 30 31mFilename = findViewById(R.id.FileName); 32mFileContent = findViewById(R.id.FileContent); 33tv = findViewById(R.id.tv1); 34} 35 36public void save(View view) { 37// 如果手机插入了SD卡,而且应用程序具有访问SD的权限 38if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { //sd卡处于挂载状态 39String fileName = mFilename.getText().toString(); 40//获取要写入的文件目录storage/sdcard/Android/data/包名/files/xxx 41File externalFilesDir = this.getExternalFilesDir(null); 42String externalFilesDirPath = externalFilesDir.getPath(); 43Log.d("gatsby", "externalFilesDirPath-> " + externalFilesDirPath); 44// externalFilesDirPath-> /mnt/internal_sd/Android/data/com.gatsby.writefile/files 45//创建指定目录下的文件 46File file = new File(externalFilesDir, fileName); 47//开始写文件 48FileOutputStream fos = null; 49try { 50fos = new FileOutputStream(file); 51//获取要写出的文件内容 52String content = mFileContent.getText().toString(); 53fos.write(content.getBytes("UTF-8")); 54Toast.makeText(this, "文件保存成功", Toast.LENGTH_LONG).show(); 55} catch (IOException e) { 56e.printStackTrace(); 57} finally { 58if (fos != null) { 59try { 60fos.close(); 61} catch (IOException e) { 62e.printStackTrace(); 63} 64} 65} 66} else { 67Toast.makeText(this, "找不到指定的SD卡", Toast.LENGTH_SHORT).show(); 68} 69} 70 71public void read(View view) { 72if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 73Log.d("gatsby", "read view!"); 74String fileName = mFilename.getText().toString(); 75File externalFilesDir = this.getExternalFilesDir(null); 76File file = new File(externalFilesDir, fileName); 77if (file.exists()) { 78Log.d("gatsby", "file.exists!!!"); 79FileInputStream fis; 80try { 81fis = new FileInputStream(file); 82//从输入流中读取内容 83String content = readStringFromInputStream(fis); 84Log.d("gatsby", "content-> " + content); 85tv.setText("" + content); 86mFileContent.setText("" + content); 87} catch (FileNotFoundException e) { 88e.printStackTrace(); 89} 90} else { 91Toast.makeText(this, "该文件不存在", Toast.LENGTH_SHORT).show(); 92} 93} 94} 95 96private String readStringFromInputStream(FileInputStream fis) { 97ByteArrayOutputStream baos = new ByteArrayOutputStream(); 98byte[] buffer = new byte[1024]; 99int len; 100try { 101while ((len = fis.read(buffer)) != -1) { 102baos.write(buffer, 0, len); 103} 104} catch (IOException e) { 105e.printStackTrace(); 106} 107return baos.toString(); 108} 109 110 }

  四、  PreferctWriteFile.apk
4.1、存储文件内容可以被其他程序读取
1 package com.gatsby.preferctwritefile; 2 3 import android.content.Context; 4 import android.os.Bundle; 5 import android.os.Environment; 6 import android.widget.Toast; 7 8 import androidx.appcompat.app.AppCompatActivity; 9 10 import java.io.FileOutputStream; 11 import java.io.IOException; 12 13 public class WriteActivity extends AppCompatActivity { 14 15@Override 16protected void onCreate(Bundle savedInstanceState) { 17super.onCreate(savedInstanceState); 18setContentView(R.layout.activity_main); 19 20write(); 21} 22 23public void write() { 24// 如果手机插入了SD卡,而且应用程序具有访问SD的权限 25if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { //sd卡处于挂载状态 26String fileName = "Ed.txt"; 27FileOutputStream fos = null; 28try { 29fos = openFileOutput(fileName, Context.MODE_WORLD_READABLE); 30//获取要写出的文件内容 31String content = "Ed Sheeran,shape of you"; 32fos.write(content.getBytes("UTF-8")); 33Toast.makeText(this, "文件保存成功", Toast.LENGTH_LONG).show(); 34} catch (IOException e) { 35e.printStackTrace(); 36} finally { 37if (fos != null) { 38try { 39fos.close(); 40} catch (IOException e) { 41e.printStackTrace(); 42} 43} 44} 45} else { 46Toast.makeText(this, "找不到指定的SD卡", Toast.LENGTH_SHORT).show(); 47} 48} 49 50 }

  五、RedFile.apk
1 package com.gatsby.readpath; 2 3 import android.os.Bundle; 4 import android.os.Environment; 5 import android.util.Log; 6 import android.widget.Toast; 7 8 import androidx.appcompat.app.AppCompatActivity; 9 10 import java.io.ByteArrayOutputStream; 11 import java.io.File; 12 import java.io.FileInputStream; 13 import java.io.FileNotFoundException; 14 import java.io.IOException; 15 16 public class RedActivity extends AppCompatActivity { 17 18@Override 19protected void onCreate(Bundle savedInstanceState) { 20super.onCreate(savedInstanceState); 21setContentView(R.layout.activity_main); 22red(); 23} 24 25public void red() { 26if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 27File file = new File("/data/data/com.gatsby.preferctwritefile/files/Ed.txt"); 28if (file.exists()) { 29Log.d("gatsby", "file.exists!!!"); 30FileInputStream fis; 31try { 32fis = new FileInputStream(file); 33//从输入流中读取内容 34String content = readStringFromInputStream(fis); 35Log.d("gatsby", "content-> " + content); 36} catch (FileNotFoundException e) { 37e.printStackTrace(); 38} 39} else { 40Toast.makeText(this, "该文件不存在", Toast.LENGTH_SHORT).show(); 41} 42} 43} 44 45private String readStringFromInputStream(FileInputStream fis) { 46ByteArrayOutputStream baos = new ByteArrayOutputStream(); 47byte[] buffer = new byte[1024]; 48int len; 49try { 50while ((len = fis.read(buffer)) != -1) { 51baos.write(buffer, 0, len); 52} 53} catch (IOException e) { 54e.printStackTrace(); 55} 56return baos.toString(); 57} 58 59 }

 
 
 
 

    推荐阅读