xingjinshuang
2024-12-10 b9e9825722e4a2e0111434099c24b8373698753d
@xingjs@20241210@添加解析h5文件相关类
已添加4个文件
214 ■■■■■ 文件已修改
src/main/java/com/se/simu/controller/BizH5FileParserController.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/helper/HDF5ReaderHelper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/service/IBizH5FileParserService.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/service/Impl/BizH5FileParserServiceImpl.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/se/simu/controller/BizH5FileParserController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,71 @@
package com.se.simu.controller;
import com.se.simu.domain.vo.R;
import com.se.simu.service.IBizH5FileParserService;
import hdf.hdf5lib.exceptions.HDF5LibraryException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
 * Bize H5 æ–‡ä»¶è§£æžå™¨æŽ§åˆ¶å™¨
 *
 * @author xingjinshuang@smartearth.cn
 * @date 2024/12/06
 */
@Api(tags = "H5 æ–‡ä»¶è§£æžå™¨æŽ§åˆ¶å™¨")
@Slf4j
@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
@RequestMapping("/h5")
public class BizH5FileParserController extends BaseController {
    @Resource
    private IBizH5FileParserService bizH5FileParserService;
    /**
     * HDF5文件 è¯´æ˜Ž
     */
    @ApiOperation("HDF5文件 è¯´æ˜Ž")
    @GetMapping("/hdf5-illustrate")
    public R<Object> hdf5FileIllustrate() throws HDF5LibraryException {
        String content = "HDF5(Hierarchical Data Format version 5)是一种用于存储和组织大量数据的文件格式,它支持高效地存储和处理大规模科学数据的能力。HDF5 æ˜¯ä¸€ç§çµæ´»çš„æ•°æ®æ¨¡åž‹ï¼Œå¯ä»¥å­˜å‚¨å¤šç§æ•°æ®ç±»åž‹ï¼ŒåŒ…括数值数据、图像、表格等等,并且可以按照层级结构组织数据。\n" +
                "HDF5 æ–‡ä»¶ï¼ˆé€šå¸¸ä½¿ç”¨ .h5 æ‰©å±•名)是一种二进制文件格式,它具有以下特点:\n" +
                "1.灵活性: HDF5 æ–‡ä»¶æ ¼å¼éžå¸¸çµæ´»ï¼Œå¯ä»¥å­˜å‚¨å„种不同类型和大小的数据,从简单的数值数组到复杂的多维数据集合。\n" +
                "2.层级结构: HDF5 æ–‡ä»¶æ˜¯ä»¥å±‚级结构组织的,可以在文件中创建多个数据集(Datasets)和组(Groups),允许用户根据需求组织和管理数据。\n" +
                "3.多种数据类型: HDF5 æ”¯æŒå¤šç§æ•°æ®ç±»åž‹ï¼ŒåŒ…括标量、数组、字符串、表格等等,并且可以使用不同的压缩技术对数据进行压缩。\n" +
                "4.高效性能: HDF5 æ–‡ä»¶æ ¼å¼è¢«è®¾è®¡ç”¨äºŽé«˜æ•ˆå­˜å‚¨å’Œå¤„理大型数据集,具有高效的数据访问和读写性能。\n" +
                "5.跨平台兼容性: HDF5 æ–‡ä»¶å¯ä»¥åœ¨ä¸åŒçš„æ“ä½œç³»ç»Ÿä¸Šä½¿ç”¨ï¼Œå…·æœ‰è‰¯å¥½çš„跨平台兼容性。\n" +
                "HDF5 æ–‡ä»¶é€šå¸¸ç”±ç§‘学计算、数据分析、机器学习等领域的应用广泛使用,用于存储大规模数据集,例如图像数据、传感器数据、模拟数据等。通过使用各种编程语言的 HDF5 åº“和工具,可以方便地读写和处理 HDF5 æ ¼å¼çš„æ–‡ä»¶ã€‚";
        log.info("HDF5文件 è¯´æ˜Ž:{}", content);
        return success(content);
    }
    /**
     * æ‰“å¼€HDF5文件
     *
     * @param filePath æ–‡ä»¶è·¯å¾„
     * @return æ–‡ä»¶ID
     */
    @ApiOperation("打开HDF5文件")
    @PostMapping("/open-hdf5-file")
    public R<Object> openHdf5File(String filePath) throws HDF5LibraryException {
        return success(bizH5FileParserService.openH5File(filePath));
    }
    /**
     * è§£æžHD5文件
     */
    @ApiOperation("解析HD5文件")
    @PostMapping("/parse-hdf5-file")
    public R<Object> parseHdf5File(String filePath) throws HDF5LibraryException {
        filePath = "/Users/zhangshan/Desktop/hdf5/data.h5";
        log.info("解析HD5文件:{}", filePath);
        return success(bizH5FileParserService.parseH5File(filePath));
    }
}
src/main/java/com/se/simu/helper/HDF5ReaderHelper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
package com.se.simu.helper;
public class HDF5ReaderHelper {
    public static void main(String[] args) {
    }
}
src/main/java/com/se/simu/service/IBizH5FileParserService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,46 @@
package com.se.simu.service;
import hdf.hdf5lib.exceptions.HDF5LibraryException;
/**
 * ibiz H5 æ–‡ä»¶è§£æžå™¨
 *
 * @author xingjinshuang@smartearth.cn
 * @date 2024/12/06
 */
