原文:http://zetcode.com/articles/opencsv/

在 Opencsv 教程中,我们展示了如何与 Opencsv 库一起使用,该库用于在 Java 中读写 CSV 文件。 我们提供了一些代码示例,可在 Java 中使用 CSV。 该教程的源代码也可以从作者的 Github 仓库中获得。

CSV(逗号分隔值)格式是在电子表格和数据库中使用的非常流行的导入和导出格式。

CSV 文件中的每一行都是一个数据记录。 每个记录由一个或多个字段组成,用逗号分隔。 尽管 CSV 格式是一种非常简单的格式,但还是有许多差异,例如不同的定界符,换行或引号字符。

Opencsv 库

Opencsv 是一个非常简单的 Java CSV 解析器库。 它的开发是由于缺乏商业友好许可证。

  1. <dependencies>
  2. <dependency>
  3. <groupId>com.opencsv</groupId>
  4. <artifactId>opencsv</artifactId>
  5. <version>4.1</version>
  6. </dependency>
  7. </dependencies>

这是 Opencsv 的 Maven 依赖关系。

OpenCSV 读取数据

以下示例从 CSV 文件读取数字。

  1. $ tree
  2. .
  3. ├── nbactions.xml
  4. ├── pom.xml
  5. └── src
  6. ├── main
  7. ├── java
  8. └── com
  9. └── zetcode
  10. └── OpenCSVReadEx.java
  11. └── resources
  12. └── numbers.csv
  13. └── test
  14. └── java

这是项目结构。

numbers.csv

  1. 3,5,6,2,1,7,8
  2. 4,5,7,3,2,8,9

numbers.csv文件中有两个数据记录。

OpenCSVReadEx.java

  1. package com.zetcode;
  2. import com.opencsv.CSVReader;
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.nio.charset.StandardCharsets;
  7. public class OpenCSVReadEx {
  8. public static void main(String[] args) throws IOException {
  9. String fileName = "src/main/resources/numbers.csv";
  10. try (FileInputStream fis = new FileInputStream(fileName);
  11. InputStreamReader isr = new InputStreamReader(fis,
  12. StandardCharsets.UTF_8);
  13. CSVReader reader = new CSVReader(isr)) {
  14. String[] nextLine;
  15. while ((nextLine = reader.readNext()) != null) {
  16. for (String e : nextLine) {
  17. System.out.format("%s ", e);
  18. }
  19. }
  20. }
  21. }
  22. }

该示例从numbers.csv文件中读取数字并将其打印到控制台。

  1. String fileName = "src/main/resources/numbers.csv";

