Java 如何读取资源文件?(谷歌云dafaflow)

Java 如何读取资源文件?(谷歌云dafaflow),java,google-cloud-dataflow,Java,Google Cloud Dataflow,我的数据流管道需要读取一个资源文件GeoLite2 City.mmdb。我将它添加到我的项目中并运行管道。我确认项目包zip文件存在于GCS上的临时存储桶中 但是,当我尝试读取资源文件GeoLite City.mmdb时,我得到一个FileNotFoundException。我怎样才能解决这个问题?这是我的代码: String path = myClass.class.getResource("/GeoLite2-City.mmdb").getPath(); File database = n

我的数据流管道需要读取一个资源文件
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());

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

我认为问题可能在于
DatabaseReader
不支持指向.zip或.jar文件中资源的路径

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

我在网上搜索了你可能在谈论的DatabaseReader类,看起来是这样的

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

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

这是否使用DirectPipelineRunner在本地运行?您还可以确认DatabaseReader类是否支持位于zip存档中的文件吗?这与数据流无关-您可以尝试在主程序中创建DatabaseReader,并将其指向classes-WOdCPQCHjW-hRNtrfrnZMw.zip文件的本地副本,然后检查它是否工作。不,运行程序正在阻止DataflowPipelineRunner。当我使用DirectPipelineRunner在本地运行时,它运行得很好。路径值是本地的“/C:/Users/Jennie/workspace/DataflowJavaSDK master/eclipse/starter/target/classes/GeoLite2 City.mmdb”,这是我的选项。[--runner=BlockingDataflowPipelineRunner--project=peak myproject--stagingLocation=gs://mybucket/staging--input=gs://mybucket\u log/log.68599ca3.gz]是的,你是对的。我已经按照您的方式更改了代码,并成功地运行了它。谢谢你的帮助。
try
{
  InputStream stream = myClass.class.getResourceAsStream("/GeoLite2-City.mmdb");
  DatabaseReader reader = new DatabaseReader.Builder(stream).build();
}
catch (IOException e)
{
  ...
}