使用PipedInputStream 和 PipedOutputStream 上传文件,并更新进度
来源:互联网 发布:节奏大师网络拦截 编辑:程序博客网 时间:2024/06/16 10:33
//要上传的文件流
InputStream is = new FileInputStream(‘这里可以是一个文件路径,或FILE对象’);
//用管道流对上传文件流进行包装,这两个必须一起声明,in将从out中读字节
PipedInputStream in =new PipedInputStream();
PipedOutputStream out = new PipedOutputStream(in);
//启动一个线程,将本地文件从流IS中读取写到管道out中,这样管理in才能读到字节
new Thread(new Runnable() {
@Override
public void run() {
try {
//文件总长度
long fileSize =
nodeModel.getFileUploadStatusModel().getFile().length();
//每读取5M更新一次进度
long step=Long.parseLong(tools.ConfigReader.get("fileUploadUpdateInterval"));//5*1024*1024;
long tempStep =0;
//如果还有字节,线程就一直循环
while(is.available()!=0)
{
//使用缓存
byte[] byteArray = new byte[1024];
is.read(byteArray);
out.write(byteArray);
out.flush();
tempStep+=1024;
//每读一定的字节就计算一次进度,并更新数据库;另一个显示进度的线程将从数据库中读取进度并显示出来
if(tempStep==step)
{
tempStep=0;
//每读取一部分文件内容,就更新上传进度
float okLen =fileSize-is.available();
float f=(okLen/fileSize)*100;
FileUploadStatusModel fileUploadStatusModel =nodeModel.getFileUploadStatusModel();
fileUploadStatusModel.setStatus(f+"%");
fileUploadStatusModel.setMsg("上传中");
fileUploadStatusImpl.updateFileUploadStatus(fileUploadStatusModel);
}
}
//这个地方要关掉
out.close();
} catch (IOException | SQLExceptione) {
FileUploadStatusModel fileUploadStatusModel =nodeModel.getFileUploadStatusModel();
fileUploadStatusModel.setStatus("0%");
fileUploadStatusModel.setMsg("读取文件内容出错,原因【"+e.getMessage()+"】");
try {
fileUploadStatusImpl.updateFileUploadStatus(fileUploadStatusModel);
} catch (SQLExceptione1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}
} }).start();
//启动上传线程上传文件,这个线程从管理in中读字节,写到任何想写入的地方
new Thread(new Runnable() {
@Override
public void run() {
try {
int resultCode =hcpAdmin.CreateFile(in,
nodeModel.getTargetUrl(),
buildAuth(nodeModel.getTargetNamespace()));
FileUploadStatusModel fileUploadStatusModel =nodeModel.getFileUploadStatusModel();
if(resultCode==201)
{
fileUploadStatusModel.setStatus("100%");
fileUploadStatusModel.setMsg("成功");
fileUploadStatusImpl.updateFileUploadStatus(fileUploadStatusModel);
}
else
{
int code=-1;
String msg="";
if(resultCode==413)
{
code=-1;
msg="文件太大无法上传";
}
else if(resultCode==409)
{
code=409;
msg="文件已存在无法上传";
}
else if(resultCode==403)
{
code=403;
msg="协议不支持或权限不足";
}
fileUploadStatusModel.setStatus("0%");
fileUploadStatusModel.setMsg(msg);
fileUploadStatusImpl.updateFileUploadStatus(fileUploadStatusModel);
}
} catch (IOException | SQLExceptione) {
FileUploadStatusModel fileUploadStatusModel =nodeModel.getFileUploadStatusModel();
fileUploadStatusModel.setStatus("0%");
fileUploadStatusModel.setMsg("向HCP写主文件过程出错,原因【"+e.getMessage()+"】");
try {
fileUploadStatusImpl.updateFileUploadStatus(fileUploadStatusModel);
} catch (SQLExceptione1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}
} }).start();
- 使用PipedInputStream 和 PipedOutputStream 上传文件,并更新进度
- 使用PipedOutputStream和PipedInputStream
- PipedInputStream和PipedOutputStream的使用例子
- PipedInputStream&&PipedOutputStream使用
- PipedInputStream和PipedOutputStream
- PipedOutputStream 和 PipedInputStream
- PipedInputStream和PipedOutputStream
- PipedInputStream和PipedOutputStream
- PipedOutputStream和PipedInputStream
- 管道流PipedInputStream 和PipedOutputStream
- PipedOutputStream类 和PipedInputStream 类
- PipedInputStream和PipedOutputStream管道流
- 【Java-IO】PipedInputStream和PipedOutputStream
- Java-PipedOutputStream和PipedInputStream类
- 管道流PipedOutputStream和PipedInputStream的使用-黑马程序员
- Java IO:PipedOutputStream和PipedInputStream使用详解及源码分析
- PipedInputStream & PipedOutputStream
- 4.5.5.1PipedInputStream类 和PipedOutputStream类
- HashTable和HashMap区别
- chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
- 传引用&传值
- Halcon腐蚀膨胀算子
- 排序算法
- 使用PipedInputStream 和 PipedOutputStream 上传文件,并更新进度
- 【Servlet开发】servlet的请求与响应(二)
- mybatis注解详解
- hdu 4474 bfs
- java 路径分隔符
- 递归
- Android学习笔记--RecycleView用法
- POJ 2392 Space Elevator 排序+多重背包
- Android handler示例