教程基于Auto.js 4.0.1版本
目标:数据的获取、使用及储存
- 数据使用
- 数据储存
- 数据获取、传输
数据使用
将获取到的数据拿去做了事,就是对数据进行了使用。以下例子均为对数据的使用。
很简单的使用方式:
log(数据)
将数据打印输出到控制台。
if(数据)
判断是否存在数据,数据不为false、undefined、null的情况。
数据储存
就是将数据保存到以后可以再次获取的地方。也是数据使用的一种。
储存可以当做是修改代码的作用域范围。
作用域举列:小明能呼吸空气(数据),“空气"这个’量’是在小明的"可操作范围”(作用域)内,小明“现在”不能呼吸到氨气(数据),是因为氨气“现在”不在小明的可操作范围(作用域)内。
简单来讲:空气在不在小明的范围内,就决定了小明能不能使用空气。
储存举例: 小红在存在氨气(数据)的地方,用保鲜袋装了一代氨气,之后拿给小明。“现在”小明打开袋子,氨气在小明的范围内,小明成功的吸到了氨气。
简单来讲:储存就是将数据的作用域进行了修改。
常见的储存方式:
保存到文件
files.write(path, text[, encoding = "utf-8"])
将数据写到文件上进行储存。注意:文件只能保存字符串。在’程序’方面,文件的本质是只记录数字的。通过字符集转成的字符串。日常用得最多的也是保存字符串。
代码:
// 在手机的 /sdcard/脚本/ 目录下创建一个文件1.txt,并在文件里面写上"文件内容"4个字
files.write("/sdcard/脚本/1.txt", "文件内容");
结果:
运行前:
运行后:

函数:
files.write(path, text[, encoding = "utf-8"])#
path <string> 路径
text <string> 要写入的文本内容
encoding <string> 字符编码
把text写入到文件path中。如果文件存在则覆盖,不存在则创建。
Storages - 本地存储
storages模块提供了保存简单数据、用户配置等的支持。保存的数据除非应用被卸载或者被主动删除,否则会一直保留。
本地储存就像是一本记事本(笔记本)。每一页是一个Storage对象(注意没有s后缀)。每一页都是可以无限扩充的,取决于设备(手机)的储存大小。每一页的页码换成了一个名字。想要拿到第几页就跟他说名字即可。没有加密,所有脚本都可以访问任意Storage对象。
使用方式:
通过storages(有s后缀,而且是小写)获取一个Storage对象,也就是获取一页纸。在获取的时候会创建,如果已经有了,那么就是获取。如果没有,就是创建。
代码:
log(storages.create("测试"));
结果:
对Storage对象进行增删操作:
增加:添加是键值对添加。简单来说:键就是这一页纸的第几行,值就是这一行写的数据。
删除:通过键来删除。简单来说:键,这一行把他给擦掉。
修改:重新增加即可达到修改操作。
查询:通过键来查询。简单来说:就是拿到键这一行写的数据。
代码:
// 获取一个 Storage对象
let s = storages.create("测试");
// 添加操作,在"k1"这一行写了"v1"
s.put("k1","v1");
// 查询操作,拿到"k1"这一行的数据并且打印出来
log(s.get("k1"));
// 删除操作,删除"k1"这一行
s.remove("k1");
// 查询操作,此时再去查看,数据已经没有了
log(s.get("k1"));
// 删除操作,删除当前这一页纸
storages.remove("测试");
结果:
函数
storages.create(name)
name <string> 本地存储名称
创建一个本地存储并返回一个Storage对象。不同名称的本地存储的数据是隔开的,而相同名称的本地存储的数据是共享的。
storages.remove(name)
name <string> 本地存储名称
删除一个本地存储以及他的全部数据。如果该存储不存在,返回false;否则返回true。
Storage.get(key[, defaultValue])#
key <string> 键值
defaultValue <any> 可选,默认值
从本地存储中取出键值为key的数据并返回。
如果该存储中不包含该数据,这时若指定了默认值参数则返回默认值,否则返回undefined。
返回的数据可能是任意数据类型,这取决于使用Storage.put保存该键值的数据时的数据类型。
Storage.put(key, value)#
key <string> 键值
value <any> 值
把值value保存到本地存储中。value可以是undefined以外的任意数据类型。如果value为undefined则抛出TypeError。
存储的过程实际上是使用JSON.stringify把value转换为字符串再保存,因此value必须是可JSON化的才能被接受。
Storage.remove(key)
key <string> 键值
移除键值为key的数据。不返回任何值。
保存到服务器
这里以get请求为例,向百度发出一个搜索请求。百度的服务器能收到我们发送的数据"abc",所以才会将他的处理结果给我们。我们可以向指定的服务器发送数据,服务器可以进行保存。
代码:
// 发出请求并获取到返回的数据。请求链接使用的二级域名是wap,数据会稍微多一点。
let re = http.get("http://wap.baidu.com/s?word=abc");
// 打印本次请求的返回状态码
log(re.statusCode)
// 打印本次请求到的数据的长度。由于返回的数据过多,直接打印会卡死。
log(re.body.string().length)
结果

