Java 使用openCsv StatefulBeanToCSV限制CSV文件大小
我有一个对象列表,比如说我从数据库中得到的产品列表。我可以使用openCSV StatefleBeantoCSV writer将这些列表写入CSV文件,对于0.5M记录,将数据写入CSV文件只需不到10秒。。但问题是StatefleBeanToCSV将所有0.5M记录写入一个CSV文件,该文件的大小会变大。。所以我需要一种方法将CSV文件限制为20Mb。如果CSV文件的大小达到20mb,我需要StatefleBeanToCSV来写入新的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
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;
}
也许这有助于回答你的问题?也许这有助于回答你的问题?