0

0

使用 Java 泛型实现 CSV 到对象的转换器

碧海醫心

碧海醫心

发布时间:2025-08-29 13:39:01

|

244人浏览过

|

来源于php中文网

原创

使用 java 泛型实现 csv 到对象的转换器

本文将介绍如何使用 Java 泛型创建一个通用的 CSV 到对象的转换器。通过泛型,我们可以避免为每种需要转换的 Java 类编写重复的代码,从而提高代码的可重用性和可维护性。文章将提供代码示例,并讨论一些关于代码设计和现有 CSV 解析库的建议。

泛型 CSV 工具

使用 Java 泛型可以创建一个通用的 CSV 工具类,该类可以读取 CSV 文件并将其转换为指定类型的 Java 对象列表。以下是一个简单的 CsvUtils 类的示例:

import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class CsvUtils {

    public List read(final String fileName, Class clazz) throws IOException, ReflectiveOperationException {
        List objList = new ArrayList<>();
        Path pathToFile = Paths.get(fileName);

        try (BufferedReader br = Files.newBufferedReader(pathToFile)) {
            String line = br.readLine(); // 读取标题行
            if(line == null) return objList;

            String[] headers = line.split(",");
            while ((line = br.readLine()) != null) {
                String[] attributes = line.split(",");
                T obj = createObject(attributes, headers, clazz);
                objList.add(obj);
            }
        }
        return objList;
    }

    private T createObject(String[] attributes, String[] headers, Class clazz) throws ReflectiveOperationException {
        T obj = clazz.getDeclaredConstructor().newInstance(); // 创建对象实例

        // 使用反射设置对象属性 (需要根据实际情况调整)
        for(int i = 0; i < attributes.length && i < headers.length; i++){
            try {
                java.lang.reflect.Field field = clazz.getDeclaredField(headers[i]);
                field.setAccessible(true); // 允许访问私有字段

                // 类型转换 (根据实际类型进行转换)
                Object value = attributes[i];
                if(field.getType() == Integer.class || field.getType() == int.class){
                    value = Integer.parseInt(attributes[i]);
                }

                field.set(obj, value);
            } catch (NoSuchFieldException e) {
                // 如果字段不存在,则忽略
                System.err.println("Field " + headers[i] + " not found in class " + clazz.getName());
            } catch (IllegalAccessException e) {
                System.err.println("Cannot access field " + headers[i] + " in class " + clazz.getName());
            }
        }

        return obj;
    }
}

使用示例

以下是如何使用 CsvUtils 类读取 Cat 和 Dog 对象的示例:

import java.io.IOException;
import java.util.List;

public class Main {
    public static void main(String[] args) throws IOException, ReflectiveOperationException {
        CsvUtils dogCsvUtils = new CsvUtils<>();
        List myDogs = dogCsvUtils.read("dogs.csv", Dog.class);

        for (Dog dog : myDogs) {
            System.out.println(dog);
        }

        CsvUtils catCsvUtils = new CsvUtils<>();
        List myCats = catCsvUtils.read("cats.csv", Cat.class);

        for (Cat cat : myCats) {
            System.out.println(cat);
        }
    }
}

注意事项

  • 异常处理: 代码示例中使用了 throws IOException, ReflectiveOperationException,实际应用中应该进行更细致的异常处理。
  • 反射: 使用反射可以使代码更加通用,但也可能降低性能。需要权衡通用性和性能。
  • 类型转换: createObject 方法中需要根据实际类型进行转换。示例代码中只包含了 Integer 类型的转换,需要根据实际情况添加其他类型的转换逻辑。
  • CSV 格式: 代码示例假设 CSV 文件使用逗号作为分隔符,并且第一行是标题行。需要根据实际 CSV 文件的格式进行调整。
  • 安全性: 使用反射时需要注意安全性问题,避免恶意代码注入。

使用现有的 CSV 解析库

手动解析 CSV 文件可能会比较繁琐,并且容易出错。 建议使用现有的 CSV 解析库,例如 Apache Commons CSV、OpenCSV、SimpleFlatMapper CSV parser、jackson-dataformat-csv、uniVocity-parsers 等。这些库提供了更丰富的功能和更好的性能,可以大大简化 CSV 文件的解析过程。

