OSS操作工具类java代码

配置类

package com.unicom.microserv.ai.semantic.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class OSSProperties {

    @Value("${endpoints}")
    private String endpoint;
    @Value("${accessKeyId}")
    private String accessKeyId;
    @Value("${accessKeySecret}")
    private String accessKeySecret;
    @Value("${bucketName}")
    private String bucketName;
    
    public String getEndpoint() {
        return endpoint;
    }
    public void setEndpoint(String endpoint) {
        this.endpoint = endpoint;
    }
    public String getAccessKeyId() {
        return accessKeyId;
    }
    public void setAccessKeyId(String accessKeyId) {
        this.accessKeyId = accessKeyId;
    }
    public String getAccessKeySecret() {
        return accessKeySecret;
    }
    public void setAccessKeySecret(String accessKeySecret) {
        this.accessKeySecret = accessKeySecret;
    }
    public String getBucketName() {
        return bucketName;
    }
    public void setBucketName(String bucketName) {
        this.bucketName = bucketName;
    }

}

类名和引用

package com.unicom.microserv.ai.semantic.util;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.*;
import com.unicom.microserv.ai.semantic.config.OSSProperties;
import com.unicom.microserv.ai.semantic.model.DialogueRecord;
import org.apache.commons.beanutils.BeanUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.InvocationTargetException;
import java.net.SocketException;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @description   oss工具类
 * @author  liutao
 * @date 20210617
 */
@Component
public class OSSUtil {
    private static Logger logger = LoggerFactory.getLogger(OSSUtil.class);

    @Autowired
    private OSSProperties ossProperties;
}

获取oss客户端实例

   /**
    * 获取oss客户端实例
    * @return
    */
   public OSS getOSSClient(){
       // 创建OSSClient实例。
       OSS ossClient = new OSSClientBuilder().build(
               ossProperties.getEndpoint(),
               ossProperties.getAccessKeyId(),
               ossProperties.getAccessKeySecret());
       return  ossClient;
   }

关闭oss客户端实例

   /**
    * 关闭oss客户端实例
    * @param ossClient
    */
   public void shutdown(OSS ossClient){
       ossClient.shutdown();
   }

上传文本


   /**
    *  上传文本
    * @param ossKey
    * @param content
    */
   public void putObject( String ossKey, String content){
       // 创建OSSClient实例。
       OSS ossClient = new OSSClientBuilder().build(ossProperties.getEndpoint(), ossProperties.getAccessKeyId(),
               ossProperties.getAccessKeySecret());
       // 创建PutObjectRequest对象。
       // 填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。
       PutObjectRequest putObjectRequest = new PutObjectRequest(ossProperties.getBucketName(), ossKey, new ByteArrayInputStream(content.getBytes()));

       // 上传字符串。
       ossClient.putObject(putObjectRequest);
       // 关闭OSSClient。
       ossClient.shutdown();

   }

追加写入oss,循环调用


   /**
    * 追加写入oss,循环调用
    * @param ossClient
    * @param ossKey
    * @param list 数据list
    * @return
    */
   public void appendToOss(OSS ossClient, String ossKey, String TsvTitles, List<String> list) throws SocketException {

       String content = list.stream().collect(Collectors.joining("\n")) +"\n";
       logger.info("数据写入oss start--------->name:{},size:{}",  ossKey , list.size());
       //文件是否已存在
       boolean objectExist = ossClient.doesObjectExist(ossProperties.getBucketName(), ossKey);
       long position = 0L;
       //如果文件存在,取文件最后位置
       if ( objectExist ){
           ObjectMetadata objectMetadata = ossClient.getObjectMetadata(ossProperties.getBucketName(), ossKey);
           position = objectMetadata.getContentLength();
       }else{
           //文件不存在,添加标题
           content = TsvTitles + "\n" + content;
       }

       ObjectMetadata meta = new ObjectMetadata();
       // 指定上传的内容类型。
       meta.setContentType("text/plain");
       // 要存入oss的内容

       // 通过AppendObjectRequest设置多个参数。
       AppendObjectRequest appendObjectRequest = new AppendObjectRequest(ossProperties.getBucketName(), ossKey,
               new ByteArrayInputStream(content.getBytes()),meta);
       // 设置文件的追加位置。
       appendObjectRequest.setPosition(position);
       ossClient.appendObject(appendObjectRequest);
       logger.info("数据写入oss end --------->name:{},size:{}",  ossKey , list.size());

   }

