Ограничьте размер файла CSV с помощью openCsv StatefulBeanToCSV

У меня есть список объектов, скажем, список продуктов, которые я получаю из своего БД. Я могу записать этот список в файл CSV, используя средство записи openCSV StatefulBeanToCSV для записей 0,5 млн. Для записи данных в файл CSV требуется менее 10 секунд. Но проблема в том, что StatefulBeanToCSV записывает все эти записи 0,5 млн. в один файл CSV, размер которого становится больше .. поэтому мне нужен способ ограничить файл CSV до 20 МБ. Если размер CSV-файла достигает 20 МБ, мне нужно, чтобы 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());
            }

        }

person ninja_warrior1991    schedule 18.04.2020    source источник
comment
возможно, это поможет ссылка   -  person Amir Schnell    schedule 18.04.2020
comment
Отвечает ли это на ваш вопрос? Ограничить размер файла при записи в java   -  person Amir Schnell    schedule 18.04.2020


Ответы (1)


Возможно, это не лучший подход, но вы можете просто проверить размер одного объекта 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;
}
person Klaus    schedule 18.04.2020