uniapp在安卓中进行写入和读取文件

添加权限

打开manifest.json,在App权限配置中,添加读取和写入的权限
 

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

编写代码

File.js

/* 
	使用该类应开启以下权限(读取和写入)
	<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 */
/* 
	文件编码
	ansi(ascii):英文标准码0-127,包括控制符和其他英文字符编码,这在后来一直统一没再变过,当然它只需要一个字节保存
	gb2312和gbk:这两个是ancii码加上汉字的扩展,汉字多达10万,在ancii编码基础上再加一个字节表示汉字,共可表示字符65535个,包括了繁体字。因此一个中文字符包含两个字节。eclipse中默认编码方式为gbk。在Windows中文系统中ANSI是默认的编码方式。对于英文文件是ASCII编码,对于简体中文文件是GB2312编码。
	Unicode编码:顾名思义,这是国际统一标准编码,在这之前各国标准编码不统一,微软等公司需要为各国的计算机系统定制符合不同编码标准的系统,显然,成本太高,并且互联网的出现让不同编码标准的计算机交互变得困难,如:两国的邮件系统,会因为使用不同的编码标准而导致接受方收到的邮件是乱码。
	utf-8和utf-16编码:UTF的意思是(UCS Transfer Format),显然是随着互联网的出现,需要解决Unicode在网络上的传输问题。顾名思义,UTF8就是每次8个位传输数据,而UTF16就是每次16个位,只不过为了传输时的可靠性,从UNICODE到UTF时并不是直接的对应,而是要过一些算法和规则来转换。UTF-8就是在互联网上使用最广的一种unicode的实现方式。
*/
 
/**
 * 获取手机内置存储的根路径
 * @return {String}
 */
const root = function() {
	const environment = plus.android.importClass("android.os.Environment");
	return environment.getExternalStorageDirectory();
}
 
/**
 * 获取指定文件夹下的所有文件和文件夹列表
 * @param {String} path 文件夹路径
 * @return {Array<String>} 文件和文件夹列表
 */
const filelist = function(dir = '') {
	const File = plus.android.importClass("java.io.File");
	let list = [];
	let file = new File(dir);
	let tempList = file.listFiles();
	for (let i = 0; i < tempList.length; i++) {
		let fileName = tempList[i].getName();
		list.push(fileName);
	}
	return list;
}
 
/**
 * 创建文件
 * @return {boolean} flase=失败(已存在、操作失败),true=成功
 */
const createNewFile = function(path = '') {
	const File = plus.android.importClass('java.io.File');
	let file = new File(path);
	if (!file.exists()) {
		return file.createNewFile();
	}
	return false;
}
 
/**
 * 创建文件夹
 * @return {boolean} flase=失败(已存在、操作失败),true=成功
 */
const mkdirs = function(path = ''){
	const File = plus.android.importClass('java.io.File');
	let file = new File(path);
	if (!file.exists()) {
		return file.mkdirs();
	}
	return false;
}
 
/**
 * 读取文件
 * @param {String} path 文件路径
 * @param {String} charset 编码
 * @return {Array<String>} 内容列表(按行读取),文件不存在或异常则返回false
 */
const readTxt = function(path = '', charset = 'utf-8') {
	const File = plus.android.importClass('java.io.File');
	const InputStreamReader = plus.android.importClass('java.io.InputStreamReader');
	const BufferedReader = plus.android.importClass('java.io.BufferedReader');
	const FileInputStream = plus.android.importClass('java.io.FileInputStream');
	let file = new File(path);
	let inputStreamReader = null;
	let bufferedReader = null;
	let list = [];
	try {
		if (!file.exists()) {
			return false;
		}
		inputStreamReader = new InputStreamReader(new FileInputStream(file), charset);
		bufferedReader = new BufferedReader(inputStreamReader);
		let line = '';
		while (null != (line = bufferedReader.readLine())) {
			list.push(line);
		}
		bufferedReader.close();
		inputStreamReader.close();
	} catch (e) {
		if (null != bufferedReader) {
			bufferedReader.close();
		}
		if (null != inputStreamReader) {
			inputStreamReader.close();
		}
		return false;
	}
	return list;
}
 
