Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法使用getResourceAsStream加载文件_Java_File_Classpath_Avro - Fatal编程技术网

Java 无法使用getResourceAsStream加载文件

Java 无法使用getResourceAsStream加载文件,java,file,classpath,avro,Java,File,Classpath,Avro,我正在尝试学习ApacheAvro,我已经从简单的Avro教程开始。我试图使用JSON模式来加载数据。下面是我的简单例子- public class AvroExample { public static Schema SCHEMA; // writer's schema public static Schema SCHEMA2; // reader's schema private String name; private int age; priv

我正在尝试学习ApacheAvro,我已经从简单的Avro教程开始。我试图使用JSON模式来加载数据。下面是我的简单例子-

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-
无法加载架构: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文件放在哪里-


有人能帮我吗?

根据您向我们展示的项目设置,您的类路径很可能如下所示

/root
    /Employee.avsc
    /Employee2.avsc
    /com
        /rjamal
            /avro
                /test
                    /AvroExperiment
                        /...
换句话说,两个
avsc
文件将位于类路径的根。方法调用

AvroExample.class.getResourceAsStream("Employee.avsc")
AvroExample
类所在的包中查找资源

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

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

在委托之前,将根据 使用此算法的给定资源名称:

  • 如果名称以“/”开头(“\u002f”),则资源的绝对名称是名称中“/”后面的部分
  • 否则,绝对名称的形式如下:modified\u package\u name/name

    其中,修改后的包名为此对象的包名,用“/”替换“.”(“\u002e”)


强调我的路径。

在路径字符串前面放一个
/
。至于为什么会这样,请阅读
Class#getResource()
的javadoc和链接的方法。感谢Sotirios的建议。今天我学到了一件新东西。但在做出改变之后,我还是得到了同样的例外
SCHEMA=SCHEMA.parse(AvroExample.class.getResourceAsStream(“/Employee.avsc”);SCHEMA2=Schema.parse(AvroExample.class.getResourceAsStream(“/Employee2.avsc”)
@trekkietchiet-T这些文件是在
src/main/java
中还是在某个包中?遵循maven的惯例,将非java文件放在
src/main/resources
中,它应该是Eclipse中的源文件夹。它们不在任何包中。它完全如图所示。但总的来说,最好的方法是什么?我们将把这些文件放在哪里?我还创建了另一个文件
config.properties
,并将其放在相同的位置。然后我做了类似的事情-
System.out.println(AvroExample.class.getResourceAsStream(“/config.properties”);System.out.println(AvroExample.class.getResourceAsStream(“/Employee.avsc”)java.io。BufferedInputStream@1160116
但第二个打印为null。@Trekkietheciet-T在
Maven
应用程序中,非java资源的常规位置是
src/main/resources
。把那些文件放在那里。你刚才发布的内容应该是告诉你有什么问题,或者文件名不匹配,或者它们实际上不在那里。这很奇怪。如果我正在创建一个具有不同名称的新文件,并将Employee.avsc文件中的确切内容复制到该新文件中,那么它可以正常工作。