autojs下载大文件

牙叔教程 简单易懂

文件太大, 直接无响应

在这里插入图片描述

即使我是小米11, 我有12G的内存, 也是直接无响应了,
猜测系统不允许一下子占用这么大的内存,
或者
autojs无法申请这么大的内存

复现问题

1. 创建一个1G的大文件

导入java类

importClass(java.io.File);
importClass(java.io.FileOutputStream);
importClass(java.io.IOException);
importClass(java.nio.ByteBuffer);
importClass(java.nio.channels.FileChannel);

创建文件输出流

let file = new File(targetFile);
let fos = new FileOutputStream(file);

获取通道

let fileChannel = fos.getChannel();

分配新的字节缓冲区

let buffer = ByteBuffer.allocate(batchSize);

把通道里面的数据,读出来,放缓冲区里面

fileChannel.write(buffer);

关闭文件输出流

fos.close();
2. 创建服务端, 用于下载文件

导入nodejs模块

"nodejs";
const http = require("http");
const url = require("url");
const fs = require("fs");

监听8000端口的请求, 只要收到请求, 就读取流并传给响应

const server = http.createServer((req, res) => {
  const { pathname } = url.parse(req.url);
  if (pathname === "/") {
    console.log("pathname =");
    console.log(pathname);
    let filepath = "/sdcard/aaa.jia";
    console.log(filepath);
    fs.readFile(filepath, (err, data) => {
      console.log("data....");
      if (err) {
        res.end(err);
        return;
      }
      res.writeHead(200, {
        "Content-Disposition": "attachment; filename=" + "aaaaaaaa.txt",
        "content-type": "application/octet-stream",
        "Access-Control-Allow-Origin": "*",
        "Access-Control-Allow-Headers": "X-Requested-With",
        "Access-Control-Allow-Methods": "PUT,POST,GET,DELETE,OPTIONS",
      });
      fs.createReadStream(filepath).pipe(res);
    });
  }
});
server.listen(8000);
3. autojs下载文件

因为我是直接用autojs执行的nodejs代码, 所以可以直接用IP 127.0.0.1

let url = "127.0.0.1:8000";
let r = http.get(url);
let filePath = "/sdcard/bbb.txt";
files.writeBytes(filePath, r.body.bytes())

使用以上代码即可复现, autojs下载大文件, 无响应的问题.

解决下载大文件无响应

var url = "127.0.0.1:8000";
var call = http
  .client()
  .newCall(
    http.buildRequest(url, {
      method: "GET",
    })
  )
  .execute();
var fs = new java.io.FileOutputStream("/sdcard/ccc.apk");
var buffer = util.java.array("byte", 1024); //byte[]
var byteSum = 0; //总共读取的文件大小
var byteRead; //每次读取的byte数
var is = call.body().byteStream();
var fos = call.body().contentLength();
log(fos);
log("开始下载");
while ((byteRead = is.read(buffer)) != -1) {
  byteSum += byteRead;
  fs.write(buffer, 0, byteRead); //读取
  //log((byteSum / fos) * 100 + "%")
}
log("下载完成");

下载大文件不可以用

r.body.bytes()

而要使用

call.body().byteStream();

然后每次只读写一小块, 直到没有数据可读, 就表示大文件写入完成.

环境

手机: Mi 11 Pro
Android版本: 11
Autojs版本: 9.0.13

参考

nodejs实现文件下载

@Tsing Yi 分享的群文件–下载百分比

名人名言

思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文档, autojs文档, 最后才是群里问问
— 牙叔教程

声明

部分内容来自网络
本教程仅用于学习, 禁止用于其他用途

bilibili

牙叔教程

微信公众号 牙叔教程

在这里插入图片描述

QQ群

747748653
在这里插入图片描述

