如何在Android编程中实现SD卡文件读写操作?实例详解!

Android编程之在SD卡上进行文件读写操作实例详解

如何在Android编程中实现SD卡文件读写操作?实例详解!

在Android应用程序开发中,对SD卡进行文件读写操作是一个常见的需求,本文将详细介绍如何在Android应用中实现这些操作,并提供相应的代码示例。

一、权限管理

在Android 6.0(API级别23)及以上版本,应用程序需要在运行时请求用户授权,才能访问SD卡,首先需要在AndroidManifest.xml文件中添加以下权限声明:

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

然后在代码中检测权限状态,并在权限缺失时向用户请求权限:

if (ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
    // 权限未被授予,需要请求权限
    ActivityCompat.requestPermissions(thisActivity,
            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
            MY_PERMISSIONS_REQUEST_WRITE_STORAGE);
}

处理权限请求的回调:

@Override
public void onRequestPermissionsResult(int requestCode,
        String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_WRITE_STORAGE: {
            // 如果请求被取消,则结果数组为空
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 权限被授予,执行相关操作
            } else {
                // 权限被拒绝,告知用户无需权限的功能
            }
            return;
        }
    }
}

二、获取SD卡路径

在Android系统中,可以通过Environment类获取外部存储的根目录:

String sdCardRoot = Environment.getExternalStorageDirectory().getAbsolutePath();

从Android 10(API级别29)开始,建议使用特定的应用目录来存储数据,而不是直接访问外部存储的根路径:

如何在Android编程中实现SD卡文件读写操作?实例详解!

File externalFilesDir = context.getExternalFilesDir(null);

三、创建文件夹和文件

创建文件夹

在SD卡上创建文件夹可以使用File类的mkdirs()方法:

public File createDirOnSDCard(String dir) {
    File dirFile = new File(sdCardRoot + File.separator + dir + File.separator);
    Log.v("createDirOnSDCard", sdCardRoot + File.separator + dir + File.separator);
    dirFile.mkdirs();
    return dirFile;
}

创建文件

在SD卡上创建文件可以使用File类的createNewFile()方法:

public File createFileOnSDCard(String fileName, String dir) throws IOException {
    File file = new File(sdCardRoot + File.separator + dir + File.separator + fileName);
    Log.v("createFileOnSDCard", sdCardRoot + File.separator + dir + File.separator + fileName);
    file.createNewFile();
    return file;
}

四、判断文件是否存在

可以使用File类的exists()方法来判断SD卡上的某个文件是否存在:

public boolean isFileExist(String fileName, String path) {
    File file = new File(sdCardRoot + path + File.separator + fileName);
    return file.exists();
}

五、写入数据到文件

将数据写入到SD卡指定目录文件可以使用FileOutputStream类:

如何在Android编程中实现SD卡文件读写操作?实例详解!

public File writeData2SDCard(String path, String fileName, InputStream data) {
    File file = null;
    OutputStream output = null;
    try {
        createDirOnSDCard(path); // 创建目录
        file = createFileOnSDCard(fileName, path); // 创建文件
        output = new FileOutputStream(file);
        byte buffer[] = new byte[2 * 1024]; // 每次写2K数据
        int temp;
        while ((temp = data.read(buffer)) != -1) {
            output.write(buffer, 0, temp);
        }
        output.flush();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            output.close(); // 关闭数据流操作
        } catch (Exception e2) {
            e2.printStackTrace();
        }
    }
    return file;
}

六、读取文件数据

读取SD卡上的文件数据可以使用FileInputStream类:

public String readDataFromSDCard(String path, String fileName) {
    File file = new File(sdCardRoot + path + File.separator + fileName);
    StringBuilder stringBuilder = new StringBuilder();
    try {
        BufferedReader br = new BufferedReader(new FileReader(file));
        String line;
        while ((line = br.readLine()) != null) {
            stringBuilder.append(line).append("
");
        }
        br.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return stringBuilder.toString();
}

七、删除文件或文件夹

可以使用File类的delete()方法来删除文件或文件夹:

public boolean deleteFileOrFolder(String path) {
    File file = new File(sdCardRoot + path);
    if (file.exists()) { // 判断文件或文件夹是否存在
        if (file.delete()) { // 删除文件或文件夹(如果删除成功)
            Log.d("Delete file", "Deleted successfully");
            return true;
        } else { // 删除失败(权限不足或磁盘空间不足等原因)
            Log.d("Delete file", "Failed to delete");
            return false;
        }
    } else { // 文件或文件夹不存在
        Log.d("Delete file", "File not found");
        return false;
    }
}

通过以上步骤,我们可以在Android应用中实现对SD卡的文件读写操作,需要注意的是,随着Android版本的更新,对外部存储的访问方式可能会有所变化,开发者应根据实际情况进行调整。

小伙伴们,上文介绍了“Android编程之在SD卡上进行文件读写操作实例详解”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/638704.html

Like (0)
Donate 微信扫一扫 微信扫一扫
K-seo的头像K-seoSEO优化员
Previous 2024-11-10 21:43
Next 2024-11-10 21:51

相关推荐

  • 固始网官网

    固始网官网是一个提供固始县新闻、政务、旅游等信息的综合性门户网站,致力于服务固始市民和游客。

    2024-04-18
    0134
  • 网页加载太慢怎么办?

    网站网页加载/打开速度慢的原因1、服务器响应速度慢服务器响应速度是影响网站加载速度的关键因素,当用户访问网站时,服务器需要处理请求并返回相应的数据,如果服务器响应速度慢,用户就需要等待更长的时间才能看到页面内容。2、网页文件过大网页文件过大也是导致网站加载速度慢的原因之一,如果一个网页包含了大量的图片、视频或其他媒体文件,那么它的加载……

    2024-01-18
    0146
  • sql 判断函数、存储过程是否存在的代码整理

    整理了SQL代码,用于检测数据库中函数和存储过程的存在性。

    2024-02-18
    0211
  • 亚太地区租用日本服务器好吗知乎

    亚太地区租用日本服务器好吗?随着互联网的普及和发展,越来越多的企业和个人开始关注服务器租赁服务,服务器作为承载网站、应用等的关键设施,其性能和稳定性直接影响到用户体验,而在众多服务器提供商中,日本服务器因其高速、稳定、安全等特点而受到广泛关注,亚太地区租用日本服务器到底好不好呢?本文将从技术角度对这个问题进行详细解答。日本服务器的优势……

    2023-12-18
    0105
  • 如何将数据转移到iOS设备?「如何将数据转移到ios设备上」

    在当今的数字化时代,我们的大部分数据都存储在各种设备和云端服务中,无论是工作文件、个人照片,还是音乐和视频,我们都需要一种有效的方式来将这些数据转移到iOS设备上,本文将详细介绍如何将数据转移到iOS设备。我们需要了解的是,iOS设备包括iPhone、iPad和iPod Touch等,这些设备都支持通过iTunes进行数据同步,但是,……

    2023-11-13
    0271
  • java匿名内部类的特性有哪些

    Java匿名内部类是Java语言中一种特殊的类,它没有显式的类名,通常用于实现接口或继承抽象类,匿名内部类的特性主要有以下几点:1、没有显式的类名匿名内部类没有显式的类名,它的类名是由编译器自动生成的,编译器会为每个匿名内部类生成一个唯一的类名,这个类名以“$”开头,后面跟着一串数字,例如OuterClass$1、OuterClass……

    2023-12-31
    0131

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入