/**
 * 写入文件内容
 * @param {String} path 文件路径
 * @param {String} content 内容
 * @param {boolean} append 内容写入类型,false=不追加(覆盖原有内容),true=追加(从内容尾部写入)
 * @param {String} charset 编码
 * @return {boolean} true=成功,false=失败
 */
const writeTxt = function(path = '', content = '', append = false, charset = 'utf-8') {
	const File = plus.android.importClass('java.io.File');
	const FileOutputStream = plus.android.importClass('java.io.FileOutputStream');
	const OutputStreamWriter = plus.android.importClass('java.io.OutputStreamWriter');
 
	let outputStreamWriter;
	let file = new File(path);
	try {
		//不存在则创建新的文件
		if (!file.exists()) {
			file.createNewFile();
		}
		outputStreamWriter = new OutputStreamWriter(new FileOutputStream(path, append), charset);
		outputStreamWriter.write(content);
		outputStreamWriter.close();
	} catch (e) {
		if (null != outputStreamWriter) {
			outputStreamWriter.close();
		}
		return false;
	}
	return true;
}
 
/**
 * 判断文件是否存在
 * @param path 文件路径
 * @return true=存在 false=不存在
 */
const isFileExist = function(path = ''){
	const File = plus.android.importClass('java.io.File');
	return new File(path).exists()
}
 
/**
 * 删除文件
 * @param {String} path
 */
const deleteFile = function(path = ''){
	const File = plus.android.importClass('java.io.File');
	let file = new File(path);
	if (file.exists()) {
		return file.delete();
	}
	return false  
} 
 
 
export default {
	root,
	filelist,
	createNewFile,
	mkdirs,
	readTxt,
	writeTxt,
	isFileExist,
	deleteFile
}

如何使用

导入js

import FileJS from "@/utils/File.js";

判断有没有授权读写权限

async requestStoragePermission() {
      try {
        // 获取Android应用的上下文
        const context = plus.android
          .runtimeMainActivity()
          .getApplicationContext();
        // 请求的权限
        const permission = "android.permission.WRITE_EXTERNAL_STORAGE";
        // 检查权限状态
        const permissionState =
          context.checkCallingOrSelfPermission(permission);
        //如果已经授权,获取到的permissionState为0,未授权为-1
        if (permissionState === 0) {
          this.permissionGranted = true;
          //已经授权编写业务逻辑
        } else {
          // 未授权,请求权限
          const activity = plus.android.runtimeMainActivity();
          const requestCode = 100; // 自定义请求码
          activity.requestPermissions([permission], requestCode);
        }
      } catch (error) {
        console.error("Error requesting permission:", error);
      }
    },

如何写入文本

async writeFile(value) {
      // 获取文件路径
      const filePath = FileJS.root() + "/device.txt";
      // 获取要写入的内容
      const content = value;
      // 写入文件
      const result = await FileJS.writeTxt(filePath, content);
      // 如果写入成功
      if (result) {
        console.log("文件写入成功");
      } else {
        console.error("文件写入失败");
      }
    },

读取文本
 

async readFile() {
      // 获取文件路径
      const filePath = FileJS.root() + "/device.txt";
      // 读取文件内容
      const content = await FileJS.readTxt(filePath);
      const that = this;
      // 如果读取到内容
      if (content) {
       //处理读取到文本内容之后的逻辑
      } else {
       //处理读取不到的逻辑
      }
    },

遗留问题

手机不存在该文件的情况下,可以正常创建并且读取,但是删掉创建的文本之后,重新创建同名文本,提示创建成功,但是手机该目录查找不到,并且也无法读取,有知道的小伙伴,可以在评论留言,非常非常感谢!!

本文章参考自uniapp安卓读取或写入txt文件,创建文件或文件夹,获取手机内置存储根路径_uniapp项目在手机根目录创建文件夹-CSDN博客文章浏览阅读5.9k次,点赞4次,收藏23次。uniapp安卓读取或写入txt文件,创建文件或文件夹,获取手机内置存储根路径_uniapp项目在手机根目录创建文件夹https://blog.csdn.net/fentashen9162/article/details/131141071

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编码旅途

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值