### 回答1: AutoJs是一款利用JavaScript语言控制安卓设备的自动点击工具,也可以借助其下载文件。 AutoJs下载文件的主要实现方式有两种。第一种是利用AutoJs脚本中提供的http.post()或http.get()方法下载文件。该方法需要先获取文件下载链接,然后将链接作为参数传入http.post()或http.get()方法中,即可实现下载。 第二种方式是利用系统的下载管理器下载文件,该方式需要在AutoJs脚本中调用系统的下载管理器。例如,在AutoJs中可以利用Toast对象提供的makeText()方法实现弹出“正在下载”提示框,然后再调用系统的下载管理器启动下载。 无论是哪种方式,如果要将文件保存到指定路径,都需要在脚本中指定保存路径。AutoJs提供了files.create()方法,用于创建目录及文件。可以先创建保存文件的目录,再将文件下载到该目录中。 需要注意的是,在AutoJs下载文件时,需保证文件下载链接的正确性和下载过程中的网络连接稳定性,以免出现下载失败等问题。同时,在下载完文件后,还需要对下载的文件进行验证和校验,以确保文件内容的完整性和可用性。 ### 回答2: AutoJS是一款方便实用的安卓端脚本编程工具,拥有丰富的操作接口和功能库。在AutoJS下载文件也是一种常见的需求。下面就来介绍一下在AutoJS中如何下载文件。 首先,我们需要知道AutoJS下载文件的基本流程: 1. 获取文件下载链接。 2. 构造HTTP请求,发送请求并接受响应数据。 3. 将响应数据写入本地文件中。 接下来,我们逐步分析这个过程。 1. 获取文件下载链接。要下载文件,必须先知道文件的下载链接。如果我们要下载的文件在网页上,可以使用AutoJS提供的webView对象来获取。例如,我们要下载百度首页上的一个图片: ``` var url = "https://www.baidu.com/img/bd_logo1.png"; ``` 2. 构造HTTP请求,发送请求并接受响应数据。在AutoJS中,可以使用Http对象来发送HTTP请求和接收响应数据。我们使用Http.get()方法来发送GET请求,其中第一个参数是请求地址,第二个参数是可选的请求头信息,第三个参数是可选的请求超时时间。例如: ``` var response = http.get(url); ``` 3. 将响应数据写入本地文件中。下载的文件需要保存在本地。在AutoJS中,可以使用files模块来读写文件。我们使用files.writeBytes()方法将响应数据写入文件。其中第一个参数是要写入的文件路径,第二个参数是文件内容(二进制数据)。例如: ``` files.writeBytes("/sdcard/bd_logo1.png", response.body.bytes()); ``` 以上就是AutoJS下载文件的基本流程。当然,实际操作中还需要注意一些细节问题,例如处理网络请求错误情况、设置请求头信息、多线程下载等等。但是,只要遵守以上基本流程,我们就可以轻松地在AutoJS中实现文件的下载功能。 ### 回答3: 在 AutoJs 中,下载文件可以使用 Http 下载模块实现。现在我们来看一下如何使用 Http 模块下载文件。 首先,我们需要引入 Http 模块,代码如下: ```javascript var http = require("http"); ``` 接着,我们需要设置下载文件的地址,代码如下: ```javascript var url = "http://example.com/example.apk"; ``` 其中,url 是我们要下载的文件的地址。 然后,我们需要设置下载文件的存储路径和文件名,代码如下: ```javascript var path = "/sdcard/example.apk"; ``` 其中,path 是我们要保存文件的路径和文件名。 最后,我们可以通过 Http 模块的 download 函数来实现文件的下载操作,代码如下: ```javascript http.download(url, path, {}, function(res, err) { if (err) { toast("下载失败:" + err); return; } toast("下载成功!"); }); ``` 其中,download 函数的第一个参数是文件的下载地址,第二个参数是文件的保存路径,第三个参数是可选参数,可以设置下载超时时间、请求头等信息,第四个参数是回调函数,用于处理下载结果。 这样就可以实现在 AutoJs下载文件的操作了。值得注意的是,下载文件需要网络权限和文件读写权限。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

牙叔教程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值