前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android实现简单的文件下载与上传

Android实现简单的文件下载与上传

作者头像
砸漏
发布2020-10-27 15:28:31
9580
发布2020-10-27 15:28:31
举报
文章被收录于专栏:恩蓝脚本

文件下载

代码语言:javascript
复制
/**
* 下载服务 IntentService 
* 生命周期:
* 1 当第一次启动IntentService时,Android容器
*  将会创建IntentService对象。
* 2 IntentService将会在工作线程中轮循消息队列,
*  执行每个消息对象中的业务逻辑。
* 3 如果消息队列中依然有消息,则继续执行,
*  如果消息队列中的消息已经执行完毕,
*  IntentService将会自动销毁,执行onDestroy方法。
*/
public class DownloadService extends IntentService{
private static final int NOTIFICATION_ID = 100;
public DownloadService(){
super("download");
}
public DownloadService(String name) {
super(name);
}
/**
* 该方法中的代码将会在工作线程中执行
* 每当调用startService启动IntentService后,
* IntentService将会把OnHandlerIntent中的
* 业务逻辑放入消息队列等待执行。
* 当工作线程轮循到该消息对象时,将会
* 执行该方法。
*/
protected void onHandleIntent(Intent intent) {
//发送Http请求 执行下载业务
//1. 获取音乐的路径
String url=intent.getStringExtra("url");
String bit=intent.getStringExtra("bit");
String title=intent.getStringExtra("title");
//2. 构建File对象,用于保存音乐文件
//   /mnt/sdcard/Music/_64/歌名.mp3
File targetFile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC),"_"+bit+"/"+title+".mp3" );         
if(targetFile.exists()){
Log.i("info", "音乐已存在");
return;
}
if(!targetFile.getParentFile().exists()){
targetFile.getParentFile().mkdirs();
}
try {
sendNotification("音乐开始下载", "音乐开始下载");
//3. 发送Http请求,获取InputStream
InputStream is = HttpUtils.getInputStream(url);
//4. 边读取边保存到File对象中
FileOutputStream fos = new FileOutputStream(targetFile);
byte[] buffer = new byte[1024*100];
int length=0;
int current = 0;
int total = Integer.parseInt(intent.getStringExtra("total"));
while((length=is.read(buffer)) != -1){
fos.write(buffer, 0, length);
fos.flush();
current += length;
//通知下载的进度
double progress = Math.floor(1000.0*current/total)/10;
sendNotification("音乐开始下载", "下载进度:"+progress+"%");
}
//5. 文件下载完成
fos.close();
cancelNotification(); //重新出现滚动消息
sendNotification("音乐下载完成", "音乐下载完毕");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 发通知
*/
public void sendNotification(String ticker, String text){
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification.Builder builder = new Notification.Builder(this);
builder.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle("音乐下载")
.setContentText(text)
.setTicker(ticker);
Notification n = builder.build();
manager.notify(NOTIFICATION_ID, n);
}
/**
* 取消通知
*/
public void cancelNotification(){
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.cancel(NOTIFICATION_ID);
}    
}

文件上传

代码语言:javascript
复制
/** 
* 上传文件 
* @param uploadFile 
*/ 
private void uploadFile(final File uploadFile) { 
new Thread(new Runnable() {      
@Override 
public void run() { 
try { 
uploadbar.setMax((int)uploadFile.length()); 
String souceid = logService.getBindId(uploadFile); 
String head = "Content-Length="+ uploadFile.length() + ";filename="+ uploadFile.getName() + ";sourceid="+ 
(souceid==null? "" : souceid)+"\r\n"; 
Socket socket = new Socket("192.168.1.78",7878); 
OutputStream outStream = socket.getOutputStream(); 
outStream.write(head.getBytes()); 
PushbackInputStream inStream = new PushbackInputStream(socket.getInputStream());   
String response = StreamTool.readLine(inStream); 
String[] items = response.split(";"); 
String responseid = items[0].substring(items[0].indexOf("=")+1); 
String position = items[1].substring(items[1].indexOf("=")+1); 
if(souceid==null){//代表原来没有上传过此文件,往数据库添加一条绑定记录 
logService.save(responseid, uploadFile); 
} 
RandomAccessFile fileOutStream = new RandomAccessFile(uploadFile, "r"); 
fileOutStream.seek(Integer.valueOf(position)); 
byte[] buffer = new byte[1024]; 
int len = -1; 
int length = Integer.valueOf(position); 
while(start&&(len = fileOutStream.read(buffer)) != -1){ 
outStream.write(buffer, 0, len); 
length += len; 
Message msg = new Message(); 
msg.getData().putInt("size", length); 
handler.sendMessage(msg); 
} 
fileOutStream.close(); 
outStream.close(); 
inStream.close(); 
socket.close(); 
if(length==uploadFile.length()) logService.delete(uploadFile); 
} catch (Exception e) { 
e.printStackTrace(); 
} 
} 
}).start(); 
} 
} 

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对ZaLou.Cn的支持。如果你想了解更多相关内容请查看下面相关链接

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列
腾讯云消息队列 TDMQ 是分布式架构中的重要组件,提供异步通信的基础能力,通过应用解耦降低系统复杂度,提升系统可用性和可扩展性。TDMQ 产品系列提供丰富的产品形态,包含 CKafka、RocketMQ、RabbitMQ、Pulsar、CMQ 五大产品,覆盖在线和离线场景,满足金融、互联网、教育、物流、能源等不同行业和场景的需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档