java - 使用 openCsv StatefulBeanToCSV 限制 CSV 文件大小
问题描述
我有一个对象列表,比如说我从 Db 获得的产品列表。我能够使用 openCSV StatefulBeanToCSV 写入器将这些列表写入 CSV 文件以获取 0.5M 记录,将数据写入 CSV 文件需要不到 10 秒的时间。但问题是 StatefulBeanToCSV 将所有这些 0.5M 记录写入单个 CSV 文件,其大小变大了..所以我需要一种将 CSV 文件限制为 20Mb 的方法。如果 CSV 文件的大小达到 20mb,我需要 StatefulBeanToCSV 来写入新的 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());
}
}
解决方案
这可能不是最好的方法,但您可以简单地检查一个Product
对象的大小,然后您将对可以写入一个 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;
}
推荐阅读
- javascript - 更改 html 文件中的所有链接以添加域 url
- r - 使用 R 自定义字段的 trello API
- angular - 当用户离开页面时,Angular 7 会从警卫中启动一个警报组件以通知
- javascript - 如何从 JavaScript 中的 select 选项中获取相应文本的值?
- realm - 如何在 Elytron Wildfly 17 中使用 jdbc 领域对用户进行身份验证?
- mysql - 谁能帮我理解这段 SQL 代码?
- javascript - react-router-dom 链接不会将用户推送到新链接
- oracle - 根据空格将字符串拆分为 3 部分
- postgresql - 正则表达式 | 在字符串末尾添加 3 个字符
- mysql - 没有唯一值的 SQL 连接表