八、java操作swift对象存储(静态大对象)
系列导航
六、java操作swift对象存储(resultful方式实现)
前面讲了如何使用swift的静态大对象那么java如何操作呢?如下的例子是我自己写的不是官网的(官网的没找到),swift系列到这就结束了,从安装到java使用都展现给大家了希望能对需要学习swift对象存储的朋友有所帮助。
一、依赖
与 六、java操作swift对象存储(resultful方式实现) 一样这里就不重复了。
二、重要方法类StaticLargeObject.java
package largeobject; import java.io.File;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpHead;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;
import org.apache.http.Header;
import base.ResultFulBase;
import largeobject.tool.CutFileUtil; //静态大对象操作
public class StaticLargeObject { //访问swift的url地址
public static String X_Storage_Url = ""; //访问swift的令牌
public static String X_Auth_Token = ""; public static ResultFulBase resultFulBase = null; public StaticLargeObject(ResultFulBase resultFulBase){
X_Storage_Url = resultFulBase.X_Storage_Url;
X_Auth_Token = resultFulBase.X_Auth_Token;
this.resultFulBase = resultFulBase;
} //上传静态大对象
/* 参数说明
* objectContainerName:存储对象分块的容器名称(实际上所有的段都可以在不同的容器里)
* maniFestContainerName:存储manifest对象的容器
* FilePath:上传的文件路径
* objectName:上传后的对象名称
* MBSize:切割文件的大小(单位MB)
* 注:使用时如果每段数据的前缀重名会破坏文件的完整性,普通文件建议使用静态大对象
*/ public static void upload_Static_large_object(String objectContainerName,String maniFestContainerName,String FilePath,String objectName,long MBSize){
CutFileUtil cutFileUtil = new CutFileUtil();
Long mbSzie = MBSize*1024*1024;
File file = new File(FilePath);
String fileName = file.getName();
String path = file.getParent()+"//"; int count =0 ;
count = cutFileUtil.cutFileBySize(FilePath, mbSzie, path ); JSONArray jsonArray = new JSONArray();
//上传可以改为多线程 获取信息单独出来
for(int i =0;i<count;i++ ){
resultFulBase.create_object(objectContainerName,i+"-"+fileName,path +i+"-"+fileName );
get_container_object_attribute( objectContainerName,i+"-"+fileName ,jsonArray ); String partFilePath = path+i+"-"+fileName;
//删除上传过的 切割文件
File partFile = new File(partFilePath);
partFile.delete();
} System.out.println("************" +jsonArray.toString() ); String manifest= jsonArray.toString(); create_Static_manifest_object(maniFestContainerName,objectName,manifest); } //静态大对象获取对象的length和etag
//curl http://127.0.0.1:8080/v1/AUTH_admin/container1/2.txt -X GET -H "X-Auth_Token: AUTH_tkf44c48c200e34f14850f6a8e3bc63f36"
public static void get_container_object_attribute(String containerName,String objectName,JSONArray jsonArray ){
try { HttpHead req = new HttpHead(X_Storage_Url+ "/"+containerName+ "/"+objectName);
// HttpGet req = new HttpGet(X_Storage_Url+ "/"+containerName+ "/"+objectName);
req.addHeader("X-Auth-Token", X_Auth_Token);
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpResponse rsp = httpclient.execute(req);
System.out.println("----------------------------------------");
System.out.println(rsp.getStatusLine());
JSONObject object = new JSONObject();
object.put("path", containerName+"/"+objectName);
Header[] headers = rsp.getAllHeaders();
for (int i = 0; i < headers.length; i++) {
System.out.println(headers[i]);
if(headers[i].toString().contains("Etag:")){
object.put("etag", headers[i].toString().replace("Etag: ",""));
}
if(headers[i].toString().contains("Content-Length:")){
object.put("size_bytes", headers[i].toString().replace("Content-Length: ",""));
}
}
System.out.println("----------------------------------------");
jsonArray.put(object);
}catch (Exception e){
e.printStackTrace();
}
} //静态大对象上传manifest对象 切割后的段文件 大小要超过1M
//curl -v -X PUT -H "X-Static-Large-Object: true" -H "X-Auth-Token: AUTH_tkb78213f9392f43cdbb6e9bee8d0cd31a" "http://127.0.0.1:8080/v1/AUTH_admin/StaticContainer/myLargeFile?multipart-manifest=put&heartbeat=on" -T /opt/manifest.json
public static void create_Static_manifest_object(String containerName,String objectName,String manifest){
try {
HttpPut req = new HttpPut(X_Storage_Url+ "/"+containerName +"/"+objectName+"?multipart-manifest=put&heartbeat=on");
req.addHeader("X-Auth-Token", X_Auth_Token);
req.addHeader("X-Static-Large-Object", "true"); StringEntity entity1=new StringEntity(manifest); // FileEntity entity1 = new FileEntity(file, "text/plain; charset=\"UTF-8\"");
req.addHeader("Content-Type", "text/plain; charset=\"UTF-8\"");
req.setEntity(entity1); DefaultHttpClient httpclient = new DefaultHttpClient();
HttpResponse rsp = httpclient.execute(req); System.out.println("----------------------------------------");
System.out.println(rsp.getStatusLine());
Header[] headers = rsp.getAllHeaders();
for (int i = 0; i < headers.length; i++) {
System.out.println(headers[i]);
}
System.out.println("----------------------------------------"); }catch (Exception e){
e.printStackTrace();
}
} }
三、数据切割的类CutFileUtil.java
package largeobject.tool; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; /**
* <功能简要> <br>
* <切割文件工具>
*
* @Author yc
* @since
*/
public class CutFileUtil { public static void main(String[] args) throws Exception {
CutFileUtil cutFileUtil = new CutFileUtil();
int count =0 ;
cutFileUtil.cutFileBySize("E://1.jpg", new Long(30000), "E://1/" );
} /**
* @param filePath 文件所在主机的路径 例:/home/gyt/nginx.tar
* @param byteSize 拆分文件字节大小
* @param saveAddr 拆分后的文件保存目录 /homt/gyt/
* @return
*/
public int cutFileBySize(String filePath, Long byteSize, String saveAddr ){
List<String> fileNames = new ArrayList<String>();
File file = new File(filePath);
//计算总共段数
int count = (int) Math.ceil(file.length()/(double)byteSize);
int countLen = (count +"").length();
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>(count * 2); ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,4,1,TimeUnit.SECONDS, workQueue ); //ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,4,1,TimeUnit.SECONDS,new ArrayBlockingQueue<>(count * 2)); //时间戳
String timeStamp = String.valueOf(System.currentTimeMillis()); for (int i = 0; i < count; i++) {
//分段文件名
// String fileName = timeStamp + "-" + leftPad((i+1) +"", countLen, '0') + "-" +file.getName();
String fileName = i+ "-" +file.getName();
threadPoolExecutor.execute(new SplitRunnable(byteSize.intValue(), fileName, file, i*byteSize, saveAddr));
fileNames.add(fileName);
}
threadPoolExecutor.shutdown();
while (true){
if (threadPoolExecutor.isTerminated()){
return count;
}
try {
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
} } public static String leftPad(String str, int length, char ch){
if (str.length() >= length){
return str;
}
char[] chs = new char[length];
Arrays.fill(chs, ch);
char[] src = str.toCharArray();
System.arraycopy(src, 0, chs, length - src.length, src.length);
return new String(chs);
} private class SplitRunnable implements Runnable{
int byteSize;
String fileName;
File originFile;
Long startPos;
String currentWorkDir; public SplitRunnable(int byteSize, String fileName, File originFile, Long startPos, String currentWorkDir) {
this.byteSize = byteSize;
this.fileName = fileName;
this.originFile = originFile;
this.startPos = startPos;
this.currentWorkDir = currentWorkDir;
} public void run(){
RandomAccessFile randomAccessFile = null;
OutputStream outputStream = null;
try {
randomAccessFile = new RandomAccessFile(originFile, "r");
byte[] b = new byte[byteSize];
randomAccessFile.seek(startPos); //移动指针到每“段”开头
int s = randomAccessFile.read(b);
outputStream = new FileOutputStream(currentWorkDir+fileName);
outputStream.write(b, 0 , s);
outputStream.flush();
b= null;
}catch (IOException e){
e.printStackTrace();
}finally {
if (outputStream !=null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
} if (randomAccessFile !=null){
try {
randomAccessFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
四、调用的主类StaticLargeObjectMain.java
package mian; import largeobject.StaticLargeObject;
import base.ResultFulBase; //静态大对象上传调用
public class StaticLargeObjectMain { public static void main(String[] args) { //连接到swift获得令牌
ResultFulBase resultFulBase = new ResultFulBase("192.168.0.1","8080","admin:admin","admin"); //初始化动态大对象的操作类
StaticLargeObject staticLargeObject = new StaticLargeObject(resultFulBase); //上传一个动态大对象
//注:E://1/1.zip 是一个5M多的文件, 切割大小为3M每块
staticLargeObject.upload_Static_large_object("SegmentContainer","maniFestContainer","E://1/1.zip", "1.zip",new Long(3) ); //下载上传上去的大对象
resultFulBase.get_container_object("maniFestContainer","1.zip","E:\\mylarge.zip"); } }

八、java操作swift对象存储(静态大对象)的更多相关文章
- Hibernate 中 联合主键映射 组合关系映射 大对象映射(或者说文本大对象,二进制数据大对象)
Clob:文本大对象,最长4G Blob:二进制数据大对象,最长4G util: public class HibUtil { private static SessionFactory sessio ...
- java操作文件常用的 IO流对象
1.描述:流是字节数据或字符数据序列.Java采用输入流对象和输出流对象来支持程序对数据的输入和输出.输入流对象提供了数据从源点流向程序的管道,程序可以从输入流对象读取数据:输出流对象提供了数据从程序 ...
- swift对象存储安装
对象存储服务概览 OpenStack对象存储是一个多租户的对象存储系统,它支持大规模扩展,可以以低成本来管理大型的非结构化数据,通过RESTful HTTP 应用程序接口. 它包含下列组件: 代理服务 ...
- [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- 22.Java面试学习平台-整合OSS对象存储
SpringCloud实战项目全套学习教程连载中 PassJava 学习教程 简介 PassJava-Learning项目是PassJava(佳必过)项目的学习教程.对架构.业务.技术要点进行讲解. ...
- [转载] 文件系统vs对象存储——选型和趋势
原文: http://www.testlab.com.cn/Index/article/id/1082.html#rd?sukey=fc78a68049a14bb2699b479d5e730f6f45 ...
- 大对象数据LOB的应用(Day_10)
当你有永不放弃的精神,全力以赴的态度,你会惊叹自己也能创造奇迹! LOB数据类型概述 由于于无结构的数据往往都是大型的,存储量非常大,而LOB(large object)类型主要用来支持无结构的大型数 ...
- 大对象数据LOB的应用
概述 由于无结构的数据往往都是大型的,存储量特别大,而LOB(large object)类型主要用来支持无结构的大型数据. 用户可以利用LOB数据类型来存储大型的无结构数据,特别是文本,图形,视频和音 ...
- 初试 Ceph 存储之块设备、文件系统、对象存储
转载自:https://cloud.tencent.com/developer/article/1010543 1.Ceph 存储介绍 Ceph 是一个开源的分布式存储系统,包括对象存储.块设备.文件 ...
- .Net 垃圾回收和大对象处理
CLR垃圾回收器根据所占空间大小划分对象.大对象和小对象的处理方式有很大区别.比如内存碎片整理 —— 在内存中移动大对象的成本是昂贵的,让我们研究一下垃圾回收器是如何处理大对象的,大对象对程序性能有哪 ...
随机推荐
- 从0到1,手把手带你开发截图工具ScreenCap------001实现基本的截图功能
ScreenCap---Version:001 说明 从0到1,手把手带你开发windows端的截屏软件ScreenCap 当前版本:ScreenCap---001 支持全屏截图 支持鼠标拖动截图区域 ...
- 后端程序员必会的前端知识-05:React
五. React 1. React 基础 react 是前端三大框架之一 没有 vue 的基础更好,因为两者思想不太一样,不能用 vue 的习惯学习 react 需要有 js 基础,视频 19-58 ...
- Layui treeTable 使用【数据不显示、子级不显示】
//返回JSON数据类 public class LeaveMessageTreeTable { public LeaveMessageTreeTable() { this.children = ne ...
- 如何延长window11更新信息?
前言 日常使用电脑的时候,我们总是会遇到一个很常见的问题:如何关闭windows自动更新. 解决方法一: 暂停更新 解决方法二: 打开注册表: 运行 => regedit 进入: HKEY_LO ...
- 【API 进阶之路】做 OCR 文字识别,谁说必须要有 AI 工程师?
摘要:有些功能还真不能光凭自己的直觉和认识,来自一线的声音才是最真实的用户需求.比方说名片录入的需求. 在公司技术委员会副主席这个位置上干了有几个月了,期间,我一方面给研发团队整理各种文档资料,做技术 ...
- 如何花“一点点小钱”突破华为云CCE服务的“防线”
摘要:有没有方法绕开CCE的限制,自由的调用K8s的API呢?有还便宜,2.4元/集群/天. 申明:所有的一切都是为了使得华为云可以更好,而不是为了diss它. 通过华为云购买多个K8s集群,又想使用 ...
- 华为云联合多家单位正式开源云原生多沙箱容器运行时Kuasar
摘要:云原生多沙箱容器运行时Kuasar正式开源. 本文分享自华为云社区<重磅发布!华为云联合多家单位正式开源云原生多沙箱容器运行时Kuasar>,作者:云容器大未来. 当地时间4月21日 ...
- 二进制SCA指纹提取黑科技:Go语言逆向技术
摘要:SCA(Software Composition Analysis)软件成分分析,指通过对软件源码.二进制软件包等的静态分析,挖掘其所存在的开源合规.已知漏洞等安全合规风险,是一种业界常见的安全 ...
- Error: Could not find or load main class org.elasticsearch.tools.java_version_checker.JavaVersionChecker
把elasticsearch目录换到不属于root目录的其他目录就行了
- iOS App的打包和上架流程
转载:iOS App的打包和上架流程 - 掘金 1. 创建账号 苹果开发者账号几种开发者账号类型 个人开发者账号 费用:99 美元/年(688.00元) 协作人数:仅限开发者自己 不需要填写公司的 ...