1. 程式人生 > >Android:JAVA使用HDF5儲存

Android:JAVA使用HDF5儲存

        Hierarchical Data Format,可以儲存不同型別的影象和數碼資料的檔案格式,並且可以在不同型別的機器上傳輸,同時還有統一處理這種檔案格式的函式庫。大多數普通計算機都支援這種檔案格式。 HDF是用於儲存和分發科學資料的一種自我描述、多物件檔案格式。HDF是由美國國家超級計算應用中心(NCSA)建立的,以滿足不同群體的科學家在不同工程專案領域之需要。

        關於HDF5的介紹,請檢視HDF5的官方頁面。和參考此文:科學儲存資料格式-HDF5            

        此外,HDF5提供了JAVA介面,下面是java使用HDF5的一些注意事項和相關程式碼。

1.Eclipse配置

        到hdf5的安裝資料夾下面,把jarhdf5.jar, slf4j-api.jar,slf4j-simple.jar 新增到功能lib目錄,同時把hdf5_java.dll檔案新增到一個目錄X。注意,在此過程中,新增且只新增這三個檔案,第四個slf4j-nop-1.7.5.jar暫時不使用。

   
    HDF5為C++ native的第三方庫,按照引入庫的一般步驟加入Eclipse工程。windows->preference->java->userLIbraries->new。自行新增庫的名字。我的名字是HDF5。

        然後在新建的使用者庫裡面,Add JARS,新增jarhdf5.jar, slf4j-api.jar,slf4j-simple.jar三個檔案,並在jarhdf5.jar下面配置Native library location,連結到X目錄,用以呼叫Native動態庫hdf5_java.dll。

        然後在工程的原始碼檔案中,引入hdf5的包。

 例如:

import hdf.hdf5lib.H5;
import hdf.hdf5lib.HDF5Constants;

2.讀取HDF5檔案

        初次使用,使用了C++寫入的檔案,測試讀取,可執行程式碼如下:

public static void main(String[] args) {
                String fname = "D:/dataSet/RecoSys/JavaTest/HDF5DatasetRead.h5";
		// private static
		String dsname = e = "training_data";
		try {
			// create the HDF5 file and add groups and dataset into the file
			//save_to_file(fname, dsname, dims2D);
		} catch (Exception ex) {
			ex.printStackTrace();
		}

		// 測試讀出
		try {
			load_from_file(fname, dsname);
		} catch (Exception ex) {
			ex.printStackTrace();
		}
}

load函式:

	public static int load_from_file(String fname, String dsname) throws Exception {

                //讀取先後使用了fileID,SpaceID,DatasetID
		long file_id = -1;
		long space_id = -1;
		long dataset_id = -1;

		// Open file using the default properties.
		try {
			file_id = H5.H5Fopen(fname, HDF5Constants.H5F_ACC_RDWR, HDF5Constants.H5P_DEFAULT);
		} catch (Exception e) {
			e.printStackTrace();
		}

		// Open dataset using the default properties.
		try {
			if (file_id >= 0)
				dataset_id = H5.H5Dopen(file_id, dsname, HDF5Constants.H5P_DEFAULT);
		} catch (Exception e) {
			e.printStackTrace();
		}

		// Allocate array of pointers to two-dimensional arrays (theelements of the dataset.
		int l = 20;
		int w =20;
		long[] dims = {0,0};
		long[] dims2 = {0,0};
		//獲取
		space_id = H5.H5Dget_space(dataset_id);
		H5.H5Sget_simple_extent_dims(space_id,dims,dims2);
		l= (int)dims[0];
		w= (int)dims[1];
		
		int[][] dataRead = new int[l][w];
		try {
			if (dataset_id >= 0)
				H5.H5Dread(dataset_id, HDF5Constants.H5T_NATIVE_INT, HDF5Constants.H5S_ALL, HDF5Constants.H5S_ALL,
						HDF5Constants.H5P_DEFAULT, dataRead);
		} catch (Exception e) {
			e.printStackTrace();
		}

		// print out the data values
		System.out.println("\n\nOriginal Data Values");
		for (int i = 0; i < l; i++) {
			System.out.print("\n" + dataRead[i][0]);
			for (int j = 1; j < w; j++) {
				System.out.print(", " + dataRead[i][j]);
			}
		}
}

實現把資料讀取到dataRead中。

3.儲存HDF5檔案

..............待完成..................