该文件位于src/main/resources目录中。

  1. try (FileInputStream fis = new FileInputStream(fileName);
  2. InputStreamReader isr = new InputStreamReader(fis,
  3. StandardCharsets.UTF_8);
  4. CSVReader reader = new CSVReader(isr)) {

CSVReader是用于读取 CSV 文件的类。

  1. while ((nextLine = reader.readNext()) != null) {
  2. for (String e: nextLine) {
  3. System.out.format("%s ", e);
  4. }
  5. }

我们遍历读取器并将值打印到终端。 readNext()方法从缓冲区读取下一行,并转换为字符串数组。

  1. 3 5 6 2 1 7 8 4 5 7 3 2 8 9

这是程序的输出。

使用不同的分隔符的 OpenCSV 读取

尽管有 CSV 文件的名称,但也可以用逗号以外的分隔符分隔 CSV 文件。 下面的示例显示如何读取由竖线分隔的数字字符。

此示例使用 Gradle 工具构建。

  1. $ tree
  2. .
  3. ├── build.gradle
  4. ├── settings.gradle
  5. └── src
  6. ├── main
  7. ├── java
  8. └── com
  9. └── zetcode
  10. └── OpenCSVReadEx2.java
  11. └── resources
  12. └── numbers.csv
  13. └── test
  14. ├── java
  15. └── resources

我们展示了项目结构。

settings.gradle

  1. rootProject.name = 'OpenCSVReadEx2'

这是 Gradle 设置文件。

build.gradle

  1. apply plugin: 'application'
  2. archivesBaseName = "readnumbers2"
  3. version = '1.0'
  4. mainClassName = "com.zetcode.OpenCSVReadEx2"
  5. sourceCompatibility = '1.8'
  6. compileJava.options.encoding = 'UTF-8'
  7. repositories {
  8. mavenCentral()
  9. }
  10. dependencies {
  11. compile group: 'com.opencsv', name: 'opencsv', version: '4.1'
  12. }

这是 Gradle 构建文件。

numbers.csv

  1. 1|2|3|4|5
  2. 6|7|3|9|8
  3. 9|1|1|0|2

我们有三行数字,中间用|分隔。 字符。

OpenCSVReadEx2.java

  1. package com.zetcode;
  2. import com.opencsv.CSVParser;
  3. import com.opencsv.CSVParserBuilder;
  4. import com.opencsv.CSVReader;
  5. import com.opencsv.CSVReaderBuilder;
  6. import java.io.BufferedReader;
  7. import java.io.IOException;
  8. import java.nio.charset.StandardCharsets;
  9. import java.nio.file.Files;
  10. import java.nio.file.Path;
  11. import java.nio.file.Paths;
  12. import java.util.List;
  13. public class OpenCSVReadEx2 {
  14. public static void main(String[] args) throws IOException {
  15. String fileName = "src/main/resources/numbers.csv";
  16. Path myPath = Paths.get(fileName);
  17. CSVParser parser = new CSVParserBuilder().withSeparator('|').build();
  18. try (BufferedReader br = Files.newBufferedReader(myPath,
  19. StandardCharsets.UTF_8);
  20. CSVReader reader = new CSVReaderBuilder(br).withCSVParser(parser)
  21. .build()) {
  22. List<String[]> rows = reader.readAll();
  23. for (String[] row : rows) {
  24. for (String e : row) {
  25. System.out.format("%s ", e);
  26. }
  27. System.out.println();
  28. }
  29. }
  30. }
  31. }

该示例从numbers.csv文件中读取值,并将其打印到控制台。

  1. CSVParser parser = new CSVParserBuilder().withSeparator('|').build();

创建具有特定解析器字符的CSVParser

  1. try (BufferedReader br = Files.newBufferedReader(myPath,
  2. StandardCharsets.UTF_8);
  3. CSVReader reader = new CSVReaderBuilder(br).withCSVParser(parser)
  4. .build()) {

CSVReaderBuilder创建一个CSVReader

  1. List<String[]> rows = reader.readAll();

我们使用readAll()方法将所有元素读入列表中。 此方法不应用于大文件。

  1. $ gradle build
  2. $ gradle run
  3. :compileJava UP-TO-DATE
  4. :processResources UP-TO-DATE
  5. :classes UP-TO-DATE
  6. :run
  7. 1 2 3 4 5
  8. 6 7 3 9 8
  9. 9 1 1 0 2

我们构建并运行该示例。

OpenCSV 写入数据

CSVWriter类用于将数据写入 CSV 文件。

OpenCSVWriteEx.java

  1. package com.zetcode;
  2. import com.opencsv.CSVWriter;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.OutputStreamWriter;
  6. import java.nio.charset.StandardCharsets;
  7. public class OpenCSVWriteEx {
  8. public static void main(String[] args) throws IOException {
  9. String[] entries = { "book", "coin", "pencil", "cup" };
  10. String fileName = "src/main/resources/items.csv";
  11. try (FileOutputStream fos = new FileOutputStream(fileName);
  12. OutputStreamWriter osw = new OutputStreamWriter(fos,
  13. StandardCharsets.UTF_8);
  14. CSVWriter writer = new CSVWriter(osw)) {
  15. writer.writeNext(entries);
  16. }
  17. }
  18. }

该示例将数据从数组写入items.csv文件。 该文件将写入项目根目录。 writeNext()方法将元素数组写入文件。

在下一个代码示例中,我们将所有数据一次性写入。

OpenCSVWriteEx2.java

  1. package com.zetcode;
  2. import com.opencsv.CSVWriter;
  3. import java.io.FileOutputStream;
  4. import java.io.IOException;
  5. import java.io.OutputStreamWriter;
  6. import java.nio.charset.StandardCharsets;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. public class OpenCSVWriteEx2 {
  10. public static void main(String[] args) throws IOException {
  11. String[] items1 = {"book", "coin", "pencil"};
  12. String[] items2 = {"pen", "chair", "lamp"};
  13. String[] items3 = {"ball", "bowl", "spectacles"};
  14. List<String[]> entries = new ArrayList<>();
  15. entries.add(items1);
  16. entries.add(items2);
  17. entries.add(items3);
  18. String fileName = "src/main/resources/items.csv";
  19. try (FileOutputStream fos = new FileOutputStream(fileName);
  20. OutputStreamWriter osw = new OutputStreamWriter(fos,
  21. StandardCharsets.UTF_8);
  22. CSVWriter writer = new CSVWriter(osw)) {
  23. writer.writeAll(entries);
  24. }
  25. }
  26. }

该示例使用writeAll()方法将数组列表写入items.csv文件。

将 SQL 数据转换为 CSV 文件

以下示例从数据库表中检索数据并将其写入 CSV 文件。 我们使用 MySQL 数据库。 有关 MySQL 和 MySQL Java 编程的更多信息,请参见 MySQL 教程MySQL Java 教程

cars_mysql.sql

  1. -- SQL for the Cars table
  2. CREATE TABLE Cars(Id BIGINT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(150),
  3. Price INTEGER);
  4. INSERT INTO Cars(Name, Price) VALUES('Audi', 52642);
  5. INSERT INTO Cars(Name, Price) VALUES('Mercedes', 57127);
  6. INSERT INTO Cars(Name, Price) VALUES('Skoda', 9000);
  7. INSERT INTO Cars(Name, Price) VALUES('Volvo', 29000);
  8. INSERT INTO Cars(Name, Price) VALUES('Bentley', 350000);
  9. INSERT INTO Cars(Name, Price) VALUES('Citroen', 21000);
  10. INSERT INTO Cars(Name, Price) VALUES('Hummer', 41400);
  11. INSERT INTO Cars(Name, Price) VALUES('Volkswagen', 21600);

这是我们从中检索数据的Cars表。

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  5. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  6. <modelVersion>4.0.0</modelVersion>
  7. <groupId>com.zetcode</groupId>
  8. <artifactId>OpenCSVDatabaseEx</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <packaging>jar</packaging>
  11. <properties>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <maven.compiler.source>1.8</maven.compiler.source>
  14. <maven.compiler.target>1.8</maven.compiler.target>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>com.opencsv</groupId>
  19. <artifactId>opencsv</artifactId>
  20. <version>4.1</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>mysql</groupId>
  24. <artifactId>mysql-connector-java</artifactId>
  25. <version>5.1.45</version>
  26. </dependency>
  27. </dependencies>
  28. </project>

Maven 构建文件包含 Opencsv 和 MySQL 驱动程序的依赖项。

OpenCSVDatabaseEx.java

  1. package com.zetcode;
  2. import com.opencsv.CSVWriter;
  3. import java.io.FileWriter;
  4. import java.io.IOException;
  5. import java.nio.charset.StandardCharsets;
  6. import java.nio.file.Files;
  7. import java.nio.file.Path;
  8. import java.nio.file.Paths;
  9. import java.sql.Connection;
  10. import java.sql.DriverManager;
  11. import java.sql.PreparedStatement;
  12. import java.sql.ResultSet;
  13. import java.sql.SQLException;
  14. import java.util.logging.Level;
  15. import java.util.logging.Logger;
  16. public class OpenCSVDatabaseEx {
  17. public static void main(String[] args) {
  18. String url = "jdbc:mysql://localhost:3306/testdb?useSsl=false";
  19. String user = "testuser";
  20. String password = "test623";
  21. String fileName = "src/main/resources/cars.csv";
  22. Path myPath = Paths.get(fileName);
  23. try (Connection con = DriverManager.getConnection(url, user, password);
  24. PreparedStatement pst = con.prepareStatement("SELECT * FROM Cars");
  25. ResultSet rs = pst.executeQuery()) {
  26. try (CSVWriter writer = new CSVWriter(Files.newBufferedWriter(myPath,
  27. StandardCharsets.UTF_8), CSVWriter.DEFAULT_SEPARATOR,
  28. CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.NO_ESCAPE_CHARACTER,
  29. CSVWriter.DEFAULT_LINE_END)) {
  30. writer.writeAll(rs, true);
  31. }
  32. } catch (SQLException | IOException ex) {
  33. Logger.getLogger(OpenCSVDatabaseEx.class.getName()).log(
  34. Level.SEVERE, ex.getMessage(), ex);
  35. }
  36. }
  37. }

在示例中,我们连接到 MySQL 数据库并从Cars表中检索所有行。 数据被写入cars.csv文件。

  1. try (Connection con = DriverManager.getConnection(url, user, password);
  2. PreparedStatement pst = con.prepareStatement("SELECT * FROM Cars");
  3. ResultSet rs = pst.executeQuery()) {

我们使用驱动程序管理器连接到数据库表,并执行SELECT * FROM Cars语句。

  1. try (CSVWriter writer = new CSVWriter(Files.newBufferedWriter(myPath,
  2. StandardCharsets.UTF_8), CSVWriter.DEFAULT_SEPARATOR,
  3. CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.NO_ESCAPE_CHARACTER,
  4. CSVWriter.DEFAULT_LINE_END)) {

我们创建一个CSVWriter,它带有默认的分隔符,没有引号,没有转义符和默认行尾。

  1. writer.writeAll(rs, true);

writeAll()方法将java.sql.ResultSet作为参数。 第二个参数指定是否应包含字段头。

  1. $ cat cars.csv
  2. ID,NAME,PRICE
  3. 1,Audi,52642
  4. 2,Mercedes,57127
  5. 3,Skoda,9000
  6. 4,Volvo,29000
  7. 5,Bentley,350000
  8. 6,Citroen,21000
  9. 7,Hummer,41400
  10. 8,Volkswagen,21600
  11. 9,Toyota,26700

代码示例将生成此文件。

Opencsv 映射到 JavaBeans

CsvToBean用于将 CSV 数据映射到 JavaBeans。

按列名映射

使用HeaderColumnNameMappingStrategy,我们可以使用 CSV 文件第一行中的列名将 CSV 数据映射到 Java 对象

  1. $ tree
  2. .
  3. ├── nbactions.xml
  4. ├── pom.xml
  5. └── src
  6. ├── main
  7. ├── java
  8. └── com
  9. └── zetcode
  10. ├── bean
  11. └── Car.java
  12. └── OpenCSVReadBeansEx.java
  13. └── resources
  14. └── cars.csv
  15. └── test
  16. └── java

This is the project structure.

cars.csv

  1. ID,NAME,PRICE
  2. 1,Audi,52642
  3. 2,Mercedes,57127
  4. 3,Skoda,9000
  5. 4,Volvo,29000
  6. 5,Bentley,350000
  7. 6,Citroen,21000
  8. 7,Hummer,41400
  9. 8,Volkswagen,21600
  10. 9,Toyota,26700

这是cars.csv文件。 第一条记录包含列名。

Car.java

  1. package com.zetcode.bean;
  2. import com.opencsv.bean.CsvBindByName;
  3. public class Car {
  4. @CsvBindByName
  5. private int id;
  6. @CsvBindByName
  7. private String name;
  8. @CsvBindByName
  9. private int price;
  10. public int getId() {
  11. return id;
  12. }
  13. public void setId(int id) {
  14. this.id = id;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. public int getPrice() {
  23. return price;
  24. }
  25. public void setPrice(int price) {
  26. this.price = price;
  27. }
  28. @Override
  29. public String toString() {
  30. StringBuilder builder = new StringBuilder();
  31. builder.append("Car{id=").append(id).append(", name=")
  32. .append(name).append(", price=").append(price).append("}");
  33. return builder.toString();
  34. }
  35. }

Car是 JavaBean。 它包含@CsvBindByName注解,用于将 bean 属性映射到 CSV 列。

OpenCSVReadBeansEx.java

  1. package com.zetcode;
  2. import com.opencsv.bean.CsvToBean;
  3. import com.opencsv.bean.CsvToBeanBuilder;
  4. import com.opencsv.bean.HeaderColumnNameMappingStrategy;
  5. import com.zetcode.bean.Car;
  6. import java.io.BufferedReader;
  7. import java.io.IOException;
  8. import java.nio.charset.StandardCharsets;
  9. import java.nio.file.Files;
  10. import java.nio.file.Path;
  11. import java.nio.file.Paths;
  12. import java.util.List;
  13. public class OpenCSVReadBeansEx {
  14. public static void main(String[] args) throws IOException {
  15. String fileName = "src/main/resources/cars.csv";
  16. Path myPath = Paths.get(fileName);
  17. try (BufferedReader br = Files.newBufferedReader(myPath,
  18. StandardCharsets.UTF_8)) {
  19. HeaderColumnNameMappingStrategy<Car> strategy
  20. = new HeaderColumnNameMappingStrategy<>();
  21. strategy.setType(Car.class);
  22. CsvToBean csvToBean = new CsvToBeanBuilder(br)
  23. .withType(Car.class)
  24. .withMappingStrategy(strategy)
  25. .withIgnoreLeadingWhiteSpace(true)
  26. .build();
  27. List<Car> cars = csvToBean.parse();
  28. cars.forEach(System.out::println);
  29. }
  30. }
  31. }

该示例从cars.csv文件中读取数据,并将它们映射到Car对象。 它使用HeaderColumnNameMappingStrategy

  1. HeaderColumnNameMappingStrategy<Car> strategy
  2. = new HeaderColumnNameMappingStrategy<>();
  3. strategy.setType(Car.class);

HeaderColumnNameMappingStrategy使用 CSV 文件第一行中的列名将数据映射到对象。 列顺序无关紧要。

  1. CsvToBean csvToBean = new CsvToBeanBuilder(br)
  2. .withType(Car.class)
  3. .withMappingStrategy(strategy)
  4. .withIgnoreLeadingWhiteSpace(true)
  5. .build();

CsvToBeanBuilder创建一个CsvToBean。 我们指定类型和映射策略。

  1. List<Car> cars = csvToBean.parse();

使用CsvToBeanparse()方法,我们将 CSV 数据解析到列表中。

  1. cars.forEach(System.out::println);

我们遍历 bean 列表并将它们打印到控制台。

  1. Car{id=1, name=Audi, price=52642}
  2. Car{id=2, name=Mercedes, price=57127}
  3. Car{id=3, name=Skoda, price=9000}
  4. Car{id=4, name=Volvo, price=29000}
  5. Car{id=5, name=Bentley, price=350000}
  6. Car{id=6, name=Citroen, price=21000}
  7. Car{id=7, name=Hummer, price=41400}
  8. Car{id=8, name=Volkswagen, price=21600}
  9. Car{id=9, name=Toyota, price=26700}

这是示例的输出。

按列位置进行映射

ColumnPositionMappingStrategy按列的位置映射。

cars.csv

  1. 1,Audi,52642
  2. 2,Mercedes,57127
  3. 3,Skoda,9000
  4. 4,Volvo,29000
  5. 5,Bentley,350000
  6. 6,Citroen,21000
  7. 7,Hummer,41400
  8. 8,Volkswagen,21600
  9. 9,Toyota,26700

这是cars.csv文件。

Car.java

  1. package com.zetcode.bean;
  2. import com.opencsv.bean.CsvBindByPosition;
  3. public class Car {
  4. @CsvBindByPosition(position = 0)
  5. private int id;
  6. @CsvBindByPosition(position = 1)
  7. private String name;
  8. @CsvBindByPosition(position = 2)
  9. private int price;
  10. public int getId() {
  11. return id;
  12. }
  13. public void setId(int id) {
  14. this.id = id;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. public int getPrice() {
  23. return price;
  24. }
  25. public void setPrice(int price) {
  26. this.price = price;
  27. }
  28. @Override
  29. public String toString() {
  30. StringBuilder builder = new StringBuilder();
  31. builder.append("Car{id=").append(id).append(", name=")
  32. .append(name).append(", price=").append(price).append("}");
  33. return builder.toString();
  34. }
  35. }

@CsvBindByPosition指定 CSV 输入的列号和 bean 中的字段之间的绑定。

OpenCSVReadBeansEx2.java

  1. package com.zetcode;
  2. import com.opencsv.bean.ColumnPositionMappingStrategy;
  3. import com.opencsv.bean.CsvToBean;
  4. import com.opencsv.bean.CsvToBeanBuilder;
  5. import com.zetcode.bean.Car;
  6. import java.io.BufferedReader;
  7. import java.io.IOException;
  8. import java.nio.charset.StandardCharsets;
  9. import java.nio.file.Files;
  10. import java.nio.file.Path;
  11. import java.nio.file.Paths;
  12. import java.util.List;
  13. public class OpenCSVReadBeansEx2 {
  14. public static void main(String[] args) throws IOException {
  15. String fileName = "src/main/resources/cars.csv";
  16. Path myPath = Paths.get(fileName);
  17. try (BufferedReader br = Files.newBufferedReader(myPath,
  18. StandardCharsets.UTF_8)) {
  19. ColumnPositionMappingStrategy strategy = new ColumnPositionMappingStrategy();
  20. strategy.setType(Car.class);
  21. String[] fields = {"id", "name", "price"};
  22. strategy.setColumnMapping(fields);
  23. CsvToBean csvToBean = new CsvToBeanBuilder(br)
  24. .withType(Car.class)
  25. .withMappingStrategy(strategy)
  26. .withIgnoreLeadingWhiteSpace(true)
  27. .build();
  28. List<Car> cars = csvToBean.parse();
  29. cars.forEach(System.out::println);
  30. }
  31. }
  32. }

该示例从cars.csv文件中读取数据,并将它们映射到Car对象。 它使用ColumnPositionMappingStrategy

  1. ColumnPositionMappingStrategy strategy = new ColumnPositionMappingStrategy();
  2. strategy.setType(Car.class);
  3. String[] fields = {"id", "name", "price"};
  4. strategy.setColumnMapping(fields);

我们创建一个ColumnPositionMappingStrategy。 使用setColumnMapping(),我们设置要映射的列名。

Opencsv 使用StatefulBeanToCsv编写 JavaBeans

在下一个示例中,我们使用StatefulBeanToCsv将 JavaBeans 写入 CSV。

Car.java

  1. package com.zetcode.bean;
  2. public class Car {
  3. private int id;
  4. private String name;
  5. private int price;
  6. public Car() {
  7. }
  8. public Car(int id, String name, int price) {
  9. this.id = id;
  10. this.name = name;
  11. this.price = price;
  12. }
  13. public int getId() {
  14. return id;
  15. }
  16. public void setId(int id) {
  17. this.id = id;
  18. }
  19. public String getName() {
  20. return name;
  21. }
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. public int getPrice() {
  26. return price;
  27. }
  28. public void setPrice(int price) {
  29. this.price = price;
  30. }
  31. @Override
  32. public String toString() {
  33. StringBuilder builder = new StringBuilder();
  34. builder.append("Car{id=").append(id).append(", name=")
  35. .append(name).append(", price=").append(price).append("}");
  36. return builder.toString();
  37. }
  38. }

这是一个Car bean。

OpenCSVWriteBeansEx.java

  1. package com.zetcode;
  2. import com.opencsv.CSVWriter;
  3. import com.opencsv.bean.StatefulBeanToCsv;
  4. import com.opencsv.bean.StatefulBeanToCsvBuilder;
  5. import com.opencsv.exceptions.CsvDataTypeMismatchException;
  6. import com.opencsv.exceptions.CsvRequiredFieldEmptyException;
  7. import com.zetcode.bean.Car;
  8. import java.io.BufferedWriter;
  9. import java.io.IOException;
  10. import java.nio.charset.StandardCharsets;
  11. import java.nio.file.Files;
  12. import java.nio.file.Path;
  13. import java.nio.file.Paths;
  14. import java.util.ArrayList;
  15. import java.util.List;
  16. import java.util.logging.Level;
  17. import java.util.logging.Logger;
  18. public class OpenCSVWriteBeansEx {
  19. public static void main(String[] args) {
  20. String fileName = "src/main/resources/cars.csv";
  21. Path myPath = Paths.get(fileName);
  22. List<Car> cars = new ArrayList<>();
  23. cars.add(new Car(1, "Audi", 52642));
  24. cars.add(new Car(2, "Mercedes", 57127));
  25. cars.add(new Car(3, "Skoda", 9000));
  26. cars.add(new Car(4, "Volvo", 29000));
  27. try (BufferedWriter writer = Files.newBufferedWriter(myPath,
  28. StandardCharsets.UTF_8)) {
  29. StatefulBeanToCsv<Car> beanToCsv = new StatefulBeanToCsvBuilder(writer)
  30. .withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
  31. .build();
  32. beanToCsv.write(cars);
  33. } catch (CsvDataTypeMismatchException | CsvRequiredFieldEmptyException |
  34. IOException ex) {
  35. Logger.getLogger(OpenCSVWriteBeansEx.class.getName()).log(
  36. Level.SEVERE, ex.getMessage(), ex);
  37. }
  38. }
  39. }

该示例创建一个汽车对象列表,并将其写入 CSV 文件。

  1. List<Car> cars = new ArrayList<>();
  2. cars.add(new Car(1, "Audi", 52642));
  3. cars.add(new Car(2, "Mercedes", 57127));
  4. cars.add(new Car(3, "Skoda", 9000));
  5. cars.add(new Car(4, "Volvo", 29000));

我们创建汽车对象列表。

  1. StatefulBeanToCsv<Car> beanToCsv = new StatefulBeanToCsvBuilder(writer)
  2. .withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
  3. .build();

StatefulBeanToCsvBuilder创建一个StatefulBeanToCsv

  1. beanToCsv.write(cars);

Bean 被写入文件。

在本教程中,我们使用了 Opencsv 库。 我们已经从 CSV 文件读取数据,将数据写入 CSV 文件,从数据库表中导出数据到 CSV 文件,以及将 CSV 数据映射到 bean。

您可能也对以下相关教程感兴趣: Java 教程读取 WAR 中的 CSV 文件Java 文本文件读取jQuery 自动完成教程