我导入了一个由亚马逊编码的Android示例,涉及我从这里获得的AWS的DynamoDB,可能是为Eclipse编写的: https://github.com/awslabs/aws-sdk-android-samples/tree/master/DynamoDBMapper_UserPreference
由于Android Studio(0.8.1)使用gradle而不是ant,因此在导入时自然会在dir结构方面自动移动,因此(部分)它看起来像这样:
PropertyLoader获取从AwsCredentials.properties连接到数据库DynamoDB所需的TVM凭据信息。相关方法:
public class PropertyLoader {
private boolean hasCredentials = false;
private String tokenVendingMachineURL = null;
private boolean useSSL = false;
private String testTableName = null;
private static PropertyLoader instance = null;
public static PropertyLoader getInstance() {
if ( instance == null ) {
instance = new PropertyLoader();
}
return instance;
}
public PropertyLoader() {
try {
Properties properties = new Properties();
properties.load( this.getClass().getResourceAsStream( "AwsCredentials.properties" ) );
this.tokenVendingMachineURL = properties.getProperty( "tokenVendingMachineURL" );
this.useSSL = Boolean.parseBoolean( properties.getProperty( "useSSL" ) );
this.testTableName = properties.getProperty( "testTableName" );
if ( this.tokenVendingMachineURL == null || this.tokenVendingMachineURL.equals( "" ) || this.tokenVendingMachineURL.equals( "CHANGEME" ) || this.testTableName.equals( "" ) ) {
this.tokenVendingMachineURL = null;
this.useSSL = false;
this.hasCredentials = false;
this.testTableName = null;
}
else {
this.hasCredentials = true;
}
}
catch ( Exception exception ) {
Log.e( "PropertyLoader", "Unable to read property file." );
}
}
然而,getResourceAsStream行properties.load( this.getClass().getResourceAsStream( "AwsCredentials.properties" ) );
返回null。正如您在我的屏幕截图中看到的那样,AwsCredentials.properties与PropertyLoader位于同一个目录中并与案例匹配,根据我对该方法的读数,这应该是所有需要的:
http://mindprod.com/jgloss/getresourceasstream.html
getResourceAsStream() is always returning null
我尝试过其他的东西,比如前缀" \" (即properties.load( this.getClass().getResourceAsStream( "\AwsCredentials.properties" ) );
并复制凭证文件并放入src文件夹(您无法在此屏幕截图中看到它,因为资源管理器按文件类型排序(?)并首先放置' main' ,但它就是这样的:
getResourceAsStream returning null
然而,这也没有解决问题。在尝试了这些选项并完成了研究后,我很困惑为什么它会返回null。我该如何解决这个问题?
答案 0 :(得分:8)
在/ src / main /下创建了一个名为resources的目录,并在那里放置了AwsCredentials.properties并使用了
properties.load( PropertyLoader.class.getClassLoader().getResourceAsStream( "AwsCredentials.properties" ) );
而不是
properties.load( this.getClass().getResourceAsStream("AwsCredentials.properties" ) );
不像我想的那么优雅,但它有效。
答案 1 :(得分:0)
长达一天我也在努力解决这个问题。最后我能够非常巧妙地解决这个问题。问题不在于JAVA,而在于所有项目结构。例如。在Android Studio中,整个项目位于src/main/java
下,而main
是项目的flavour
。因此,如果您要在源代码包(例如)com/my/example/app
中读取文件(-s),则必须编辑build.gradle
文件以进行阅读(clazz.getResourceAsStream(file)
)工作正常。即在android
下定义sourceSets
,如下所示:
android {
/* ... Your stuff ... */
sourceSets {
// Lets have two flavours to make it more clear
main {
resources.srcDirs = ['src/main/java']
}
flavourFoo {
resources.srcDirs = ['src/flavourFoo/java']
}
}
}
希望这有帮助!