#java #spring-boot #csv
Вопрос:
public void createCSV(Map<String, Object> map) {
String reportPath = "C:/Users/nandini/Desktop/file.csv";
try {
FileWriter fileWriter = new FileWriter(reportPath);
CSVWriter csvWriter = new CSVWriter(fileWriter,
CSVWriter.DEFAULT_SEPARATOR,
CSVWriter.NO_QUOTE_CHARACTER,
CSVWriter.DEFAULT_ESCAPE_CHARACTER,
CSVWriter.DEFAULT_LINE_END);
String[] header = map.keySet().toArray(new String[map.size()]);
Object[] data = map.values().toArray(new Object[map.size()]);
String[] stringArray = Arrays.copyOf(data, data.length, String[].class);
// adding data to csv
csvWriter.writeNext(header);
csvWriter.writeNext(stringArray);
csvWriter.close();
} catch (Exception e) {
logger.error(e);
}
}
Комментарии:
1. Не каждый ценный объект был а
String
. Вы не можете предполагать иного. Вы должны протестировать или использоватьString.valueOf()
.
Ответ №1:
Это происходит из-за следующей строки:
String[] stringArray = Arrays.copyOf(data, data.length, String[].class);
Метод Javadoc утверждает, что метод выдает, ArrayStoreException
если элемент, скопированный из оригинала, не относится к типу среды выполнения, который может быть сохранен в массиве класса newType.
Поэтому , если Object[]
массив содержит элемент, который не является элементом a String
, это исключение будет выдано. Вместо приведения элемента к a String
, вы можете получить его строковое представление с помощью toString()
метода:
String[] stringArray = Arrays.stream(data)
.map(Object::toString)
.toArray(size -> new String[size]);
Редактировать:
Без потоков…
String[] stringArray = new String[data.length];
for (int i = 0; i < data.length; i ) {
stringArray[i] = data[i].toString();
}
Комментарии:
1. не могли бы вы, пожалуйста, рассказать мне, как писать на java1.7
2. @nandini Просто сделайте простой цикл над
Object[]
массивом и назначьте каждому объектуtoString()
String[]
массив. Я рекомендую вам попробовать написать его самостоятельно, так будет намного лучше 🙂