栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

autojs下载大文件

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/643537.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号