无法使用getResourceAsStream加载文件

时间:2013-09-10 20:50:39

标签: java file classpath avro

我正在尝试学习Apache Avro,我已经开始使用Avro的简单教程了。我正在尝试使用JSON Schema来加载数据。以下是我的简单示例 -

public class AvroExample {

    public static Schema SCHEMA; // writer's schema
    public static Schema SCHEMA2; // reader's schema

    private String name;
    private int age;
    private String[] mails;
    private AvroExample boss;

    static {
        try {

            SCHEMA = Schema.parse(AvroExample.class.getResourceAsStream("Employee.avsc"));
            SCHEMA2 = Schema.parse(AvroExample.class.getResourceAsStream("Employee2.avsc"));
        } catch (Exception e) {
            System.out.println("Couldn't load a schema: " + e.getMessage());
        }
    }

    // some more code

}

但不知怎的,这条线总是给我异常 -

SCHEMA = Schema.parse(AvroExample.class.getResourceAsStream("Employee.avsc"));

as- Couldn't load a schema: java.lang.NullPointerException

我相信不知何故,它无法正确加载文件或我以错误的方式加载文件。

这是文件内容 -

{
  "type": "record", 
  "name": "Employee", 
  "fields": [
      {"name": "name", "type": "string"},
      {"name": "age", "type": "int"},
      {"name": "emails", "type": {"type": "array", "items": "string"}},
      {"name": "boss", "type": ["Employee","null"]}
  ]
}

下面是我工作区的图片,显示了我放置这两个avsc文件的位置 -

enter image description here

有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

通过您向我们展示的项目设置,您的类路径可能看起来像

/root
    /Employee.avsc
    /Employee2.avsc
    /com
        /rjamal
            /avro
                /test
                    /AvroExperiment
                        /...

换句话说,两个avsc文件将位于类路径的根目录中。方法调用

AvroExample.class.getResourceAsStream("Employee.avsc")

查找AvroExample类所在的包中的资源。

要使其相对于类路径的根,请在路径前添加/

AvroExample.class.getResourceAsStream("/Employee.avsc")

检查javadoc

  

在委托之前,从中构造绝对资源名称   使用此算法给定资源名称:

     
      
  • 如果名称以'/'('\ u002f')开头,则资源的绝对名称是'/'后面的名称部分。
  •   
  • 否则,绝对名称的格式如下: modified_pa​​ckage_name / name

         

    其中modified_pa​​ckage_name为此对象的包名称,并以'/'代替'。' ( '\ u002e')。

  •   

强调我的。