public interface IBizH5FileParserService {
    /**
     * æ‰“å¼€HDF5文件
     *
     * @param filePath æ–‡ä»¶è·¯å¾„
     * @return æ–‡ä»¶ID
     */
    long openH5File(String filePath) throws HDF5LibraryException;
    /**
     * è¯»å–指定数据集的数据
     *
     * @param fileId      æ–‡ä»¶ID
     * @param datasetName æ•°æ®é›†åç§°
     * @return æ•°æ®é›†çš„值
     */
    Object readDataset(long fileId, String datasetName);
    /**
     * å…³é—­HDF5文件
     *
     * @param fileId æ–‡ä»¶ID
     */
    void closeH5File(long fileId) throws HDF5LibraryException;
    /**
     * è§£æž H5 æ–‡ä»¶
     *
     * @param filePath
     * @return {@link Object}
     */
    Object parseH5File(String filePath);
}
src/main/java/com/se/simu/service/Impl/BizH5FileParserServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
package com.se.simu.service.Impl;
import com.se.simu.service.IBizH5FileParserService;
import hdf.hdf5lib.H5;
import hdf.hdf5lib.HDF5Constants;
import hdf.hdf5lib.exceptions.HDF5Exception;
import hdf.hdf5lib.exceptions.HDF5LibraryException;
import org.springframework.stereotype.Service;
@Service
public class BizH5FileParserServiceImpl implements IBizH5FileParserService {
    @Override
    public long openH5File(String filePath) throws HDF5LibraryException {
        long fileId = H5.H5Fopen(filePath, HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5P_DEFAULT);
        return fileId;
    }
    @Override
    public Object readDataset(long fileId, String datasetName) {
        // long datasetId = H5.H5Dopen((int) fileId, datasetName, HDF5Constants.H5P_DEFAULT);
        // long datatypeId = H5.H5Dget_type((int) datasetId);
        int[] data = new int[1]; // å‡è®¾æ•°æ®é›†ä¸ºæ•´åž‹æ•°ç»„
        // H5.H5Dread((int) datasetId, datatypeId, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, data);
//
        // H5.H5Dclose(datasetId);
        // H5.H5Tclose(datatypeId);
        return data[0];
    }
    @Override
    public void closeH5File(long fileId) throws HDF5LibraryException {
        H5.H5Fclose((int) fileId);
    }
    @Override
    public Object parseH5File(String filePath) {
        String fileName = "D:\\xingjs\\A_daily\\PycharmProjects\\pythonProject\\dev\\example.h5";
        String datasetName = "dataset2";
        try {
            // æ‰“å¼€.h5文件
            int fileId = H5.H5Fopen(fileName, HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5P_DEFAULT);
            // æ‰“开数据集
            int datasetId = H5.H5Dopen(fileId, datasetName, HDF5Constants.H5P_DEFAULT);
            // èŽ·å–æ•°æ®é›†çš„æ•°æ®ç±»åž‹
            int datatypeId = H5.H5Dget_type(datasetId);
            int datatypeSize = H5.H5Tget_size(datatypeId);
            // èŽ·å–æ•°æ®é›†çš„æ•°æ®ç©ºé—´
            int dataspaceId = H5.H5Dget_space(datasetId);
            long[] dims = new long[HDF5Constants.H5S_MAX_RANK];
            H5.H5Sget_simple_extent_dims(dataspaceId, dims, null);
            // è¯»å–数据集的数据
            byte[] data = new byte[(int) (dims[0] * datatypeSize)];
            H5.H5Dread(datasetId, datatypeId, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL, HDF5Constants.H5P_DEFAULT, data);
            // å…³é—­æ•°æ®é›†
            H5.H5Dclose(datasetId);
            // å…³é—­æ–‡ä»¶
            H5.H5Fclose(fileId);
            // å¤„理数据
            // ...
            // æ‰“印数据示例
            for (int i = 0; i < data.length; i++) {
                System.out.print(data[i] + " ");
            }
        } catch (HDF5Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}