牙叔教程 簡單易懂
文件太大, 直接無響應
即使我是小米11, 我有12G的內存, 也是直接無響應了,
猜測系統(tǒng)不允許一下子占用這么大的內存,
或者
autojs無法申請這么大的內存
復現(xiàn)問題
1. 創(chuàng)建一個1G的大文件
導入java類
importClass(java.io.File);
importClass(java.io.FileOutputStream);
importClass(java.io.IOException);
importClass(java.nio.ByteBuffer);
importClass(java.nio.channels.FileChannel);
創(chuàng)建文件輸出流
let file = new File(targetFile);
let fos = new FileOutputStream(file);
獲取通道
let fileChannel = fos.getChannel();
分配新的字節(jié)緩沖區(qū)
let buffer = ByteBuffer.allocate(batchSize);
把通道里面的數(shù)據(jù)吧凉,讀出來,放緩沖區(qū)里面
fileChannel.write(buffer);
關閉文件輸出流
fos.close();
2. 創(chuàng)建服務端, 用于下載文件
導入nodejs模塊
"nodejs";
const http = require("http");
const url = require("url");
const fs = require("fs");
監(jiān)聽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執(zhí)行的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())
使用以上代碼即可復現(xiàn), 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數(shù)
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();
然后每次只讀寫一小塊, 直到?jīng)]有數(shù)據(jù)可讀, 就表示大文件寫入完成.
環(huán)境
手機: Mi 11 Pro
Android版本: 11
Autojs版本: 9.0.13
參考
@Tsing Yi 分享的群文件--下載百分比
名人名言
思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文檔, autojs文檔, 最后才是群里問問
--- 牙叔教程
聲明
部分內容來自網(wǎng)絡
本教程僅用于學習, 禁止用于其他用途