Android数据格式解析对象JSON用法 WORD版
Android数据格式解析对象JSON用法 WORD版

本文档主要讲述的是Android数据格式解析对象JSON用法;JSON可以将Java对象转成json格式的字符串,可以将json字符串转换成Java。比XML更轻量级,Json使用起来比较轻便和简单。JSON数据格式,在Android中被广泛运用于客户端和服务器通信,在网络数据传输与解析时非常方便。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

下载

立即学习Java免费学习笔记(深入)”;

例如,使用 Apache Commons CSV:

import org.apache.commons.csv.*;

import java.io.*;
import java.util.*;

public class CsvUtils {

    public List read(final String fileName, Class clazz) throws IOException, ReflectiveOperationException {
        List objList = new ArrayList<>();
        try (Reader reader = new FileReader(fileName);
             CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT
                     .withFirstRecordAsHeader()
                     .withIgnoreHeaderCase()
                     .withTrim())) {

            Map headerMap = csvParser.getHeaderMap();

            for (CSVRecord record : csvParser) {
                T obj = createObject(record, headerMap, clazz);
                objList.add(obj);
            }
        }
        return objList;
    }

    private T createObject(CSVRecord record, Map headerMap, Class clazz) throws ReflectiveOperationException {
        T obj = clazz.getDeclaredConstructor().newInstance();

        for (Map.Entry entry : headerMap.entrySet()) {
            String headerName = entry.getKey();
            String value = record.get(headerName);

            try {
                java.lang.reflect.Field field = clazz.getDeclaredField(headerName);
                field.setAccessible(true);

                Object convertedValue = value;
                if (field.getType() == Integer.class || field.getType() == int.class) {
                    convertedValue = Integer.parseInt(value);
                }

                field.set(obj, convertedValue);
            } catch (NoSuchFieldException e) {
                System.err.println("Field " + headerName + " not found in class " + clazz.getName());
            } catch (IllegalAccessException e) {
                System.err.println("Cannot access field " + headerName + " in class " + clazz.getName());
            }
        }

        return obj;
    }
}

总结

本文介绍了如何使用 Java 泛型创建一个通用的 CSV 到对象的转换器。通过泛型,我们可以避免为每种需要转换的 Java 类编写重复的代码,从而提高代码的可重用性和可维护性。同时,建议使用现有的 CSV 解析库来简化 CSV 文件的解析过程。 在实际应用中,需要根据具体的 CSV 文件格式和 Java 对象结构进行调整,并进行充分的测试和验证。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++类型转换方式
C++类型转换方式

本专题整合了C++类型转换相关内容,想了解更多相关内容,请阅读专题下面的文章。

301

2025.07.15

apache是什么意思
apache是什么意思

Apache是Apache HTTP Server的简称,是一个开源的Web服务器软件。是目前全球使用最广泛的Web服务器软件之一,由Apache软件基金会开发和维护,Apache具有稳定、安全和高性能的特点,得益于其成熟的开发和广泛的应用实践,被广泛用于托管网站、搭建Web应用程序、构建Web服务和代理等场景。本专题为大家提供了Apache相关的各种文章、以及下载和课程,希望对各位有所帮助。

411

2023.08.23

apache启动失败
apache启动失败

Apache启动失败可能有多种原因。需要检查日志文件、检查配置文件等等。想了解更多apache启动的相关内容,可以阅读本专题下面的文章。

931

2024.01.16

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

52

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

40

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

50

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

11

2026.01.31

漫画防走失登陆入口大全
漫画防走失登陆入口大全

2026最新漫画防走失登录入口合集,汇总多个稳定可用网址,助你畅享高清无广告漫画阅读体验。阅读专题下面的文章了解更多详细内容。

13

2026.01.31

php多线程怎么实现
php多线程怎么实现

PHP本身不支持原生多线程,但可通过扩展如pthreads、Swoole或结合多进程、协程等方式实现并发处理。阅读专题下面的文章了解更多详细内容。

1

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3万人学习

C# 教程
C# 教程

共94课时 | 8.1万人学习

Java 教程
Java 教程

共578课时 | 54万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号