对象存储服务
这里以七牛云对象存储为例,首先导入其依赖:
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>7.7.0</version>
</dependency>
官方操作文档:https://developer.qiniu.com/kodo/1239/java#install-by-yourself
上传
示例:
import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
public class qiniuTest {
final static String accessKey = "TYHMVuGpxupDATQaYERN8fPzBllC8MWuzjoGsjlE";
final static String secretKey = "3tGcgqra7-FRnYFevt8UmFlXPG9KlMWLyEjr7TOy";
final static String bucket = "classroomtest";
final static String myFile="E:\\Pictures\\壁纸~二次元\\583c1806ee400ae5.jpg";
public static void main(String[] args) {
Auth auth=Auth.create(accessKey,secretKey);
String upToken = auth.uploadToken(bucket);//上传凭证
Configuration cfg=new Configuration(Region.region1());
UploadManager uploadManager = new UploadManager(cfg);
String key = null;//默认不指定key的情况下,以文件内容的hash值作为文件名
try {
Response response = uploadManager.put(myFile, key, upToken);
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
System.out.println(putRet.key);//不指定key,key和hash一样,都是上传文件的名称
System.out.println(putRet.hash);
//也可以用“JSONObject.parseObject(res.bodyString()).get("key|hash");”
//获取key|hash
} catch (QiniuException e) {
Response r = e.response;
System.err.println(r.toString());
try {
System.err.println(r.bodyString());
} catch (QiniuException ex2) {
//ignore
}
}
}
}
//控制台输出:
Fvlccsj_9ShXsOgQzdbK-ygO--ZV
Fvlccsj_9ShXsOgQzdbK-ygO--ZV
如果想要上传到这个**bucket**
桶中的**teacher**
目录中并指定文件名为**test**
,设置:**String key = "teacher/test";**
默认上传最大文件大小为**1MB**
,可通过以下配置将最大值改为**20mb**
:
spring:
servlet:
multipart:
max-file-size: 20MB
下载
EasyExcel
EasyExcel
介绍
EasyExcel
是阿里巴巴开源的一个excel
处理框架,以使用简单、节省内存著称。EasyExcel
能大大减少占用内存的主要原因是在解析Excel
时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行行读取数据,逐个解析。
EasyExcel
特点
- Java领域解析、生成
Excel
比较有名的框架有Apache poi
、jxl
等。但他们都存在一个严重的问题就是非常的耗内存。如果你的系统并发量不大的话可能还行,但是一旦并发上来后一定会OOM
或者JVM频繁的**full gc**
。 **EasyExcel**
采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AnalysisEventListener
)EasyExcel
是一个基于Java的简单、省内存的读写Excel
的开源项目。在尽可能节约内存的情况下支持读写百MB
的Excel
。EasyExcel操作
pom.xml
<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.1</version> </dependency>
创建一个Bean
实体类
@Data
public class User {
@ExcelProperty(value = "用户id",index = 0)
/**设置表头信息
* 列名表头是"用户id",对应第0列;
*/
private int id;
@ExcelProperty(value = "用户名",index = 1)
private String name;
}
写操作
public static void main(String[] args) {
//设置文件名称和路径;
String filename="E:\\Pictures\\Camera Roll\\user.xlsx";
/*①调用写操作方法*/
//创建数据
List<User> list = new ArrayList<User>();
for (int i = 0; i < 10; i++) {
User data = new User();
data.setId(i);
data.setName("张三"+i);
list.add(data);
}
EasyExcel.write(filename,User.class)
.sheet("写操作-用户表")//sheet名,即表格名
.doWrite(list);
}
读操作
监听器
public class ExcelListener extends AnalysisEventListener<User> {
//一行一行读取Excel内容,把每行内容封装到user对象中
//从第二行开始读取(默认认为第一行是表头)
@Override
public void invoke(User user, AnalysisContext analysisContext) {
//user就是读到的内容(一行一行读取)
System.out.println(user);
}
//读取表头内容
@Autowired
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
System.out.println("表头内容:"+headMap);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {}
}
读取操作
public static void main(String[] args) {
//设置文件名称和路径;
String filename="E:\\Pictures\\Camera Roll\\user.xlsx";
//②调用读操作方法
EasyExcel.read(filename,User.class,new ExcelListener()).sheet().doRead();
//sheet()不写参数默认读第一个sheet
}