追加写入oss,单次调用

   /**
    * 追加写入oss,单次调用
    * @param ossKey
    * @param list 数据list
    * @return
    */
   public void appendToOss(String ossKey, String TsvTitles, List<String> list) throws SocketException {
       String content = list.stream().collect(Collectors.joining("\n")) +"\n";
       logger.info("数据写入oss start--------->name:{},size:{}",  ossKey , list.size());

       // 创建OSSClient实例。
   	OSS ossClient = new OSSClientBuilder().build(ossProperties.getEndpoint(), ossProperties.getAccessKeyId(),
   			ossProperties.getAccessKeySecret());
       //文件是否已存在
       boolean objectExist = ossClient.doesObjectExist(ossProperties.getBucketName(), ossKey);
       long position = 0L;
       //如果文件存在,取文件最后位置
       if ( objectExist ){
           ObjectMetadata objectMetadata = ossClient.getObjectMetadata(ossProperties.getBucketName(), ossKey);
           position = objectMetadata.getContentLength();
       }else{
           //文件不存在,添加标题
           content = TsvTitles + "\n" + content;
       }

       ObjectMetadata meta = new ObjectMetadata();
       // 指定上传的内容类型。
       meta.setContentType("text/plain");
       // 要存入oss的内容

       // 通过AppendObjectRequest设置多个参数。
       AppendObjectRequest appendObjectRequest = new AppendObjectRequest(ossProperties.getBucketName(), ossKey,
               new ByteArrayInputStream(content.getBytes()),meta);
       // 设置文件的追加位置。
       appendObjectRequest.setPosition(position);
       ossClient.appendObject(appendObjectRequest);
       // 关闭OSSClient。
   	ossClient.shutdown();
       logger.info("数据写入oss end --------->name:{},size:{}",  ossKey , list.size());

   }

获取oss文件,并转为 List

   /**
    * 获取oss文件,并转为 List<String>
    * @param ossKey
    * @return
    */
   public List<String> getOSSList(String ossKey){
       logger.info("oss --------->ossKey:{}",  ossKey );
       ArrayList<String> resultList = new ArrayList<>();
       // 创建OSSClient实例。
       OSS ossClient = new OSSClientBuilder().build(ossProperties.getEndpoint(), ossProperties.getAccessKeyId(),
               ossProperties.getAccessKeySecret());
       try{
           //文件是否已存在
           boolean objectExist = ossClient.doesObjectExist(ossProperties.getBucketName(), ossKey);
           //如果文件存在,取文件最后位置
           if ( objectExist ){
               OSSObject ossObject = ossClient.getObject(ossProperties.getBucketName(), ossKey);
               BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()));
               while (true) {
                   String line = reader.readLine();
                   if (line == null) {
                       break;
                   }
                   resultList.add(line);
               }
               // 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
               reader.close();
               ossObject.close();
           }
       } catch (IOException e){
           logger.error(e.getMessage());
       } finally {
           ossClient.shutdown();
       }

       return resultList;

   }

查询目录下文件名称列表

   /**
    * 查询目录下文件名称列表
    * @param ossClient
    * @param KeyPrefix
    * @return
    */
   public List<String> getObjectKeyList(OSS ossClient, String KeyPrefix){
       List<String> objectList  = new ArrayList<>();
       // 列举所有包含指定前缀的文件
       String nextMarker = null;
       ObjectListing objectListing = null;
       do {
           ListObjectsRequest listObjectsRequest = new ListObjectsRequest(ossProperties.getBucketName())
                   .withPrefix(KeyPrefix)
                   .withMarker(nextMarker);
           //默认每次返回100条
           objectListing = ossClient.listObjects(listObjectsRequest);
           if (objectListing.getObjectSummaries().size() > 0) {
               for (OSSObjectSummary s : objectListing.getObjectSummaries()) {
                   objectList.add(s.getKey());
               }
           }

           nextMarker = objectListing.getNextMarker();
       } while (objectListing.isTruncated());
       return objectList;
   }

