如何从字节数组中获取 NetcdfFile?
How do I get a NetcdfFile out of a byte array?
我对使用 netcdf-java 库还比较陌生,在尝试加载文件时我立即 运行 遇到了问题。问题是似乎没有办法从存储在内存中的字节数组加载 NetcdfFile,这是我的数据的基本形式。详细一点,其实就是通过客户端上传一个.cdf文件,然后客户端将其转换成字节数组,供服务端代码读取。所以我的代码是 运行ning 的服务器根本看不到上传的文件。我也不能假设服务器本身是可写的,所以基本上没有“位置”可以传递给典型的 NetcdfFile 加载方法。
ucar.edu 上的常见问题解答确实提到了从非文件源 here 读取的可能性。它说我应该编写自己的 IOSP,我很乐意这样做。但是,关于如何执行此操作的指导很少。
当唯一传递给函数的是 RandomAccessFile 时,我不知道如何实现 isValidFile
,常见问题解答中说可以忽略它。
我不知道我的 IOSP 将如何获得有问题的字节数组以用于 readData
。
我不知道为什么常见问题解答中的最小示例建议我创建一个新的 NetcdfFile class,而我似乎可以只使用默认文件但传入我的自定义 IOSP。
这个问题有点含糊,但我真的很迷茫,不知道从哪里开始。任何指导将不胜感激。
编辑:我正在使用 netcdf-java 库的 5.4.2。
我在 support archives 中找到了这个答案。解决方案是使用InMemoryRandomAccessFile
。构造函数采用一个字符串位置和一个包含文件内容的字节数组。根据我的测试,我认为该位置可以是任意字符串。这是对我有用的代码。
byte[] filebytes = retrieveFileBytes(clientFilepath);
InMemoryRandomAccessFile raf = new InMemoryRandomAccessFile(clientFilepath, filebytes);
NetcdfFile file = NetcdfFiles.open(raf, clientFilepath, null, null);
Variable peakRetentionTime = file.findVariable("peak_retention_time");
if (peakRetentionTime == null) {
displayWarning("peak_retention_time null!");
} else {
Array data = peakRetentionTime.read();
displayInfo(Ncdump.printArray(data));
}
我对使用 netcdf-java 库还比较陌生,在尝试加载文件时我立即 运行 遇到了问题。问题是似乎没有办法从存储在内存中的字节数组加载 NetcdfFile,这是我的数据的基本形式。详细一点,其实就是通过客户端上传一个.cdf文件,然后客户端将其转换成字节数组,供服务端代码读取。所以我的代码是 运行ning 的服务器根本看不到上传的文件。我也不能假设服务器本身是可写的,所以基本上没有“位置”可以传递给典型的 NetcdfFile 加载方法。
ucar.edu 上的常见问题解答确实提到了从非文件源 here 读取的可能性。它说我应该编写自己的 IOSP,我很乐意这样做。但是,关于如何执行此操作的指导很少。
当唯一传递给函数的是 RandomAccessFile 时,我不知道如何实现 isValidFile
,常见问题解答中说可以忽略它。
我不知道我的 IOSP 将如何获得有问题的字节数组以用于 readData
。
我不知道为什么常见问题解答中的最小示例建议我创建一个新的 NetcdfFile class,而我似乎可以只使用默认文件但传入我的自定义 IOSP。
这个问题有点含糊,但我真的很迷茫,不知道从哪里开始。任何指导将不胜感激。
编辑:我正在使用 netcdf-java 库的 5.4.2。
我在 support archives 中找到了这个答案。解决方案是使用InMemoryRandomAccessFile
。构造函数采用一个字符串位置和一个包含文件内容的字节数组。根据我的测试,我认为该位置可以是任意字符串。这是对我有用的代码。
byte[] filebytes = retrieveFileBytes(clientFilepath);
InMemoryRandomAccessFile raf = new InMemoryRandomAccessFile(clientFilepath, filebytes);
NetcdfFile file = NetcdfFiles.open(raf, clientFilepath, null, null);
Variable peakRetentionTime = file.findVariable("peak_retention_time");
if (peakRetentionTime == null) {
displayWarning("peak_retention_time null!");
} else {
Array data = peakRetentionTime.read();
displayInfo(Ncdump.printArray(data));
}