函数:
http.get(url[, options, callback])
url <string> 请求的URL地址,需要以"http://"或"https://"开头。如果url没有以"http://"开头,则默认为"http://"。
options <Object> 请求选项。参见[http.request()][]。
callback <Function> 回调函数,可选,其参数是一个[Response][]对象。如果不加回调函数,则该请求将阻塞、同步地执行。
对地址url进行一次HTTP GET 请求。如果没有回调函数,则在请求完成或失败时返回此次请求的响应(参见[Response][])。
数据获取
数据:一个数字、一句话、一个对象、一个异常等等等等,都是数据。
我将数据获取的方式分为两种:内部数据、外部数据
内部数据:
脚本程序自己创建产生的数据(例如:变量)。
创造数据、使用数据、数据范围的例子
代码:
// 创造数据:创建了一个变量a,值为10。这就是脚本自己创建的数据。
var a = 10;
// 数据使用:由于代码块在当前范围内,数据a也在范围内,所以代码块里面可以使用数据a
{
log("a", a);
// 创建数据:创建全局变量,这个全局是指当前js文件内。
var b = 20;
// 创造数据:创建局部变量b,由于是局部范围,在代码块之外将无法使用。
let c = 30;
}
// 使用数据:打印输出 b、c
log("b", b); // 正常使用
log("c", c); // 会出现 变量c未定义错误
结果:

数据储存,将创建的变量c使用外部的“储存器”(比如变量)给保存起来即可。
代码:
// 创建一个变量d用于储存c
var d;
var a = 10;
{
log("a", a);
var b = 20;
let c = 30;
d = c; // 将c的数据赋值给d,也就相当于复制了一份出去。
}
log("b", b);
// log("c", c); // 这里变量c还是一样未定义
log("d", d); // 变量d的内容就是变量c的内容
结果:

函数:
console.log([data][, ...args])
data <any>
...args <any>
打印到控制台,并带上换行符。 可以传入多个参数,第一个参数作为主要信息,其他参数作为类似于 printf(3) 中的代替值(参数都会传给 util.format())。
const count = 5;
console.log('count: %d', count);
// 打印: count: 5 到 stdout
console.log('count:', count);
// 打印: count: 5 到 stdout
详见 util.format()。
该函数也可以作为全局函数使用。
外部数据:
不是脚本自己创造出来的数据均称为外部数据。
从外部获取到的数据我又将其分成两种:主动数据、被动数据
主动数据: 脚本主动去获取的数据。响应时间快,因为是主动去获取的。
被动数据: 脚本开启监听,被动获取的数据。响应时间不稳定,不能确定什么时间会出现数据。
主动数据:
files.read(path)
读取指定文件获取文件的内容(数据)。
http.get(url)
通过网络获取一个网页的内容(数据)。
被动数据:
events.observeNotification()
监听通知信息(数据)。
ui.id.click(fun)
监听ui界面中指定id的控件的点击操作(信息),当出现点击操作时会执行函数 fun。
整合例子:从百度搜索"soso",然后将搜索到的数据保存到文件"soso.html"文件中。
代码:
// 定义要搜索的内容
let soso = "soso"; // 可以修改成想要搜索的内容,可以改成 input,让用户自行输入
// 拼接字符串并进行搜索
let re = http.get("http://wap.baidu.com/s?word="+soso);
// 打印本次请求的返回状态码
log(re.statusCode);
// 使用一个变量来保存请求到的数据。多此一举的原因是因为"re.body.string()"只能用一次。
let data = re.body.string()
// 打印本次请求到的数据的长度。由于返回的数据过多,直接打印会卡死。
log(data.length);
// 拼接文件路径,使用files.join的原因是在忘记输入斜杠/时会自动加上。
let path = files.join("/sdcard/脚本/", soso+".html");
log(path);
// 将本次内容写到文件中
files.write(path, data);
结果:
代码运行结束