查询目录下文件名称集合

   /**
    * 查询目录下文件名称集合
    * @param ossClient
    * @param KeyPrefix
    * @return
    */
   public Set<String> getObjectKeySet(OSS ossClient, String KeyPrefix){
       Set<String> objectKeySet = new HashSet<>();
       // 列举所有包含指定前缀的文件
       String nextMarker = null;
       ObjectListing objectListing = null;
       do {
           ListObjectsRequest listObjectsRequest = new ListObjectsRequest(ossProperties.getBucketName())
                   .withPrefix(KeyPrefix)
                   .withMarker(nextMarker);
           //默认每次返回100条
           objectListing = ossClient.listObjects(listObjectsRequest);
           if (objectListing.getObjectSummaries().size() > 0) {
               for (OSSObjectSummary s : objectListing.getObjectSummaries()) {
                   objectKeySet.add(s.getKey());
               }
           }

           nextMarker = objectListing.getNextMarker();
       } while (objectListing.isTruncated());
       return objectKeySet;
   }

删除文件或目录

   /**
    * 删除文件或目录
    * 如果要删除目录,目录必须为空。
    * @param ossClient
    * @param ossKey
    */
   public void deleteObject(OSS ossClient, String ossKey){
       // 删除文件或目录。如果要删除目录,目录必须为空。
       ossClient.deleteObject(ossProperties.getBucketName(), ossKey);

   }

批量删除文件(最多1000条)

   /**
    * 批量删除文件(最多1000条)
    * @param ossClient
    * @param keys
    */
   public void deleteObjects(OSS ossClient, List<String> keys){
       DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(ossProperties.getBucketName()).withKeys(keys));
       deleteObjectsResult.getDeletedObjects();
   }

批量删除文件,按文件修改时间,删除reserveDayNum天前的文件。

   /**
    * 批量删除文件
    * 按文件修改时间,删除reserveDayNum天前的文件。
    * @param ossClient
    * @param KeyPrefix 文件前缀
    * @param reserveDayNum 文件保留天数
    */
   public void deleteObjects(OSS ossClient, String KeyPrefix, int reserveDayNum){
       //数据保留的日期
       Calendar calendar = Calendar.getInstance();
       calendar.add(Calendar.DATE, -reserveDayNum);
       Date reserveDate = calendar.getTime();

       // 列举所有包含指定前缀的文件并删除。
       String nextMarker = null;
       ObjectListing objectListing = null;
       do {
           ListObjectsRequest listObjectsRequest = new ListObjectsRequest(ossProperties.getBucketName())
                   .withPrefix(KeyPrefix)
                   .withMarker(nextMarker);

           objectListing = ossClient.listObjects(listObjectsRequest);
           if (objectListing.getObjectSummaries().size() > 0) {
               List<String> keys = new ArrayList<String>();
               for (OSSObjectSummary s : objectListing.getObjectSummaries()) {
                   //通过文件的最后修改时间判断
                   Date LastModified = s.getLastModified();
                   if(LastModified.getTime() < reserveDate.getTime()){
                       keys.add(s.getKey());
                       logger.info("=====================del key:{}",s.getKey());
                   }
               }
               if(keys.size() > 0){
                   DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(ossProperties.getBucketName()).withKeys(keys);
                   ossClient.deleteObjects(deleteObjectsRequest);
               }

           }

           nextMarker = objectListing.getNextMarker();
       } while (objectListing.isTruncated());
   }

