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檔案
..............待完成..................