如何读取资源文件?(谷歌云大发)



我的数据流管道需要读取资源文件GeoLite2-City.mmdb。我将其添加到我的项目中并运行了管道。我确认项目包 zip 文件存在于 GCS 的暂存存储桶中。

但是,当我尝试读取资源文件GeoLite-City.mmdb时,我得到了一个FileNotFoundException。我该如何解决这个问题?这是我的代码:

String path = myClass.class.getResource("/GeoLite2-City.mmdb").getPath();
File database = new File(path);
try
{
DatabaseReader reader = new DatabaseReader.Builder(database).build(); //<-this line get a FileNotFoundException
}
catch (IOException e)
{
LOG.info(e.toString());
}

我的项目包zip文件是"class-WOdCPQCHjW-hRNtrfrnZMw.zip"(它包含类文件和GeoLite2-City.mmdb

路径值为"file:/dataflow/packages/staging/classes-WOdCPQCHjW-hRNtrfrnZMw.zip!/GeoLite2-City.mmdb",但无法打开。

这是选项。

--runner=BlockingDataflowPipelineRunner 
--project=peak-myproject 
--stagingLocation=gs://mybucket/staging 
--input=gs://mybucket_log/log.68599ca3.gz

目标是在 GCS 上转换日志文件,并将转换后的数据插入到 BigQuery。当我在本地运行时,它成功地导入到 Bigquery。我认为本地PC和GCE获取资源路径是不同的。

我认为

问题可能是DatabaseReader不支持位于.zip或.jar文件中的资源路径。

如果是这种情况,那么您的程序可以使用DirectPipelineRunner不是因为它是直接的,而是因为资源只是位于本地文件系统上而不是.zip文件中(正如您的评论所说,路径是C:/Users/Jennie/workspace/DataflowJavaSDK-master/eclipse/starter/target/classe‌​s/GeoLite2-City.mmdb,而在另一种情况下它是file:/dataflow/packages/staging/classes-WOdCPQCHjW-hRNtrfrnZMw.zip!/GeoLite2-City.mmdb

我在网上搜索了您可能在谈论的 DatabaseReader 类,似乎它 https://github.com/maxmind/GeoIP2-java/blob/master/src/main/java/com/maxmind/geoip2/DatabaseReader.java。

在这种情况下,您的代码很有可能会进行以下小更改:

try
{
  InputStream stream = myClass.class.getResourceAsStream("/GeoLite2-City.mmdb");
  DatabaseReader reader = new DatabaseReader.Builder(stream).build();
}
catch (IOException e)
{
  ...
}

最新更新