当前位置:天才代写 > tutorial > 安卓教程 > android基础—->数据保存到文件

android基础—->数据保存到文件

2021-02-20 16:23 星期六 所属: 安卓教程 浏览:603

  Android应用与别的服务平台相近的根据硬盘的系统文件(disk-based file systems)。这篇blog将叙述怎样在Android系统文件上应用File的读写能力APIs对Andorid的file system开展读写能力。File 目标特别适合于流式的次序数据信息的读写能力,如图片文件或者互联网中互换的数据信息等。

 

文件目录导航栏

  1. 文档的储存部位Internal 和External 
  2. 文档储存到Internal Storage
  3. 文档储存到External Storage
  4. 文档的常见部位小结
  5. 友链

 

文档的储存部位

Internal storage: 

  • 一直能用的
  • 这儿的文档默认设置只有被大家的app所浏览。
  • 当客户卸载掉app的情况下,系统软件会把internal内该app有关的文档都消除整洁。
  • Internal是我们在想保证不被客户与别的app所浏览的最好储存地区。

External storage:

  • 并不一直能用的,由于客户有时候会根据USB储存方式初始化外界储存器,当取出初始化的这些后,就没法对其开展浏览了。
  • 是大家都能够浏览的,因而储存在这儿的文档很有可能被别的程序流程浏览。
  • 当客户卸载掉大家的app时,系统软件只是会删掉external网站根目录(getExternalFilesDir())下的有关文档。
  • External是在不用严苛的访问限制而且期待这种文档可以被别的app所共享资源或是是容许客户根据电脑上浏览时的最好储存地区。

APP安裝的部位:

  • app是默认设置被安裝到internal storage的,大家還是能够根据在程序流程的manifest文档中申明android:installLocation特性来特定软件安装到external storage。
  • 当某一程序流程的安装包非常大且客户的external storage室内空间超过internal storage时,客户会趋向于将该软件安装到external storage。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="preferExternal"
    package="com.example.linux.filesavetest">

 

储存到Internal Storage

一、 当储存文档到internal storage时,能够根据实行下边2个方式之一来获得适合的文件目录做为 FILE 的目标:

  • getFilesDir() :  回到一个File,意味着了大家app的internal文件目录。
  • getCacheDir() : 回到一个File,意味着了大家app的internal缓存文件文件目录。系统软件的內部储存空间不足时,会自主挑选删掉缓存。

二、 好啦,如今大家根据一个案例来掌握下文档在Internal Storage中的储存与载入:

  • 在Internal中载入內容到文档,创建文件: File file = new File(context.getFilesDir(), filename);
