记录一下 csv 文件上传下载至 oss 工具类

本文介绍了一个用于处理CSV文件的实用工具类CsvUtil,该工具类提供了从CSV文件解析数据到Java Bean对象以及将Java Bean对象集合转换为CSV文件的功能。通过使用标准Charsets.UTF_8编码,处理BOM头,并利用opencsv库,CsvUtil确保了数据的准确读取与写入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.List;
import com.opencsv.CSVWriter;
import com.opencsv.bean.*;
import lombok.extern.slf4j.Slf4j;


/**
 * CsvUtil
 * 
 * @author xiaofeifei
 * @date 2020-06-12 20:45
 */
@Slf4j
public final class CsvUtil {

    /**
     * 解析csv文件并转成bean
     * 
     * @param in csv文件
     * @param clazz 类
     * @param <T> 泛型
     * @return 泛型bean集合
     */
    public static <T> List<T> getCsvData(InputStream in, Class<T> clazz) {
        InputStreamReader reader = null;
        try {
            reader = new InputStreamReader(CsvUtil.getInputStream(in), StandardCharsets.UTF_8);
        } catch (IOException e) {
           log.error(e.getMessage(), e);
            SystemException.doThrow("解析csv文件异常");
        }

        HeaderColumnNameMappingStrategy<T> mappingStrategy = new HeaderColumnNameMappingStrategy<>();
        mappingStrategy.setType(clazz);
        CsvToBean<T> build = new CsvToBeanBuilder<T>(reader).withMappingStrategy(mappingStrategy).withSeparator(',').build();
        return build.parse();
    }

    /**
     * 读取流中前面的字符,看是否有bom,如果有bom,将bom头先读掉丢弃
     *  (opencsv 按列名获取bean对象,第一列缺失的情况)
     *  InputStreamReader is = new InputStreamReader(
     *  CsvUtil.getInputStream(new  FileInputStream(fileName)), "utf-8");
     * @param in
     * @return
     * @throws IOException
     */
    public static InputStream getInputStream(InputStream in) throws IOException {

        PushbackInputStream testin = new PushbackInputStream(in);
        int ch = testin.read();
        if (ch != 0xEF) {
            testin.unread(ch);
        } else if ((ch = testin.read()) != 0xBB) {
            testin.unread(ch);
            testin.unread(0xef);
        } else if ((ch = testin.read()) != 0xBF) {
            throw new IOException("错误的UTF-8格式文件");
        } else {
        }
        return testin;
    }

    /**
     * 将前台传递的数据生成csv文件
     * @param exportResults
     * @param header
     */
    public static<T> InputStream upload(List<T> exportResults, File tempFile, String[] header) {
        // 创建临时文件
        CSVWriter csvWriter = null;
        Writer writer = null;
        try {
            writer = new FileWriter(tempFile);
            // 写表头
            csvWriter = new CSVWriter(writer, CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.NO_ESCAPE_CHARACTER, CSVWriter.DEFAULT_LINE_END);
            csvWriter.writeNext(header);
            //写内容
            StatefulBeanToCsv<T> beanToCsv = new StatefulBeanToCsvBuilder<T>(writer).build();
            beanToCsv.write(exportResults);
            // 写出到临时文件完成后,读取此临时文件
            return new FileInputStream(tempFile);
        } catch (Exception e) {
            log.error("csv文件上传失败");
            log.error(e.getMessage(), e);
        } finally {
            try {
                assert csvWriter != null;
                csvWriter.close();
                writer.close();
            } catch (Exception e) {
                log.error(e.getMessage(), e);
            }
        }
        return null;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值