Java 使用openCsv StatefulBeanToCSV限制CSV文件大小

Java 使用openCsv StatefulBeanToCSV限制CSV文件大小,java,spring-boot,csv,opencsv,supercsv,Java,Spring Boot,Csv,Opencsv,Supercsv,我有一个对象列表,比如说我从数据库中得到的产品列表。我可以使用openCSV StatefleBeantoCSV writer将这些列表写入CSV文件,对于0.5M记录,将数据写入CSV文件只需不到10秒。。但问题是StatefleBeanToCSV将所有0.5M记录写入一个CSV文件,该文件的大小会变大。。所以我需要一种方法将CSV文件限制为20Mb。如果CSV文件的大小达到20mb,我需要StatefleBeanToCSV来写入新的CSV文件。非常感谢您的帮助 public static v

我有一个对象列表,比如说我从数据库中得到的产品列表。我可以使用openCSV StatefleBeantoCSV writer将这些列表写入CSV文件,对于0.5M记录,将数据写入CSV文件只需不到10秒。。但问题是StatefleBeanToCSV将所有0.5M记录写入一个CSV文件,该文件的大小会变大。。所以我需要一种方法将CSV文件限制为20Mb。如果CSV文件的大小达到20mb,我需要StatefleBeanToCSV来写入新的CSV文件。非常感谢您的帮助

public static void buildProductCsv(final List<Product> product,
                final String filePath) {

            try {

                Writer writer = new FileWriter(filePath);

                // mapping of columns with their positions
                ColumnPositionMappingStrategy<Product> mappingStrategy = new ColumnPositionMappingStrategy<Product>();
                // Set mappingStrategy type to Product Type
                mappingStrategy.setType(Product.class);
                // Fields in Product Bean
                String[] columns = new String[] { "productCode", "MFD", "EXD" };
                // Setting the colums for mappingStrategy
                mappingStrategy.setColumnMapping(columns);

                StatefulBeanToCsvBuilder<Product> builder = new StatefulBeanToCsvBuilder<Product>(writer);

                StatefulBeanToCsv<Product> beanWriter = builder.withMappingStrategy(mappingStrategy).build();
                // Writing data to csv file
                beanWriter.write(product);
                writer.close();

                log.info("Your csv file has been generated!");

            } catch (Exception ex) {
                log.warning("Exception: " + ex.getMessage());
            }

        }
publicstaticvoidbuildproductcsv(最终列表产品,
最终字符串(文件路径){
试一试{
Writer Writer=新文件编写器(文件路径);
//列及其位置的映射
ColumnPositionMappingStrategy mappingStrategy=新ColumnPositionMappingStrategy();
//将映射策略类型设置为产品类型
mappingStrategy.setType(Product.class);
//产品Bean中的字段
字符串[]列=新字符串[]{“productCode”、“MFD”、“EXD”};
//设置映射策略的列
mappingStrategy.setColumnMapping(列);
StatefulBeanToCsvBuilder builder=新StatefulBeanToCsvBuilder(编写器);
StatefulBeanToCsv beanWriter=builder.withMappingStrategy(mappingStrategy).build();
//将数据写入csv文件
beanWriter.write(产品);
writer.close();
log.info(“您的csv文件已生成!”);
}捕获(例外情况除外){
警告(“异常:+ex.getMessage());
}
}

这可能不是最好的方法,但您可以简单地检查一个
产品
对象的大小,然后您将对可以写入一个CSV的最大子列表大小有一个抽象的概念。然后您可以迭代列表,创建多个CSV文件

要获得一种产品的尺寸,可以使用以下方法。请注意,
Product
对象应该是可序列化的

  private static long getObjectSize( Object value ) // Pass product here
  {
    byte[] serializedObject;
    ByteArrayOutputStream byteArrayOutputStream = null;
    ObjectOutputStream objectOutputStream = null;

    try
    {
        byteArrayOutputStream = new ByteArrayOutputStream();
        objectOutputStream = new ObjectOutputStream( byteArrayOutputStream );
        objectOutputStream.writeObject( value );
        objectOutputStream.flush();
        serializedObject = byteArrayOutputStream.toByteArray();
        byteArrayOutputStream.flush();

        return Math.round( ( double ) serializedObject.length / ( 1024 * 1024 ) ); // Size in MB
    }
    catch( IOException e )
    {
        e.printStackTrace();
    }
    finally
    {
        try
        {
            if( byteArrayOutputStream != null )
            {
                byteArrayOutputStream.close();
            }
            if( objectOutputStream != null )
            {
                objectOutputStream.close();
            }
        }
        catch( IOException e )
        {
        }
    }
    return 0;
}

这可能不是最好的方法,但您可以简单地检查一个
产品
对象的大小,然后您将对可以写入一个CSV的最大子列表大小有一个抽象的概念。然后您可以迭代列表,创建多个CSV文件

要获得一种产品的尺寸,可以使用以下方法。请注意,
Product
对象应该是可序列化的

  private static long getObjectSize( Object value ) // Pass product here
  {
    byte[] serializedObject;
    ByteArrayOutputStream byteArrayOutputStream = null;
    ObjectOutputStream objectOutputStream = null;

    try
    {
        byteArrayOutputStream = new ByteArrayOutputStream();
        objectOutputStream = new ObjectOutputStream( byteArrayOutputStream );
        objectOutputStream.writeObject( value );
        objectOutputStream.flush();
        serializedObject = byteArrayOutputStream.toByteArray();
        byteArrayOutputStream.flush();

        return Math.round( ( double ) serializedObject.length / ( 1024 * 1024 ) ); // Size in MB
    }
    catch( IOException e )
    {
        e.printStackTrace();
    }
    finally
    {
        try
        {
            if( byteArrayOutputStream != null )
            {
                byteArrayOutputStream.close();
            }
            if( objectOutputStream != null )
            {
                objectOutputStream.close();
            }
        }
        catch( IOException e )
        {
        }
    }
    return 0;
}

也许这有助于回答你的问题?也许这有助于回答你的问题?