Android基础教程数据存储之文件存储

针对 Android 基础教程中的数据存储之文件存储一章,我会给出完整的攻略,以及至少两条示例说明。

一、数据存储之文件存储

Android 系统提供了多种数据存储技术,其中文件存储技术是比较常用的一种。文件存储主要用于存储一些非结构化的数据,如图片、音频和视频等。文件存储可以分为内部存储和外部存储两种,其中内部存储又分为应用程序私有存储和应用程序公有存储两种形式。

本文将以应用程序私有存储的方式,实现文件的读取和写入。

1.文件存储方法

应用程序私有存储主要通过上下文对象Context提供的openFileInput()openFileOutput()方法实现,其中openFileInput()用于读取存储在Android文件系统中的文件,而openFileOutput()方法用于创建写入的文件,并且可以选择是否追加内容。

2.读取文件

刚才提到了openFileInput()方法可以用来读取已经存储的文件,下面给出具体的代码示例:

public String read() {
    FileInputStream in;
    BufferedReader reader;
    StringBuilder content = new StringBuilder();
    try {
        in = openFileInput("data");
        reader = new BufferedReader(new InputStreamReader(in));
        String line;
        // 使用reader对象逐行读取文件内容
        while ((line = reader.readLine()) != null) {
            content.append(line);
        }
        reader.close();
        in.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return content.toString();
}

上述代码中,首先通过openFileInput()方法获取FileInputStream对象,然后再通过BufferedReader逐行读取文件内容,读取完毕后,关闭文件输入流和BufferedReader对象,并将读取的数据以字符串的形式返回给调用者。

需要注意的是,openFileInput()返回的是字节流的形式,因此需要通过InputStreamReader将其转化为字符流,并且由于BufferedReader可以逐行读取内容,因此它也要参与到字符流转化中。

3.写入文件

应用程序私有存储还允许将文件写入到Android文件系统之中,下面给出具体的代码示例:

public void save(String inputText) {
    FileOutputStream out;
    BufferedWriter writer;
    try {
        out = openFileOutput("data", Context.MODE_PRIVATE);
        writer = new BufferedWriter(new OutputStreamWriter(out));
        // 将传入的字符串写入到文件中
        writer.write(inputText);
        writer.close();
        out.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

上述代码中,首先通过openFileOutput()方法创建一个FileOutputStream对象,然后通过BufferedWriter将要写入的内容逐行添加到这个FileOutputStream中。最后关闭文件输出流和BufferedWriter,完成写入操作。

和读取文件的过程类似,写入文件的过程也需要先将字节流转化为字符流,因此在创建BufferedWriter对象时,也要使用OutputStreamWriter将字节流转化为字符流。

二、示例说明

下面给出一个使用应用程序私有存储进行文件读写的简单示例:

首先创建一个按钮,使用该按钮执行写入操作:

<Button
    android:id="@+id/save"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Save to File" />

在对应的 Activity 中,添加如下代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private EditText edit;
    private Button btnSave, btnLoad;
    private FileService service;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        edit = findViewById(R.id.edit);
        btnSave = findViewById(R.id.save);
        btnLoad = findViewById(R.id.load);

        btnSave.setOnClickListener(this);
        btnLoad.setOnClickListener(this);

        service = new FileService(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.save:
                final String inputText = edit.getText().toString();
                service.save(inputText);
                break;
            case R.id.load:
                String data = service.read();
                if (!TextUtils.isEmpty(data)) {
                    edit.setText(data);
                    // 将光标移到末尾
                    edit.setSelection(data.length());
                }
                break;
            default:
                break;
        }
    }
}

在上述代码中,我们创建了一个FileService类,用于封装对文件的读写操作。当用户按下“Save to File”按钮时,我们获取输入框中的内容,并调用FileService类的save()方法将该内容写入到文件中。当用户按下“Load from File”按钮时,则调用FileService类的read()方法从文件中读取保存的内容并显示到输入框中。

另外一个示例是实现将图片写入到文件系统中:

private void saveImageToExternalStorage(Bitmap finalBitmap, String dirName, String fileName) {
        String root = Environment.getExternalStorageDirectory().toString();
        //创建目录
        File dir = new File(root + "/" + dirName);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        File file = new File(dir, fileName);
        if (file.exists()) {
            file.delete();
        }
        try {
            FileOutputStream out = new FileOutputStream(file);
            finalBitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

上述代码中,我们使用了Environment.getExternalStorageDirectory()获取了外部存储的文件根目录。然后通过创建File对象的形式,创建要存储的路径和文件,并将这个File对象传给FileOutputStream。最后,通过Bitmap的压缩功能将图片压缩为PNG格式并写入到外部存储中。

以上是 Android 基础教程数据存储之文件存储的完整攻略和两个示例说明。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android基础教程数据存储之文件存储 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • FluentMybatis实现mybatis动态sql拼装和fluent api语法

    我来为你讲解“FluentMybatis实现mybatis动态sql拼装和fluent api语法”的攻略。 1. 什么是FluentMybatis FluentMybatis 是一款 Mybatis 增强工具库,使 Mybatis 易用,优雅,高效。它封装了一系列的 API,通过 Fluent (流畅的) 针对 Mybatis XML SQL 进行二次封装…

    html 2023年5月30日
    00
  • WAP建站WML语言语法基础教程第3/6页

    下面是关于“WAP建站WML语言语法基础教程第3/6页”的详细讲解。 标题 “WAP建站WML语言语法基础教程第3/6页”是一个标题,应该用一级标题显示,即:# WAP建站WML语言语法基础教程第3/6页。 内容概述 第3/6页是WML语言基础教程的第三章,本章主要讲解WML语言中使用的标签,以及标签的使用方法和属性。本章的内容对于学习WML语言非常重要。 …

    html 2023年5月30日
    00
  • 舞动你的文字 巧用html中marquee属性

    下面是关于“舞动你的文字 巧用html中marquee属性”的完整攻略: 1. 什么是marquee属性? <marquee> 是 HTMl 中的一种文本滚动的效果,通过使用 marquee 属性来实现。该属性被称为“跑马灯”效果,可以让文字、图片、音频等元素在网页上呈现动态效果。 2. marquee属性的语法 marquee属性常用的属性包括…

    html 2023年5月30日
    00
  • 详解html中的marquee属性

    下面是详解html中的marquee属性的完整攻略: 标题 什么是marquee属性 在HTML中,marquee是一个可以在页面中创建滚动文本或图像的属性。可以通过marquee属性来设置文本的速度、方向和顶部和底部的空间。 marquee属性的用法 marquee属性可以用于文本或图像,如下所示: <marquee>Hello, world!…

    html 2023年5月30日
    00
  • Spring中基于XML的AOP配置详解

    下面我将为您详细讲解“Spring中基于XML的AOP配置详解”的完整攻略。 1. 简介 AOP(面向切面编程)是Spring框架的一个关键特性,它允许开发人员将横切关注点(如日志记录和事务管理)从应用程序主业务逻辑中分离出来。Spring框架支持基于XML的AOP配置,这种方式使得AOP配置变得简单和易于理解。在本文中,我们将探讨Spring中基于XML的…

    html 2023年5月30日
    00
  • 网站整站下载器 网站整站下载工具介绍(网站整站下载器下载utf8网页乱码问题解决)

    网站整站下载器介绍 什么是网站整站下载器? 网站整站下载器,顾名思义,就是用来下载整个网站的工具。它可以将一个网站上的所有网页、图片、视频等资源全部下载到本地,方便用户离线阅读或备份。 网站整站下载器的作用 网站整站下载器可以便捷地将整个网站下载到本地。用户可以使用网站整站下载工具搜索需要下载的网站,并选择需要下载的内容,让工具自动帮忙将网站的所有页面及网站…

    html 2023年5月31日
    00
  • 全面解析HTML5中的标准属性与自定义属性

    全面解析HTML5中的标准属性与自定义属性 在HTML5中,标准属性指的是在W3C HTML规范中提到的属性,它们被广泛应用于各种HTML元素。自定义属性则指的是由开发者自己定义的属性,在HTML中通常使用data-*的形式定义。在本篇文章中,我们将详细讲解HTML5中的标准属性与自定义属性。 标准属性 href href属性用于定义页面之间的链接。可以在a…

    html 2023年5月31日
    00
  • 骑马与砍杀2起中文名字乱码怎么办 骑马与砍杀2起中文名字正确方法

    骑马与砍杀2起中文名字乱码怎么办 骑马与砍杀2是一款非常受欢迎的游戏,但是在游戏过程中会出现中文名字乱码的情况。这对于大多数中文玩家来说是非常不方便的。在这篇攻略中,我们将详细说明如何解决这个问题。 问题原因 骑马与砍杀2的中文名字乱码的问题是因为游戏默认的编码方式与中文编码方式不匹配,导致游戏无法正确解析中文名字的编码。这会导致游戏中的中文名字出现乱码。 …

    html 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部