文件创建成功

网页数据已经保存到文件中

使用html查看器来查看

已经是在搜索界面

函数列表:
Storages - 本地存储
| 函数名 | 功能 | 参数 | 返回值 |
|---|---|---|---|
| storages.create(name) | 创建一个本地存储并返回一个Storage对象。不同名称的本地存储的数据是隔开的,而相同名称的本地存储的数据是共享的。 | string | Storage |
| storages.remove(name) | 删除一个本地存储以及他的全部数据。如果该存储不存在,返回false;否则返回true。 | string | boolean |
| - | Storage | - | |
| get(key[, defaultValue]) | 从本地存储中取出键值为key的数据并返回。如果该存储中不包含该数据,这时若指定了默认值参数则返回默认值,否则返回undefined。返回的数据可能是任意数据类型,这取决于使用Storage.put保存该键值的数据时的数据类型。 | string | any(自动解析,也就是多种类型) |
| put(key, value) | 把值value保存到本地存储中。value可以是undefined以外的任意数据类型。如果value为undefined则抛出TypeError。存储的过程实际上是使用JSON.stringify把value转换为字符串再保存,因此value必须是可JSON化的才能被接受。 | string | string(或者可JSON化的对象) |
| remove(key) | 移除键值为key的数据。不返回任何值。 | string | - |
| contains(key) | 返回该本地存储是否包含键值为key的数据。是则返回true,否则返回false。 | string | boolean |
| clear() | 移除该本地存储的所有数据。不返回任何值。 | - | - |
Files - 文件系统
| 函数名 | 功能 | 参数 | 返回值 |
|---|---|---|---|
| ! | 注意!!!需要使用 files 来调用。例子:files.isFile(“1”) | ! | |
| isFile(path) | 返回路径path是否是文件 | string | boolean |
| isDir(path) | 返回路径path是否是文件夹 | string | boolean |
| isEmptyDir(path) | 返回文件夹path是否为空文件夹。如果该路径并非文件夹,则直接返回false | string | boolean |
| join(parent, child) | 连接两个路径并返回,例如files.join("/sdcard/", “1.txt”)返回"/sdcard/1.txt"。 | string,string | string |
| create(path) | 创建一个文件或文件夹并返回是否创建成功。如果文件已经存在,则直接返回false。 | string | boolean |
| createWithDirs(path) | 创建一个文件或文件夹并返回是否创建成功。如果文件所在文件夹不存在,则先创建他所在的一系列文件夹。如果文件已经存在,则直接返回false。 | string | boolean |
| exists(path) | 判断在路径path处的文件是否存在 | ||
| ensureDir(path) | 确保路径path所在的文件夹存在。如果该路径所在文件夹不存在,则创建该文件夹。 | string | boolean |
| read(path[, encoding = “utf-8”]) | 读取文本文件path的所有内容并返回。如果文件不存在,则抛出FileNotFoundException。 | string,string | string |
| readBytes(path) | 读取文件path的所有内容并返回一个字节数组。如果文件不存在,则抛出FileNotFoundException。 | string | byte[] |
| write(path, text[, encoding = “utf-8”]) | 把text写入到文件path中。如果文件存在则覆盖,不存在则创建。 | string,string,string | - |
| writeBytes(path, bytes) | 把bytes(字节数组)写入到文件path中。如果文件存在则覆盖,不存在则创建。 | string,byte[] | - |
| append(path, text[, encoding = ‘utf-8’]) | 把text追加到文件path的末尾。如果文件不存在则创建。 | string,string,string | - |
| appendBytes(path, text[, encoding = ‘utf-8’]) | 把bytes追加到文件path的末尾。如果文件不存在则创建。 | string,byte[] | - |
| copy(fromPath, toPath) | 复制文件,将路径fromPath的文件复制到toPath路径 | string,string | boolean |
| move(fromPath, toPath) | 移动文件,将路径fromPath的文件复制到toPath路径 | string,string | boolean |
| rename(path, newName) | 重命名文件,并返回是否重命名成功。path是一个路径,不仅仅是文件名。 | string,string | boolean |
| renameWithoutExtension(path, newName) | 重命名文件,不包含拓展名,并返回是否重命名成功。例如files.rename("/sdcard/1.txt", “2”)会把"1.txt"重命名为"2.txt"。 | string,string | boolean |
| getName(path) | 返回文件的文件名。例如files.getName("/sdcard/1.txt")返回"1.txt"。 | string | string |
| getNameWithoutExtension(path) | 返回不含拓展名的文件的文件名。例如files.getName("/sdcard/1.txt")返回"1"。 | string | string |
| getExtension(path) | 返回文件的拓展名。例如files.getExtension("/sdcard/1.txt")返回"txt"。 | string | string |
| remove(path) | 删除文件或空文件夹,返回是否删除成功。 | string | boolean |
| removeDir(path) | 删除文件夹,如果文件夹不为空,则删除该文件夹的所有内容再删除该文件夹,返回是否全部删除成功。 | string | boolean |
| getSdcardPath() | 返回SD卡路径。所谓SD卡,即外部存储器。现在通常获取到的是"/storage/emulated/o","/sdcard"和他功能相同,内部会自动处理。 | - | string |
| cwd() | 返回脚本的"当前工作文件夹路径"。该路径指的是,如果脚本本身为脚本文件,则返回这个脚本文件所在目录;否则返回null获取其他设定路径。 | - | string |
| path(relativePath) | 返回相对路径对应的绝对路径。例如files.path("./1.png"),如果运行这个语句的脚本位于文件夹"/sdcard/脚本/“中,则返回”/sdcard/脚本/1.png"。 | string | string |
| listDir(path[, filter]) | 列出文件夹path下的满足条件的文件和文件夹的名称的数组。如果不加filter参数,则返回所有文件和文件夹。 | string,function | array |
open(path[, mode = "r", encoding = "utf-8", bufferSize = 8192])
path \<string> 文件路径,例如"/sdcard/1.txt"。
mode \<string> 文件打开模式,包括:
"r": 只读文本模式。该模式下只能对文件执行文本读取操作。
"w": 只写文本模式。该模式下只能对文件执行文本覆盖写入操作。
"a": 附加文本模式。该模式下将会把写入的文本附加到文件末尾。
"rw": 随机读写文本模式。该模式下将会把写入的文本附加到文件末尾。
目前暂不支持二进制模式,随机读写模式。
encoding <string> 字符编码。
bufferSize <number> 文件读写的缓冲区大小。
打开一个文件。根据打开模式返回不同的文件对象。包括:
"r": 返回一个ReadableTextFile对象。
"w", "a": 返回一个WritableTextFile对象。
对于"w"模式,如果文件并不存在,则会创建一个,已存在则会清空该文件内容;
其他模式文件不存在会抛出FileNotFoundException。
ReadableTextFile 可读文件对象(以下简称Re)。
PWritableTextFile 可写文件对象(以下简称Pw)。
| 函数 | 功能 | 参数 | 返回值 |
|---|---|---|---|
| ! | 注意!!!打开一个文件写入后,不再使用时务必关闭,否则文件可能会丢失 | ! | |
| Re.read() | 返回该文件剩余的所有内容的字符串。 | - | string |
| Re.read(maxCount) | 读取该文件接下来最长为maxCount的字符串并返回。即使文件剩余内容不足maxCount也不会出错。 | number | string |
| Re.readline() | 读取一行并返回(不包含换行符)。 | - | string |
| Re.readlines() | 读取剩余的所有行,并返回它们按顺序组成的字符串数组。 | - | array |
| Re.close() | 关闭该文件。 | - | |
| Pw.close() | 关闭文件。同时会被缓冲区内容输出到文件。 | - | |
| Pw.write(text) | 把文本内容text写入到文件中。 | string | |
| Pw.writeline(line) | 把文本line写入到文件中并写入一个换行符。 | string | |
| Pw.writelines(lines) | 把很多行写入到文件中。 | array | |
| Pw.flush() | 把缓冲区内容输出到文件中。 | - |
本教程详细介绍了Auto.Js中数据的获取、使用和储存,包括内部数据、外部数据、本地存储(Storages)以及文件系统操作。通过实例展示了如何使用storages模块进行数据存储和查询,以及如何读取和保存文件。此外,还讲解了如何通过网络获取数据并将其保存到文件中。

被折叠的 条评论
为什么被折叠?



