2013-09-10 5 views
0

Я пытаюсь изучить Apache Avro, и я начал с простого учебника для Avro. Я пытаюсь использовать JSON Schema для загрузки данных. Ниже мой простой ПРИМЕР-Не удается загрузить файл с помощью getResourceAsStream

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 

} 

Но почему-то эта линия, всегда дают мне exception-

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

как- 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 files-

enter image description here

Может кто-нибудь помочь мне с этим ?

+1

Поместите '/' перед вашей строкой пути. Что касается этого, прочитайте javadoc для 'Class # getResource()' и связанных методов. –

ответ

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_package_name/имя

    Если modified_package_name является имя пакета этого объекта с «/» заменить на «» ('\ U002e').

выделено мной.

+0

Спасибо Sotirios за предложение. Сегодня я узнал новое.Но после внесения изменений я все равно получаю то же исключение. 'SCHEMA = Schema.parse (AvroExample.class.getResourceAsStream ("/Employee.avsc ")); \t \t \t SCHEMA2 = Schema.parse (AvroExample.class.getResourceAsStream ("/ Employee2.avsc")); ' – AKIWEB

+0

@ TrekkieTechieT-T Являются ли эти файлы в' SRC/основной/java' или внутри какой-то пакет? Следуйте соглашениям maven и поместите ваши файлы без java в 'src/main/resources', который должен быть исходной папкой в ​​Eclipse. –

+0

Их нет в пакете. Это точно так, как показано на изображении. Но в целом, что лучший способ? Где мы будем размещать эти файлы? А также я создал еще один файл 'config.properties' и разместил его в том же самом месте. И после этого я сделал что-то вроде этого: 'System.out.println (AvroExample.class.getResourceAsStream ("/config.properties ")); \t \t \t System.out.println (AvroExample.class.getResourceAsStream ("/ Employee.avsc")); 'Итак, первая напечатала' java.io.BufferedInputStream @ 1160116', а вторая напечатала как null. – AKIWEB

Смежные вопросы