获取oss文件,并转为 List

   /**
    * 获取oss文件,并转为 List<DialogueRecord>
    * @param ossClient
    * @param ossKey
    * @return
    */
   public List<DialogueRecord> getOSSData(OSS ossClient, String ossKey){
       List<DialogueRecord> dialogueRecordList = new ArrayList<>();
       logger.info("oss --------->ossKey:{}",  ossKey );
       try{
           //文件是否已存在
           boolean objectExist = ossClient.doesObjectExist(ossProperties.getBucketName(), ossKey);
           //如果文件存在,取文件最后位置
           if ( objectExist ){
               OSSObject ossObject = ossClient.getObject(ossProperties.getBucketName(), ossKey);
               BufferedReader reader = new BufferedReader(new InputStreamReader(ossObject.getObjectContent()));
               int i = 0;
               String titles = "";
               while (true) {
                   String line = reader.readLine();
                   if (line == null) {
                       break;
                   }
                   i++;
                   //首行为标题
                   if( i == 1 ){
                       titles = line;
                       continue;
                   }
                   DialogueRecord dialogueRecord = tsvToObject(titles, line);
                   dialogueRecordList.add(dialogueRecord);
                   //logger.info("dialogueRecord--->ProId:{},ProName:{},Query:{}",dialogueRecord.getProId(),dialogueRecord.getProName(),dialogueRecord.getQuery());

               }
               // 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。
               reader.close();
               ossObject.close();
           }
       } catch (IOException e){
           logger.error(e.getMessage());
       } catch (InvocationTargetException e){
           logger.error(e.getMessage());
       } catch (IllegalAccessException e){
           logger.error(e.getMessage());
       }
       return dialogueRecordList;

   }
   /**
    * 将tsv转为object
    * @param titlesStr
    * @param content
    * @return
    */
   private DialogueRecord tsvToObject(String titlesStr, String content)
           throws InvocationTargetException, IllegalAccessException {
       HashMap dataMap = new HashMap<String, String>();
       String[] titles = titlesStr.split("\t",-1);
       String[] cols = content.split("\t",-1);
       //tsv 转map
       for (int i = 0; i < titles.length ; i++) {
           dataMap.put(titles[i],cols[i]);
       }
       DialogueRecord dialogueRecord = new DialogueRecord();
       //map 转 object
       BeanUtils.populate(dialogueRecord,dataMap);
       return dialogueRecord;
   }

}

### JavaOSS工具类的实现与使用 在Java中,对象存储服务(OSS)通常用于文件的上传、下载和管理。阿里云提供了专门的SDK来简化这一过程[^2]。以下是一个典型的OSS工具类实现及其使用方法。 #### 工具类实现 ```java import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.aliyun.oss.model.PutObjectRequest; public class OSSUtil { private static final String ENDPOINT = "your-endpoint"; // 替换为实际的OSS Endpoint private static final String ACCESS_KEY_ID = "your-access-key-id"; // 替换为实际的Access Key ID private static final String ACCESS_KEY_SECRET = "your-access-key-secret"; // 替换为实际的Access Key Secret private static final String BUCKET_NAME = "your-bucket-name"; // 替换为实际的Bucket名称 /** * 上传文件到OSS * * @param localFilePath 文件本地路径 * @param ossFilePath 文件在OSS中的路径 */ public static void uploadFile(String localFilePath, String ossFilePath) { OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET); try { PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKET_NAME, ossFilePath, new File(localFilePath)); ossClient.putObject(putObjectRequest); } catch (Exception e) { e.printStackTrace(); } finally { ossClient.shutdown(); } } /** * 下载文件从OSS * * @param ossFilePath 文件在OSS中的路径 * @param localFilePath 文件保存的本地路径 */ public static void downloadFile(String ossFilePath, String localFilePath) { OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET); try { ossClient.getObject(BUCKET_NAME, ossFilePath, new File(localFilePath)); } catch (Exception e) { e.printStackTrace(); } finally { ossClient.shutdown(); } } } ``` 上述代码中,`uploadFile` 方法实现了将本地文件上传至OSS的功能,而 `downloadFile` 方法则实现了从OSS下载文件至本地的功能。 #### 使用示例 以下是如何使用上述工具类的示例: ```java public class Main { public static void main(String[] args) { // 上传文件 String localFilePath = "/path/to/local/file.txt"; String ossFilePath = "file.txt"; OSSUtil.uploadFile(localFilePath, ossFilePath); // 下载文件 String downloadedLocalFilePath = "/path/to/save/downloaded_file.txt"; OSSUtil.downloadFile(ossFilePath, downloadedLocalFilePath); } } ``` 确保在项目中添加阿里云OSS SDK的Maven依赖: ```xml <dependency> <groupId>com.aliyun.oss</groupId> <artifactId>aliyun-sdk-oss</artifactId> <version>3.10.2</version> </dependency> ``` 通过以上步骤,可以轻松实现基于JavaOSS文件操作功能。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liutao5459

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值