`
龙哥IT
  • 浏览: 254116 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

android往文件中保存和读取数据

 
阅读更多

为私有数据使用设备的内部存储器

有了数据存储 API,您可以使用内部存储器存储数据。信息可以是私有的,您可以有选择地让其他应用程序对之具有读或写的访问权限。本节介绍这个存储私有数据的 API,它使用 android.content.Context.openFileInputopenFileOutput 和 getCacheDir() 来高速缓存数据,而不是永久地存储。

清单 20 中的代码片段展示了如何从内部私有存储器读取数据。使得存储器为私有的方法是对 openFileOutput() 使用MODE_PRIVATE


清单 20. 从本地私有存储器读取数据

 

    
/**
 * Writes content to internal storage making the content private to 
 * the application. The method can be easily changed to take the MODE 
 * as argument and let the caller dictate the visibility: 
 * MODE_PRIVATE, MODE_WORLD_WRITEABLE, MODE_WORLD_READABLE, etc.
 * 
 * @param filename - the name of the file to create
 * @param content - the content to write
 */
public void writeInternalStoragePrivate(
        String filename, byte[] content) {
    try {
        //MODE_PRIVATE creates/replaces a file and makes 
        //  it private to your application. Other modes:
        //    MODE_WORLD_WRITEABLE
        //    MODE_WORLD_READABLE
        //    MODE_APPEND
        FileOutputStream fos = 
           openFileOutput(filename, Context.MODE_PRIVATE);
        fos.write(content);
        fos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}


 

清单 21 中的代码片段展示了如何从内部私有存储器读取数据;注意 openFileInput() 的使用。


清单 21. 从内部私有存储器读取数据

 

    
/**
 * Reads a file from internal storage
 * @param filename the file to read from
 * @return the file content
 */
public byte[] readInternalStoragePrivate(String filename) {
    int len = 1024;
    byte[] buffer = new byte[len];
    try {
        FileInputStream fis = openFileInput(filename);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int nrb = fis.read(buffer, 0, len); // read up to len bytes
        while (nrb != -1) {
            baos.write(buffer, 0, nrb);
            nrb = fis.read(buffer, 0, len);
        }
        buffer = baos.toByteArray();
        fis.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return buffer;
}


清单 22 展示了如何从内部私有存储器删除数据。


清单 22. 从本地私有存储器删除数据

 

    
/**
 * Delete internal private file 
 * @param filename - the filename to delete
 */
public void deleteInternalStoragePrivate(String filename) {
    File file = getFileStreamPath(filename);
    if (file != null) {
        file.delete();
    }
}


现在可以来看为公共数据使用外部存储器了。

为公共数据使用设备的外部存储器

有了数据存储 API,您可以使用外部存储器存储数据。信息可以是私有的,您可以有选择地让其他应用程序对之具有读或写的访问权限。本节您将对此 API 进行编程,以便使用包括getExternalStorageState()getExternalFilesDir()getExternalStorageDirectory() 和getExternalStoragePublicDirectory() 在内的很多 API 来存储公共数据。您为公共数据使用下面的路径:/Android/data/<package_name>/files/

在使用外部存储器之前,必须看看它是否可用,是否可写。下面两个代码片段展示了测试这些条件的帮助器方法。清单 23 测试外部存储器是否可用。


清单 23. 测试外部存储器是否可用

 

    
/**
 * Helper Method to Test if external Storage is Available
 */
public boolean isExternalStorageAvailable() {
    boolean state = false;
    String extStorageState = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(extStorageState)) {
        state = true;
    }
    return state;
}


清单 24 测试外部存储器是否只可读。


清单 24. 测试外部存储器是否只可读

 

    
/**
 * Helper Method to Test if external Storage is read only
 */
public boolean isExternalStorageReadOnly() {
    boolean state = false;
    String extStorageState = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(extStorageState)) {
        state = true;
    }
    return state;
}


清单 25 展示了如何写到外部存储器,以存储公共数据。


清单 25. 写到外部内存

 

    
/**
 * Write to external public directory
 * @param filename - the filename to write to
 * @param content - the content to write 
 */
public void writeToExternalStoragePublic(String filename, byte[] content) {

    // API Level 7 or lower, use getExternalStorageDirectory() 
    //  to open a File that represents the root of the external 
    // storage, but writing to root is not recommended, and instead 
    // application should write to application-specific directory, as shown below.

    String packageName = this.getPackageName();
    String path = "/Android/data/" + packageName + "/files/";

    if (isExternalStorageAvailable() && 
       !isExternalStorageReadOnly()) {
        try {
            File file = new File(path, filename);
            file.mkdirs();
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(content);
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


清单 26 展示了如何从外部存储器读取数据。


清单 26. 从外部内存读取数据

 

    
/**
 * Reads a file from internal storage
 * @param filename - the filename to read from
 * @return the file contents
 */
public byte[] readExternallStoragePublic(String filename) {
    int len = 1024;
    byte[] buffer = new byte[len];
    String packageName = this.getPackageName();
    String path = "/Android/data/" + packageName + "/files/";

    if (!isExternalStorageReadOnly()) {     
        try {
            File file = new File(path, filename);            
            FileInputStream fis = new FileInputStream(file);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int nrb = fis.read(buffer, 0, len); //read up to len bytes
            while (nrb != -1) {
                baos.write(buffer, 0, nrb);
                nrb = fis.read(buffer, 0, len);
            }
            buffer = baos.toByteArray();
            fis.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return buffer;
}


清单 27 中的代码片段展示了如何从外部内存删除文件。


清单 27. 从外部内存删除文件

 

    
/**
 * Delete external public file 
 * @param filename - the filename to write to
 */
void deleteExternalStoragePublicFile(String filename) {
    String packageName = this.getPackageName();
    String path = "/Android/data/" + packageName + "/files/"+filename;
    File file = new File(path, filename);
    if (file != null) {
        file.delete();
    }
}


处理外部存储器需要特殊的权限 WRITE_EXTERNAL_STORAGE,它通过 AndroidManifest.xml 请求得到(参见 清单 28)。


清单 28. WRITE_EXTERNAL_STORAGE

 

    
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


外部存储 API 通过根据文件类型(比如 Pictures、Ringtones)将文件存储在预先确定的目录中,允许您公共地存储文件。本文没有介绍这种方法,但是您应该熟悉它。此外,记住外部存储器中的文件任何时候都可能消失。

相关的方法

如果您具有不需要长期永久保存的临时文件,那么可以将这些文件存储在高速缓存中。高速缓存是一种特殊的内存,可以用于存储中小型数据(少于兆字节),但是您一定要知道,取决于有多少内存可用,高速缓存的内容任何时候都可能被清除。

清单 29 展示了一个帮助器方法,它返回到内部内存中高速缓存的路径。


清单 29. 检索到内部内存高速缓存的路径

 

    
/**
 * Helper method to retrieve the absolute path to the application 
 * specific internal cache directory on the file system. These files 
 * will be ones that get deleted when the application is uninstalled or when 
 * the device runs low on storage. There is no guarantee when these 
 * files will be deleted.
 * 
 * Note: This uses a Level 8+ API.
 * 
 * @return the absolute path to the application specific cache 
 * directory
 */
public String getInternalCacheDirectory() {
    String cacheDirPath = null;
    File cacheDir = getCacheDir();
    if (cacheDir != null) {
        cacheDirPath = cacheDir.getPath();
    }
    return cacheDirPath;        
}


清单 30 展示了一个帮助器方法,它返回到外部内存中高速缓存的路径。


清单 30. 检索到外部内存高速缓存的路径

 

    
/**
 * Helper method to retrieve the absolute path to the application 
 * specific external cache directory on the file system. These files 
 * will be ones that get deleted when the application is uninstalled or when 
 * the device runs low on storage. There is no guarantee when these 
 * files will be deleted.
 * 
 * Note: This uses a Level 8+ API.
 * 
 * @return the absolute path to the application specific cache 
 * directory
 */
public String getExternalCacheDirectory() {
    String extCacheDirPath = null;
    File cacheDir = getExternalCacheDir();
    if (cacheDir != null) {
        extCacheDirPath = cacheDir.getPath();
    }
    return extCacheDirPath;     
}

 

 



通过使用示例应用程序,您现在应该很好地理解了如何为公共数据使用设备的外部存储器。

 

 

 

android往文件中保存和读取数据

android 获取FileOutputStream

Context.openFileOutput(文件,权限)

Context为环境的上下文,Activity 继承了Ccontext类 比如 aa 继承了Activity   那就可以这么写 :aa.this.openFileOutput(文件,权限)

文件:既为自己创建文件的名字和文件扩展名,比如 water.txt

权限:android有四种权限

     1.Context.MODE_PRIVATE

         私有属性,只有自己可以访问,并且第二次写入的内容会覆盖第一次写入的内容

     2.Context.MODE_APPEND

        私有属性,只有自己可以访问,第二次写入的内容会追加到第一次写入的内容的后面

    3.Context.MODE_WORLD_WRITEABLE

       公有属性,其它项目都可以写入,不过第二次写入的内容会覆盖第一次写入的内容

   4.Context.MODE_WORLD_READABLE

      公有属性,其它项目都可以读取

权限是可以相加的,比如

         现在我想要一个其它项目可以读取,并且也可以写入,还可以追加

          Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE+Context.MODE_APPEND

android 创建的文件会放到手机上的/data/data/包名/files下

android 获取FileInputStream

Context.openInFileOutput(文件)

Context为环境的上下文,Activity 继承了Context类

分享到:
评论

相关推荐

    android中文件的保存与读取

    在Android系统中,文件的保存和读取是应用程序处理数据的基本操作。Android提供了多种方法来存储数据,包括内部存储、外部存储以及SQLite数据库等。在这个主题中,我们将重点关注通过文件系统进行数据存取的方法。 ...

    android txt文件保存读取操作

    以上就是关于Android平台上进行TXT文件保存和读取的主要知识点。通过合理地运用这些知识,开发者可以有效地在Android应用中实现TXT文件的存取功能。在实际开发中,还要结合具体的业务需求,进行相应的优化和调整。

    Android Excel文件写入和读取

    - 遍历行和单元格:通过工作表的`getRow`方法获取行,再通过行的`getCell`方法获取单元格,从而读取数据。 - 关闭流:读取完成后,记得关闭输入流,以释放资源。 4. **处理大数据**:当处理大量数据时,应考虑...

    Android读取本地json文件的方法(解决显示乱码问题)

    在Android应用开发中,有时我们需要从本地存储的JSON文件中读取数据,这通常涉及到文件I/O操作和字符编码处理。以下将详细讲解如何在Android中读取本地JSON文件,并解决可能出现的显示乱码问题。 1. **读取本地JSON...

    Android 本地文件的存储和读取

    - 使用`FileInputStream`或`BufferedReader`打开文件,通过`read()`或`readLine()`读取数据,同样需要关闭流。 - 对于文本文件,`FileReader`可以配合`BufferedReader`方便地读取每一行。 4. **修改文件** - 先...

    Android存储数据之一:文件保存与读取.pdf

    总结以上知识点,实现Android应用中的文件保存与读取功能,涉及到了Android文件系统结构、Java I/O技术、异常处理以及Android权限管理等多个方面。通过封装FileService类和在MainActivity中实现用户交互,可以方便地...

    Android----文件的保存与读取

    以下将详细讲解Android中如何进行文件的保存和读取。 首先,Android提供了多种方式来存储文件,包括内部存储、外部存储以及SQLite数据库等。内部存储适用于私密性较高的数据,如用户配置或应用状态;外部存储通常...

    Android 逐行写入和读取文本文件Demo

    在Android应用开发中,处理文本文件是常见的任务之一,无论是保存用户数据、日志记录还是配置文件。本示例将详细介绍如何使用Android Studio 3.2进行逐行写入和读取文本文件的操作。 首先,我们需要理解Android对...

    Android Studio文本文件内容读取例子(不用sd卡)

    在Android开发中,读取文本文件是常见的任务,例如加载配置信息、用户数据或显示静态内容。本示例将详细讲解如何在Android Studio中实现不依赖SD卡的文本文件读取。以下是一个简单的步骤和相关知识点: 1. **创建...

    12_文件的保存与读取.zip

    在Android开发中,文件的...总结起来,Android中的文件保存与读取涵盖了多种策略和技术,开发者需要根据具体需求选择合适的存储方式,并注意性能和安全问题。熟悉这些技术,对于构建功能完善的Android应用至关重要。

    android读取和保存GBK编码的TXT文档

    以下将详细介绍如何在Android中读取和保存GBK编码的TXT文档。 首先,我们需要了解GBK编码。GBK是GB2312的扩展,它包含了GB2312中的所有字符,并增加了许多其他汉字和符号,总计约20902个汉字。在Java和Android中,...

    Android中实现保存和读取文本文件到内部存储器(实现简易的记事本为例)示例代码.zip

    在Android应用开发中,保存和读取数据是常见的需求,特别是在构建类似记事本的应用时。内部存储器是Android设备为每个应用提供的私有存储空间,确保数据安全且不易被其他应用访问。以下是对如何在Android中实现这个...

    Android不需要文件存储权限将文件保存至手机

    在Android系统中,传统的文件存储方式通常需要应用获取相应的文件读写权限,以便在外部存储(如SD卡)上保存和访问数据。然而,随着Android系统的更新,特别是自Android 6.0(Marshmallow)引入运行时权限管理以来,...

    Android读写配置文件

    本实例将详细介绍如何在Android中进行读取和写入配置文件的操作。 首先,Android提供了SharedPreferences接口,它是用于存储轻量级数据的首选方式,例如布尔值、整数、浮点数、字符串和字符串集。它将数据保存在XML...

    android 软件参数设置的保存和读取 附

    这篇博客将深入探讨如何在Android应用中有效地利用SharedPreferences来保存和读取数据。 首先,我们来了解一下SharedPreferences的基本概念。SharedPreferences是一个持久化的键值对存储,它会把数据保存到XML文件...

    怎么实现android中字符串的保存和读取

    在Android开发过程中,经常需要处理数据的持久化问题,其中一种常见的需求就是对字符串进行保存和读取。本文将详细介绍如何利用Java代码实现在Android应用程序中对字符串的保存与读取功能。 #### 一、保存字符串 ...

    Android应用程序中读写txt文本文件的基本方法讲解

    在Android应用程序中,读写txt文本文件是常见的需求,特别是在数据持久化或用户交互时。本文将详细讲解如何使用`context.openFileInput()`和`context.openFileOutput()`这两个方法来实现这一功能。这两个方法属于`...

    Android存储字符串数据到txt文件

    Android存储字符串数据到txt文件是Android开发中的一种常见需求,对于大多数开发者来说,存储字符串数据到txt文件是一种非常有用的功能。今天,我们将详细介绍如何在Android中存储字符串数据到txt文件。 Android...

    android 下读取framebuffer的内容

    4. **保存为文件**:读取到的内容通常是原始的RGB或ARGB像素数据,不包含任何文件头信息。你可以将这些字节保存为`.raw`文件,就像描述中所说的那样: ```java FileOutputStream fos = new FileOutputStream("/...

    android下的串口读写及数据保存

    "android下的串口读写及数据保存"这个主题涵盖了Android系统中如何与串行端口交互以及如何处理接收到的数据并将其保存到文件的关键技术点。下面我们将深入探讨这些知识点。 首先,Android系统的串口通信主要是通过...

Global site tag (gtag.js) - Google Analytics