// 在Internal中储存文档
public void saveInternal(View view) {
    String fileContent = "最不舒服的想念,并不是另一方不清楚你的思念,只是他知道却不在乎。有的人,不管你怎么对他好,他也不容易注意,由于他的生命里,你看起来是多么的的无足轻重.";
    FileOutputStream outputStream;

    try {
        outputStream = openFileOutput(filename, Context.MODE_PRIVATE);
        outputStream.write(fileContent.getBytes("utf-8"));
        outputStream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
  • 所述的openFileOutput方式,实际上也是在app的Internal文件目录下创建文件:在其中有那样的编码:
File f = makeFilename(getFilesDir(), name);
  • 在Internal中读取文件中的內容:
// 在Internal中读取文件
public void getInternal(View view) {
    byte[] buffer = new byte[1024];
    FileInputStream fileInputStream;

    try {
        fileInputStream = openFileInput(filename);
        fileInputStream.read(buffer);  fileInputStream.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    textView.setText(new String(buffer));
}
  • 假如必须缓存文件一些文档,能够应用createTempFile(),下列方式建立了一个以user开始的后边再加上一些随机数字的tmp文件
// 建立缓存
public void createTempFile(View view) {
    File file = null;
    try {
        file = File.createTempFile("users", null, this.getCacheDir());
    } catch (IOException e) {
        e.printStackTrace();
    }
    Log.i(TAG, "temp file: "   file != null ? file.getAbsolutePath() : "no such file.");
}
  • 日志結果:   /data/data/com.example.linux.filesavetest/cache/users1907557754.tmp

三、 文档的几类方式:

  • MODE_APPEND:方式会查验文档是不是存有,存有就往文档增加內容,不然就建立新文档。
  • MODE_PRIVATE:为默认设置实际操作方式,意味着该文件是独享数据信息,只有被运用自身浏览,在该方式下,载入的內容会遮盖源文件的內容
  • MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用于操纵别的运用是不是有管理权限读写能力该文件。
  • MODE_WORLD_READABLE:表明当今文档能够被别的运用载入;MODE_WORLD_WRITEABLE:表明当今文档能够被别的运用载入。

 

四、 假如期待文档被别的运用读和写,能够设定mode: MODE_WORLD_READABLE MODE_WORLD_WRITEABLE

在技术上讲,假如文档被设定为可读的,那麼别的app就可以载入该internal文档。殊不知,别的app必须了解包名与文件夹名称。若沒有设定为可读或是可写,别的app是没有办法读写能力的。因而大家只需应用了MODE_PRIVATE ,那麼这种文档就不太可能被别的app所浏览。

 

储存到External Storage

一、 由于external storage可能是不能用的,例如碰到SD卡被拔出来等状况时。因而在浏览以前解决其易用性开展查验。我们可以根据实行 getExternalStorageState()来查看external storage的情况。若回到情况为MEDIA_MOUNTED, 则能够读写能力。

public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

二、 虽然external storage针对客户与别的app是可改动的,大家很有可能会储存下边二种种类的文档。

  • Public files :这种文档对与客户与别的app而言是public的,当客户卸载掉大家的app时,这种文档应当保存。比如,这些被大家的app拍攝的照片或是免费下载的文档。
  • Private files: 这种文档彻底被大家的app所独享,他们应当在app被卸载掉时删掉。虽然因为储存在external storage,这些文档在技术上来讲能够被客户与别的app所浏览,但事实上这些文档针对别的app沒有一切实际意义。因而,当客户卸载掉大家的app时,系 统会删掉其下的private文件目录。比如,这些被大家的app下载的缓存。

三、 一些其他的表明

  • getExternalFilesDir() 方式会建立的文件目录会在app被卸载掉时被系统软件删掉。如果我们的文档想在app被删掉时依然保存,请应用getExternalStoragePublicDirectory().
  • 查看剩下室内空间:能够根据实行getFreeSpace() or getTotalSpace() 来分辨是不是有充足的室内空间来储存文档,进而防止产生IOException
  • 删除文件夹: 实行文档的delete()方式;文档是储存在internal storage:myContext.deleteFile(fileName);
  • 一般 而言,大家应当手动式删掉全部根据 getCacheDir() 方法建立的缓存,及其这些不容易再采用的文档。

四、 当客户卸载掉大家的app时,android系统软件会删掉下列文档

  • 全部储存到internal storage的文档。
  • 全部应用getExternalFilesDir()方法储存在external storage的文档。

 

文档的常见部位小结

一、 内嵌独享文件目录:

  • /data/data/[packagename]/files:文档缓存文件文件目录,一般存小的文档缓存文件,如果是照片,不建议放这儿,一般放进外接卡。File file = getFilesDir(); 

  • /data/data/[packagename]/cache:文件目录,储放一些别的缓存文件 File cache = getCacheDir();

  • /data/data/[packagename]/databases,储放数据库查询

  • /data/data/[packagename]/shared_prefs 运用的SharedPreferences储存
  • /data/data/[packagename]/lib,运用的so文件目录

二、 外接SDCARD文件目录

  • 外接缓存文件文件目录(File sdcache = getExternalCacheDir();) /storage/emulated/0/Android/data/[packagename]/cache 一些必要性不太高的cache或是大文件放进这儿,例如照片缓存文件
  • 外接文档缓存文件文件目录(File sdfile = getExternalFilesDir(null);)/storage/emulated/0/Android/data/[packagename]/files。 一些必要性不太高的file cache或是大文件放进这儿 

三、 android中常见的途径:

String dataDirectory = Environment. getDataDirectory().getAbsolutePath();
String externalStorageDirectory = Environment.getExternalStorageDirectory().getAbsolutePath();
String filePath = getFilesDir().getAbsolutePath();
String packageResourcePath = getPackageResourcePath();
String cachePath = getCacheDir().getAbsolutePath();
String databasePath = getDatabasePath("BookStore.db").getAbsolutePath();

結果:
/data
/storage/emulated/0
/data/data/com.example.linux.componentattributetest/files
/data/app/com.example.linux.componentattributetest-1.apk
/data/data/com.example.linux.componentattributetest/cache
/data/data/com.example.linux.componentattributetest/databases/BookStore.db

 

友链

 

    关键字:

天才代写-代写联系方式